#include <Log_Msg_IPC.h>
Inheritance diagram for ACE_Log_Msg_IPC:
Public Member Functions | |
ACE_Log_Msg_IPC (void) | |
Constructor. | |
virtual | ~ACE_Log_Msg_IPC (void) |
Destructor. | |
virtual int | open (const ACE_TCHAR *logger_key) |
Open a new connection. | |
virtual int | reset (void) |
virtual int | close (void) |
Close the backend completely. | |
virtual ssize_t | log (ACE_Log_Record &log_record) |
Private Attributes | |
ACE_LOG_MSG_IPC_STREAM | message_queue_ |
Implement an ACE_Log_Msg_Backend that logs to a remote logging process.
Definition at line 49 of file Log_Msg_IPC.h.
|
Constructor.
Definition at line 12 of file Log_Msg_IPC.cpp.
00013 { 00014 } |
|
Destructor.
Definition at line 16 of file Log_Msg_IPC.cpp. References close().
00017 { 00018 (void) this->close (); 00019 } |
|
Close the backend completely.
Implements ACE_Log_Msg_Backend. Definition at line 42 of file Log_Msg_IPC.cpp. References message_queue_. Referenced by reset(), and ~ACE_Log_Msg_IPC().
00043 { 00044 return this->message_queue_.close (); 00045 } |
|
Process a log record.
Implements ACE_Log_Msg_Backend. Definition at line 48 of file Log_Msg_IPC.cpp. References ACE_CDR_BYTE_ORDER, ACE_OutputCDR::begin(), message_queue_, ACE_Log_Record::msg_data_len(), ACE_Message_Block::rd_ptr(), ACE_OutputCDR::total_length(), ACE_CDR::ULong, and ACE_OutputCDR::wchar_maxbytes().
00049 { 00050 // Serialize the log record using a CDR stream, allocate enough 00051 // space for the complete <ACE_Log_Record>. 00052 size_t const max_payload_size = 00053 4 // type 00054 + 4 // pid 00055 + 12 // timestamp 00056 + 4 // process id 00057 + 4 // data length 00058 #if defined (ACE_USES_WCHAR) 00059 + (log_record.msg_data_len () * ACE_OutputCDR::wchar_maxbytes()) // message 00060 #else 00061 + log_record.msg_data_len () // message 00062 #endif 00063 + ACE_CDR::MAX_ALIGNMENT; // padding; 00064 00065 // Insert contents of <log_record> into payload stream. 00066 ACE_OutputCDR payload (max_payload_size); 00067 payload << log_record; 00068 00069 // Get the number of bytes used by the CDR stream. If it becomes desireable 00070 // to support payloads more than 4GB, this field will need to be changed 00071 // to a 64-bit value. 00072 ACE_CDR::ULong length = 00073 ACE_Utils::truncate_cast<ACE_CDR::ULong> (payload.total_length ()); 00074 00075 // Send a header so the receiver can determine the byte order and 00076 // size of the incoming CDR stream. 00077 ACE_OutputCDR header (ACE_CDR::MAX_ALIGNMENT + 8); 00078 header << ACE_OutputCDR::from_boolean (ACE_CDR_BYTE_ORDER); 00079 00080 // Store the size of the payload that follows 00081 header << ACE_CDR::ULong (length); 00082 00083 // Use an iovec to send both buffer and payload simultaneously. 00084 iovec iov[2]; 00085 iov[0].iov_base = header.begin ()->rd_ptr (); 00086 iov[0].iov_len = 8; 00087 iov[1].iov_base = payload.begin ()->rd_ptr (); 00088 iov[1].iov_len = length; 00089 00090 #if defined (ACE_HAS_STREAM_PIPES) 00091 // Use the <putpmsg> API if supported to ensure correct message 00092 // queueing according to priority. 00093 00094 ACE_Str_Buf header_msg (static_cast<void *> (header.begin ()->rd_ptr ()), 00095 static_cast<int> (8)); 00096 00097 ACE_Str_Buf payload_msg (static_cast<void *> (payload.begin ()->rd_ptr ()), 00098 static_cast<int> (length)); 00099 00100 return this->message_queue_.send (&header_msg, 00101 &payload_msg, 00102 static_cast<int> (log_record.priority ()), 00103 MSG_BAND); 00104 #else 00105 // We're running over sockets, so send header and payload 00106 // efficiently using "gather-write". 00107 return this->message_queue_.sendv_n (iov, 2); 00108 #endif /* ACE_HAS_STREAM_PIPES */ 00109 } |
|
Open a new connection.
Implements ACE_Log_Msg_Backend. Definition at line 22 of file Log_Msg_IPC.cpp. References ACE_LOG_MSG_IPC_ADDR, ACE_LOG_MSG_IPC_CONNECTOR, ACE_TCHAR, and ACE_SOCK_Connector::connect().
00023 { 00024 ACE_LOG_MSG_IPC_CONNECTOR con; 00025 return con.connect (this->message_queue_, 00026 ACE_LOG_MSG_IPC_ADDR (logger_key)); 00027 } |
|
Reset the backend. When changing the logging destination the backend may need to properly disconnect from the remote logging daemon and reclaim some local resources. But we try to reduce the number of local allocations/deallocations. Implements ACE_Log_Msg_Backend. Definition at line 30 of file Log_Msg_IPC.cpp. References close(), and message_queue_.
00031 { 00032 if (this->message_queue_.get_handle () != ACE_INVALID_HANDLE) 00033 { 00034 // If we don't do this, handles aren't reused on Win32 and the 00035 // server eventually crashes! 00036 return this->close (); 00037 } 00038 return 0; 00039 } |
|
Definition at line 73 of file Log_Msg_IPC.h. |