TAO_Synch_Queued_Message Class Reference

Specialize TAO_Queued_Message for synchronous requests, i.e. twoways and oneways sent with reliability better than SYNC_NONE. More...

#include <Synch_Queued_Message.h>

Inheritance diagram for TAO_Synch_Queued_Message:

Inheritance graph
[legend]
Collaboration diagram for TAO_Synch_Queued_Message:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_Synch_Queued_Message (const ACE_Message_Block *contents, TAO_ORB_Core *oc, ACE_Allocator *alloc=0, bool is_heap_allocated=false)
 Constructor.

virtual ~TAO_Synch_Queued_Message (void)
 Destructor.

const ACE_Message_Blockcurrent_block (void) const
Implement the Template Methods from TAO_Queued_Message
virtual size_t message_length (void) const
 Return the length of the message.

virtual int all_data_sent (void) const
 Return 1 if all the data has been sent.

virtual void fill_iov (int iovcnt_max, int &iovcnt, iovec iov[]) const
 Fill up an io vector using the connects of the message.

virtual void bytes_transferred (size_t &byte_count)
 Update the internal state, data has been sent.

virtual TAO_Queued_Messageclone (ACE_Allocator *alloc)
 Clone this element.

virtual void destroy (void)
 Reclaim resources.


Private Attributes

ACE_Message_Blockcontents_
 The contents of the message.

ACE_Message_Blockcurrent_block_
 The current message block.


Detailed Description

Specialize TAO_Queued_Message for synchronous requests, i.e. twoways and oneways sent with reliability better than SYNC_NONE.

Reliable requests block the sending thread until the message is sent, likewise, the sending thread must be informed if the connection is closed or the message times out.

In contrast oneway (and AMI) requests sent with the SYNC_NONE policy are simple discarded if the connection fails or they timeout.

Another important difference is the management of the data buffer: one SYNC_NONE messages the buffer is immediately copied into a newly allocated buffer, and must be deallocated. Other types of requests use the memory allocated by the sending thread.

Definition at line 47 of file Synch_Queued_Message.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_Synch_Queued_Message::TAO_Synch_Queued_Message const ACE_Message_Block contents,
TAO_ORB_Core oc,
ACE_Allocator alloc = 0,
bool  is_heap_allocated = false
 

Constructor.

Parameters:
contents The message block chain that must be sent.
alloc The allocator that is used to allocate objects of this type.

Definition at line 16 of file Synch_Queued_Message.cpp.

Referenced by clone().

00021   : TAO_Queued_Message (oc, alloc, is_heap_allocated)
00022   , contents_ (const_cast<ACE_Message_Block*> (contents))
00023   , current_block_ (contents_)
00024 {
00025 }

TAO_Synch_Queued_Message::~TAO_Synch_Queued_Message void   )  [virtual]
 

Destructor.

Definition at line 27 of file Synch_Queued_Message.cpp.

00028 {
00029 
00030 }


Member Function Documentation

int TAO_Synch_Queued_Message::all_data_sent void   )  const [virtual]
 

Return 1 if all the data has been sent.

Implements TAO_Queued_Message.

Definition at line 50 of file Synch_Queued_Message.cpp.

References current_block_.

Referenced by TAO_Transport::send_synch_message_helper_i().

00051 {
00052   return this->current_block_ == 0;
00053 }

void TAO_Synch_Queued_Message::bytes_transferred size_t &  byte_count  )  [virtual]
 

Update the internal state, data has been sent.

After the TAO_Transport class completes a successful (or partially successful) I/O operation it must update the state of all the messages queued. This callback method is used by each message to update its state and determine if all the data has been sent already.

Parameters:
byte_count The number of bytes succesfully sent. The TAO_Queued_Message should decrement this value by the number of bytes that must still be sent.
Returns:
Returns 1 if the TAO_Queued_Message has any more data to send.

Implements TAO_Queued_Message.

Definition at line 82 of file Synch_Queued_Message.cpp.

References ACE_Message_Block::cont(), current_block_, ACE_Message_Block::length(), ACE_Message_Block::rd_ptr(), TAO_LF_Event::state_changed(), and TAO_LF_Invocation_Event::state_changed_i().

00083 {
00084   this->state_changed_i (TAO_LF_Event::LFS_ACTIVE);
00085 
00086   while (this->current_block_ != 0 && byte_count > 0)
00087     {
00088       size_t const l = this->current_block_->length ();
00089 
00090       if (byte_count < l)
00091         {
00092           this->current_block_->rd_ptr (byte_count);
00093           byte_count = 0;
00094           return;
00095         }
00096 
00097       byte_count -= l;
00098       this->current_block_->rd_ptr (l);
00099       this->current_block_ = this->current_block_->cont ();
00100 
00101       while (this->current_block_ != 0
00102              && this->current_block_->length () == 0)
00103         {
00104           this->current_block_ = this->current_block_->cont ();
00105         }
00106     }
00107 
00108   if (this->current_block_ == 0)
00109     this->state_changed (TAO_LF_Event::LFS_SUCCESS,
00110                          this->orb_core_->leader_follower ());
00111 }

TAO_Queued_Message * TAO_Synch_Queued_Message::clone ACE_Allocator alloc  )  [virtual]
 

Clone this element.

Implements TAO_Queued_Message.

Definition at line 114 of file Synch_Queued_Message.cpp.

References ACE_DEBUG, ACE_NEW_MALLOC_RETURN, ACE_NEW_RETURN, ACE_Message_Block::clone(), current_block_, TAO_Queued_Message::is_heap_created_, LM_DEBUG, ACE_Allocator::malloc(), TAO_debug_level, and TAO_Synch_Queued_Message().

Referenced by TAO_Transport::send_reply_message_i().

