ACE_Log_Msg_IPC Class Reference

Defines the interfaces for ACE_Log_Msg backend. More...

#include <Log_Msg_IPC.h>

Inheritance diagram for ACE_Log_Msg_IPC:

Inheritance graph
[legend]
Collaboration diagram for ACE_Log_Msg_IPC:

Collaboration graph
[legend]
List of all members.

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_

Detailed Description

Defines the interfaces for ACE_Log_Msg backend.

Implement an ACE_Log_Msg_Backend that logs to a remote logging process.

Definition at line 49 of file Log_Msg_IPC.h.


Constructor & Destructor Documentation

ACE_BEGIN_VERSIONED_NAMESPACE_DECL ACE_Log_Msg_IPC::ACE_Log_Msg_IPC ( void   ) 

Constructor.

Definition at line 12 of file Log_Msg_IPC.cpp.

00013 {
00014 }

ACE_Log_Msg_IPC::~ACE_Log_Msg_IPC ( void   )  [virtual]

Destructor.

Definition at line 16 of file Log_Msg_IPC.cpp.

00017 {
00018   (void) this->close ();
00019 }


Member Function Documentation

int ACE_Log_Msg_IPC::close ( void   )  [virtual]

Close the backend completely.

Implements ACE_Log_Msg_Backend.

Definition at line 42 of file Log_Msg_IPC.cpp.

References message_queue_.

00043 {
00044   return this->message_queue_.close ();
00045 }

ssize_t ACE_Log_Msg_IPC::log ( ACE_Log_Record log_record  )  [virtual]

Process a log record.

Parameters:
log_record The ACE_Log_Record to process.
Return values:
-1 for failure; else it is customarily the number of bytes processed, but can also be 0 to signify success.

Implements ACE_Log_Msg_Backend.

Definition at line 48 of file Log_Msg_IPC.cpp.

References ACE_CDR_BYTE_ORDER, ACE_OutputCDR::begin(), ACE_CDR::MAX_ALIGNMENT, message_queue_, ACE_Log_Record::msg_data_len(), ACE_Message_Block::rd_ptr(), ACE_OutputCDR::total_length(), 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 }

int ACE_Log_Msg_IPC::open ( const ACE_TCHAR logger_key  )  [virtual]

Open a new connection.

Implements ACE_Log_Msg_Backend.

Definition at line 22 of file Log_Msg_IPC.cpp.

References 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 }

int ACE_Log_Msg_IPC::reset ( void   )  [virtual]

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.

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 }


Member Data Documentation

ACE_LOG_MSG_IPC_STREAM ACE_Log_Msg_IPC::message_queue_ [private]

Definition at line 73 of file Log_Msg_IPC.h.

Referenced by close(), and log().


The documentation for this class was generated from the following files:
Generated on Tue Feb 2 17:35:15 2010 for ACE by  doxygen 1.4.7