TAO_Queued_Message Class Reference

Represent messages queued in the outgoing data path of the TAO_Transport class. More...

#include <Queued_Message.h>

Inheritance diagram for TAO_Queued_Message:

Inheritance graph
[legend]
Collaboration diagram for TAO_Queued_Message:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_Queued_Message (TAO_ORB_Core *oc, ACE_Allocator *alloc=0, bool is_heap_allocated=false)
 Constructor.

virtual ~TAO_Queued_Message (void)
 Destructor.

Intrusive list manipulation
The messages are put in a doubled linked list (for easy insertion and removal). To minimize memory allocations the list is intrusive, i.e. each element in the list contains the pointers for the next and previous element.

The following methods are used to manipulate this implicit list.

Todo:
We should implement this as a base template, something like: template<class T> Intrusive_Node { public: void next (T *); T* next () const; private: T* next_; }; and use it as follows: class TAO_Queued_Message : public Intrusive_Node<TAO_Queued_Message> { };


virtual TAO_Queued_Messagenext (void) const
 Set/get the next element in the list.

virtual TAO_Queued_Messageprev (void) const
 Set/get the previous element in the list.

virtual void remove_from_list (TAO_Queued_Message *&head, TAO_Queued_Message *&tail)
 Remove this element from the list.

virtual void push_back (TAO_Queued_Message *&head, TAO_Queued_Message *&tail)
 Insert the current element at the tail of the queue.

virtual void push_front (TAO_Queued_Message *&head, TAO_Queued_Message *&tail)
 Insert the current element at the head of the queue.

Template Methods
virtual size_t message_length (void) const=0
 Return the length of the message.

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

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

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

virtual TAO_Queued_Messageclone (ACE_Allocator *allocator)=0
 Clone this element.

virtual void destroy (void)=0
 Reclaim resources.


Protected Attributes

ACE_Allocatorallocator_
bool is_heap_created_
TAO_ORB_Coreorb_core_
 Cached copy of ORB_Core pointer.


Private Attributes

TAO_Queued_Messagenext_
 Implement an intrusive double-linked list for the message queue.

TAO_Queued_Messageprev_

Detailed Description

Represent messages queued in the outgoing data path of the TAO_Transport class.

Please read the documentation in the TAO_Transport class to find out more about the design of the outgoing data path.

In some configurations TAO needs to maintain a per-connection queue of outgoing messages. This queue is drained by the pluggable protocols framework, normally under control of the ACE_Reactor, but other configurations are conceivable. The elements in the queue may be removed early, for example, because the application can specify timeouts for each message, or because the underlying connection is broken.

In many cases the message corresponds to some application request, the application may be blocked waiting for the request to be sent, even more importantlyl, the ORB can be configured to use the Leader/Followers strategy, in which case one of the waiting threads can be required to wake up before its message completes each message may contain a 'Sent_Notifier'

NOTE:

The contents of the ACE_Message_Block may have been allocated from TSS storage, in that case we cannot steal them. However, we do not need to perform a deep copy all the time, for example, in a twoway request the sending thread blocks until the data goes out. The queued message can borrow the memory as it will be deallocated by the sending thread when it finishes. Oneways and asynchronous calls are another story.

Todo:
Change the ORB to allocate oneway and AMI buffer from global memory, to avoid the data copy in this path. What happens if the there is no queueing? Can we check that before allocating the memory?

Definition at line 74 of file Queued_Message.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_Queued_Message::TAO_Queued_Message TAO_ORB_Core oc,
ACE_Allocator alloc = 0,
bool  is_heap_allocated = false
 

Constructor.

Definition at line 12 of file Queued_Message.cpp.

00015   : allocator_ (alloc)
00016   , is_heap_created_ (is_heap_allocated)
00017   , orb_core_ (oc)
00018   , next_ (0)
00019   , prev_ (0)
00020 {
00021 }

TAO_Queued_Message::~TAO_Queued_Message void   )  [virtual]
 

Destructor.

Definition at line 23 of file Queued_Message.cpp.

00024 {
00025 }


Member Function Documentation

virtual int TAO_Queued_Message::all_data_sent void   )  const [pure virtual]
 

Return 1 if all the data has been sent.

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

Referenced by TAO_Transport::cleanup_queue(), TAO_Reactive_Flushing_Strategy::flush_message(), and TAO_Block_Flushing_Strategy::flush_message().

virtual void TAO_Queued_Message::bytes_transferred size_t &  byte_count  )  [pure 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.

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

Referenced by TAO_Transport::cleanup_queue().

virtual TAO_Queued_Message* TAO_Queued_Message::clone ACE_Allocator allocator  )  [pure virtual]
 

Clone this element.

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