00115 {
00116   TAO_Synch_Queued_Message *qm = 0;
00117 
00118   // Clone the message block.
00119   // NOTE: We wantedly do the cloning from <current_block_> instead of
00120   // starting from <contents_> since we dont want to clone blocks that
00121   // have already been sent on the wire. Waste of memory and
00122   // associated copying.
00123   ACE_Message_Block *mb = this->current_block_->clone ();
00124 
00125   if (alloc)
00126     {
00127       ACE_NEW_MALLOC_RETURN (qm,
00128                              static_cast<TAO_Synch_Queued_Message *> (
00129                                alloc->malloc (sizeof (TAO_Synch_Queued_Message))),
00130                              TAO_Synch_Queued_Message (mb,
00131                                                        this->orb_core_,
00132                                                        alloc),
00133                              0);
00134     }
00135   else
00136     {
00137       // No allocator, so use the common heap!
00138       if (TAO_debug_level == 4)
00139         {
00140           // This debug is for testing purposes!
00141           ACE_DEBUG ((LM_DEBUG,
00142                       "TAO (%P|%t) - Synch_Queued_Message::clone\n"
00143                       "Using global pool for allocation \n"));
00144         }
00145 
00146       ACE_NEW_RETURN (qm,
00147                       TAO_Synch_Queued_Message (mb, this->orb_core_),
00148                       0);
00149     }
00150 
00151   // Set the flag to indicate that <qm> is created on the heap.
00152   if (qm)
00153     {
00154       qm->is_heap_created_ = true;
00155     }
00156 
00157   return qm;
00158 }

const ACE_Message_Block * TAO_Synch_Queued_Message::current_block void   )  const
 

Definition at line 33 of file Synch_Queued_Message.cpp.

References current_block_.

Referenced by TAO_Transport::send_synchronous_message_i().

00034 {
00035   return this->current_block_;
00036 }

void TAO_Synch_Queued_Message::destroy void   )  [virtual]
 

Reclaim resources.

Reliable messages are allocated from the stack, thus they do not be deallocated. Asynchronous (SYNC_NONE) messages are allocated from the heap (or a pool), they need to be reclaimed explicitly.

Implements TAO_Queued_Message.

Definition at line 161 of file Synch_Queued_Message.cpp.

References ACE_DES_FREE, current_block_, and ACE_Message_Block::release().

00162 {
00163   if (this->is_heap_created_)
00164     {
00165       ACE_Message_Block::release (this->contents_);
00166       this->current_block_ = 0;
00167 
00168       // If we have an allocator release the memory to the allocator
00169       // pool.
00170       if (this->allocator_)
00171         {
00172           ACE_DES_FREE (this,
00173                         this->allocator_->free,
00174                         TAO_Synch_Queued_Message);
00175 
00176         }
00177       else // global release..
00178         {
00179           delete this;
00180         }
00181     }
00182 }

void TAO_Synch_Queued_Message::fill_iov int  iovcnt_max,
int &  iovcnt,
iovec  iov[]
const [virtual]
 

Fill up an io vector using the connects of the message.

Different versions of this class represent the message using either a single buffer, or a message block. This method allows a derived class to fill up the contents of an io vector, the TAO_Transport class uses this method to group as many messages as possible in an iovector before sending them to the OS I/O subsystem.

Parameters:
iovcnt_max The number of elements in iov
iovcnt The number of elements already used by iov, this method should update this counter
iov The io vector

Implements TAO_Queued_Message.

Definition at line 56 of file Synch_Queued_Message.cpp.

References ACE_ASSERT, ACE_Message_Block::cont(), current_block_, iovec::iov_base, iovec::iov_len, ACE_Message_Block::length(), and ACE_Message_Block::rd_ptr().

00059 {
00060   ACE_ASSERT (iovcnt_max > iovcnt);
00061 
00062   for (const ACE_Message_Block *message_block = this->current_block_;
00063        message_block != 0 && iovcnt < iovcnt_max;
00064        message_block = message_block->cont ())
00065     {
00066       size_t const message_block_length = message_block->length ();
00067 
00068       // Check if this block has any data to be sent.
00069       if (message_block_length > 0)
00070         {
00071               // Collect the data in the iovec.
00072           iov[iovcnt].iov_base = message_block->rd_ptr ();
00073           iov[iovcnt].iov_len  = static_cast<u_long> (message_block_length);
00074 
00075           // Increment iovec counter.
00076           ++iovcnt;
00077         }
00078     }
00079 }

size_t TAO_Synch_Queued_Message::message_length void   )  const [virtual]
 

Return the length of the message.

If the message has been partially sent it returns the number of bytes that are still not sent.

Implements TAO_Queued_Message.

Definition at line 39 of file Synch_Queued_Message.cpp.

References current_block_, and ACE_Message_Block::total_length().

Referenced by TAO_Transport::send_message_block_chain_i().

00040 {
00041   if (this->current_block_ == 0)
00042     {
00043       return 0;
00044     }
00045 
00046   return this->current_block_->total_length ();
00047 }


Member Data Documentation

ACE_Message_Block* TAO_Synch_Queued_Message::contents_ [private]
 

The contents of the message.

The message is normally generated by a TAO_OutputCDR stream. The application marshals the payload, possibly generating a chain of message block connected via the 'cont()' field.

Definition at line 85 of file Synch_Queued_Message.h.

ACE_Message_Block* TAO_Synch_Queued_Message::current_block_ [private]
 

The current message block.

The message may be set in multiple writev() operations. This point keeps track of the next message to send out.

Definition at line 92 of file Synch_Queued_Message.h.

Referenced by all_data_sent(), bytes_transferred(), clone(), current_block(), destroy(), fill_iov(), and message_length().


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 12:23:47 2006 for TAO by doxygen 1.3.6