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 int 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 11 of file Log_Msg_IPC.cpp.

00012 {
00013 }

ACE_Log_Msg_IPC::~ACE_Log_Msg_IPC void   )  [virtual]
 

Destructor.

Definition at line 15 of file Log_Msg_IPC.cpp.

References close().

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


Member Function Documentation

int ACE_Log_Msg_IPC::close void   )  [virtual]
 

Close the backend completely.

Implements ACE_Log_Msg_Backend.

Definition at line 41 of file Log_Msg_IPC.cpp.

References message_queue_.

Referenced by reset(), and ~ACE_Log_Msg_IPC().

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

int ACE_Log_Msg_IPC::log ACE_Log_Record log_record  )  [virtual]
 

Backend routine. This is called when we want to log a message. Since this routine is pure virtual, it must be overwritten by the subclass.

Implements ACE_Log_Msg_Backend.

Definition at line 47 of file Log_Msg_IPC.cpp.

References ACE_CDR_BYTE_ORDER, ACE_OutputCDR::begin(), iovec::iov_base, iovec::iov_len, message_queue_, ACE_Message_Block::rd_ptr(), ACE_OutputCDR::total_length(), and ACE_CDR::ULong.

00048 {
00049   // Serialize the log record using a CDR stream, allocate enough
00050   // space for the complete <ACE_Log_Record>.
00051   const size_t max_payload_size =
00052     4 // type()
00053     + 8 // timestamp
00054     + 4 // process id
00055     + 4 // data length
00056     + ACE_Log_Record::MAXLOGMSGLEN // data
00057     + ACE_CDR::MAX_ALIGNMENT; // padding;
00058 
00059   // Insert contents of <log_record> into payload stream.
00060   ACE_OutputCDR payload (max_payload_size);
00061   payload << log_record;
00062 
00063   // Get the number of bytes used by the CDR stream.
00064   ACE_CDR::ULong length = payload.total_length ();
00065 
00066   // Send a header so the receiver can determine the byte order and
00067   // size of the incoming CDR stream.
00068   ACE_OutputCDR header (ACE_CDR::MAX_ALIGNMENT + 8);
00069   header << ACE_OutputCDR::from_boolean (ACE_CDR_BYTE_ORDER);
00070 
00071   // Store the size of the payload that follows
00072   header << ACE_CDR::ULong (length);
00073 
00074   // Use an iovec to send both buffer and payload simultaneously.
00075   iovec iov[2];
00076   iov[0].iov_base = header.begin ()->rd_ptr ();
00077   iov[0].iov_len  = 8;
00078   iov[1].iov_base = payload.begin ()->rd_ptr ();
00079   iov[1].iov_len  = length;
00080 
00081 #if defined (ACE_HAS_STREAM_PIPES)
00082   // Use the <putpmsg> API if supported to ensure correct message
00083   // queueing according to priority.
00084 
00085   ACE_Str_Buf header_msg (static_cast<void *> (header.begin ()->rd_ptr ()),
00086                           static_cast<int> (8));
00087 
00088   ACE_Str_Buf payload_msg (static_cast<void *> (payload.begin ()->rd_ptr ()),
00089                            static_cast<int> (length));
00090 
00091   return this->message_queue_.send (&header_msg,
00092                                     &payload_msg,
00093                                     static_cast<int> (log_record.priority ()),
00094                                     MSG_BAND);
00095 #else
00096   // We're running over sockets, so send header and payload
00097   // efficiently using "gather-write".
00098   return this->message_queue_.sendv_n (iov, 2);
00099 #endif /* ACE_HAS_STREAM_PIPES */
00100 }

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

Open a new connection.

Implements ACE_Log_Msg_Backend.

Definition at line 21 of file Log_Msg_IPC.cpp.

References ACE_LOG_MSG_IPC_ADDR, ACE_LOG_MSG_IPC_CONNECTOR, ACE_TCHAR, and ACE_SOCK_Connector::connect().

00022 {
00023   ACE_LOG_MSG_IPC_CONNECTOR con;
00024   return con.connect (this->message_queue_,
00025                       ACE_LOG_MSG_IPC_ADDR (logger_key));
00026 }

int ACE_Log_Msg_IPC::reset void   )  [virtual]
 

Implements ACE_Log_Msg_Backend.

Definition at line 29 of file Log_Msg_IPC.cpp.

References close(), and message_queue_.

00030 {
00031   if (this->message_queue_.get_handle () != ACE_INVALID_HANDLE)
00032     {
00033       // If we don't do this, handles aren't reused on Win32 and the
00034       // server eventually crashes!
00035       return this->close ();
00036     }
00037   return 0;
00038 }


Member Data Documentation

ACE_LOG_MSG_IPC_STREAM ACE_Log_Msg_IPC::message_queue_ [private]
 

Definition at line 65 of file Log_Msg_IPC.h.

Referenced by close(), log(), and reset().


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 11:24:03 2006 for ACE by doxygen 1.3.6