#include <Synch_Queued_Message.h>
Inheritance diagram for TAO_Synch_Queued_Message:
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_Block * | current_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_Message * | clone (ACE_Allocator *alloc) |
Clone this element. | |
virtual void | destroy (void) |
Reclaim resources. | |
Private Attributes | |
ACE_Message_Block * | contents_ |
The contents of the message. | |
ACE_Message_Block * | current_block_ |
The current message block. |
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.
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.
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.
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] |
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.
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. |
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(), TAO_LF_Event::LFS_ACTIVE, TAO_LF_Event::LFS_SUCCESS, 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_NEW_MALLOC_RETURN, ACE_NEW_RETURN, ACE_Message_Block::clone(), current_block_, and ACE_Allocator::malloc().
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 true), 00134 0); 00135 } 00136 else 00137 { 00138 ACE_NEW_RETURN (qm, 00139 TAO_Synch_Queued_Message (mb, this->orb_core_, 0, true), 00140 0); 00141 } 00142 00143 return qm; 00144 }
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_.
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 147 of file Synch_Queued_Message.cpp.
References ACE_DES_FREE, current_block_, and ACE_Message_Block::release().
00148 { 00149 if (this->is_heap_created_) 00150 { 00151 ACE_Message_Block::release (this->contents_); 00152 this->current_block_ = 0; 00153 00154 // If we have an allocator release the memory to the allocator 00155 // pool. 00156 if (this->allocator_) 00157 { 00158 ACE_DES_FREE (this, 00159 this->allocator_->free, 00160 TAO_Synch_Queued_Message); 00161 00162 } 00163 else // global release.. 00164 { 00165 delete this; 00166 } 00167 } 00168 }
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.
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.
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(), and TAO_Transport::send_synchronous_message_i().
00040 { 00041 if (this->current_block_ == 0) 00042 { 00043 return 0; 00044 } 00045 00046 return this->current_block_->total_length (); 00047 }
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.
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(), and message_length().