virtual void TAO_Queued_Message::destroy void   )  [pure 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.

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

Referenced by TAO_Transport::cleanup_queue(), TAO_Transport::cleanup_queue_i(), and TAO_Transport::send_reply_message_i().

virtual void TAO_Queued_Message::fill_iov int  iovcnt_max,
int &  iovcnt,
iovec  iov[]
const [pure 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

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

Referenced by TAO_Transport::drain_queue_i().

virtual size_t TAO_Queued_Message::message_length void   )  const [pure 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.

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

Referenced by TAO_Transport::check_buffering_constraints_i(), and TAO_Transport::cleanup_queue().

TAO_Queued_Message * TAO_Queued_Message::next void   )  const [virtual]
 

Set/get the next element in the list.

Definition at line 28 of file Queued_Message.cpp.

Referenced by TAO_Transport::check_buffering_constraints_i(), and TAO_Transport::drain_queue_i().

00029 {
00030   return this->next_;
00031 }

TAO_Queued_Message * TAO_Queued_Message::prev void   )  const [virtual]
 

Set/get the previous element in the list.

Definition at line 34 of file Queued_Message.cpp.

00035 {
00036   return this->prev_;
00037 }

void TAO_Queued_Message::push_back TAO_Queued_Message *&  head,
TAO_Queued_Message *&  tail
[virtual]
 

Insert the current element at the tail of the queue.

Definition at line 66 of file Queued_Message.cpp.

References next_.

Referenced by TAO_Transport::queue_message_i(), TAO_Transport::send_message_block_chain_i(), TAO_Transport::send_reply_message_i(), and TAO_Transport::send_synchronous_message_i().

00068 {
00069   if (tail == 0)
00070     {
00071       tail = this;
00072       head = this;
00073       this->next_ = 0;
00074       this->prev_ = 0;
00075     }
00076   else
00077     {
00078       tail->next_ = this;
00079       this->prev_ = tail;
00080       this->next_ = 0;
00081       tail = this;
00082     }
00083 }

void TAO_Queued_Message::push_front TAO_Queued_Message *&  head,
TAO_Queued_Message *&  tail
[virtual]
 

Insert the current element at the head of the queue.

Definition at line 86 of file Queued_Message.cpp.

References prev_.

Referenced by TAO_Transport::send_synchronous_message_i().

00088 {
00089   if (head == 0)
00090     {
00091       tail = this;
00092       head = this;
00093       this->next_ = 0;
00094       this->prev_ = 0;
00095     }
00096   else
00097     {
00098       head->prev_ = this;
00099       this->next_ = head;
00100       this->prev_ = 0;
00101       head = this;
00102     }
00103 }

void TAO_Queued_Message::remove_from_list TAO_Queued_Message *&  head,
TAO_Queued_Message *&  tail
[virtual]
 

Remove this element from the list.

Definition at line 40 of file Queued_Message.cpp.

References next_, and prev_.

Referenced by TAO_Transport::cleanup_queue(), TAO_Transport::cleanup_queue_i(), TAO_Transport::send_message_block_chain_i(), TAO_Transport::send_reply_message_i(), TAO_Transport::send_synch_message_helper_i(), and TAO_Transport::send_synchronous_message_i().

00042 {
00043   if (this->prev_ != 0)
00044     {
00045       this->prev_->next_ = this->next_;
00046     }
00047   else if(head == this)
00048     {
00049       head = this->next_;
00050     }
00051 
00052   if (this->next_ != 0)
00053     {
00054       this->next_->prev_ = this->prev_;
00055     }
00056   else if(tail == this)
00057     {
00058       tail = this->prev_;
00059     }
00060 
00061   this->next_ = 0;
00062   this->prev_ = 0;
00063 }


Member Data Documentation

ACE_Allocator* TAO_Queued_Message::allocator_ [protected]
 

Definition at line 204 of file Queued_Message.h.

bool TAO_Queued_Message::is_heap_created_ [protected]
 

Definition at line 210 of file Queued_Message.h.

Referenced by TAO_Synch_Queued_Message::clone(), and TAO_Asynch_Queued_Message::clone().

TAO_Queued_Message* TAO_Queued_Message::next_ [private]
 

Implement an intrusive double-linked list for the message queue.

Definition at line 217 of file Queued_Message.h.

Referenced by push_back(), and remove_from_list().

TAO_ORB_Core* TAO_Queued_Message::orb_core_ [protected]
 

Cached copy of ORB_Core pointer.

Definition at line 213 of file Queued_Message.h.

TAO_Queued_Message* TAO_Queued_Message::prev_ [private]
 

Definition at line 218 of file Queued_Message.h.

Referenced by push_front(), and remove_from_list().


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