TAO  2.2.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Protected Attributes | Private Attributes | List of all members
TAO_Queued_Message Class Referenceabstract

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
Collaboration diagram for TAO_Queued_Message:
Collaboration graph

Public Member Functions

 TAO_Queued_Message (TAO_ORB_Core *oc, ACE_Allocator *alloc=0, bool is_heap_allocated=false)
 Constructor. More...
 
virtual ~TAO_Queued_Message (void)
 Destructor. More...
 
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>
{
};
TAO_Queued_Messagenext (void) const
 Set/get the next element in the list. More...
 
TAO_Queued_Messageprev (void) const
 Set/get the previous element in the list. More...
 
void remove_from_list (TAO_Queued_Message *&head, TAO_Queued_Message *&tail)
 Remove this element from the list. More...
 
void push_back (TAO_Queued_Message *&head, TAO_Queued_Message *&tail)
 Insert the current element at the tail of the queue. More...
 
void push_front (TAO_Queued_Message *&head, TAO_Queued_Message *&tail)
 Insert the current element at the head of the queue. More...
 
Template Methods
virtual size_t message_length (void) const =0
 Return the length of the message. More...
 
virtual int all_data_sent (void) const =0
 Return 1 if all the data has been sent. More...
 
virtual void fill_iov (int iovcnt_max, int &iovcnt, iovec iov[]) const =0
 Fill up an io vector using the connects of the message. More...
 
virtual void bytes_transferred (size_t &byte_count)=0
 Update the internal state, data has been sent. More...
 
virtual TAO_Queued_Messageclone (ACE_Allocator *allocator)=0
 Clone this element. More...
 
virtual void destroy (void)=0
 Reclaim resources. More...
 
virtual bool is_expired (const ACE_Time_Value &now) const
 Check for timeout. More...
 
virtual void copy_if_necessary (const ACE_Message_Block *chain)=0
 Provide a hook for copying the underlying data. More...
 
- Public Member Functions inherited from TAO_LF_Invocation_Event
 TAO_LF_Invocation_Event (void)
 Constructor. More...
 
virtual ~TAO_LF_Invocation_Event (void)
 Destructor. More...
 
int successful (void) const
 
int error_detected (void) const
 
- Public Member Functions inherited from TAO_LF_Event
 TAO_LF_Event (void)
 Constructor. More...
 
virtual ~TAO_LF_Event (void)
 Destructor. More...
 
virtual int bind (TAO_LF_Follower *follower)
 Bind a follower. More...
 
virtual int unbind (TAO_LF_Follower *follower)
 Unbind the follower. More...
 
void reset_state (int new_state)
 Reset the state, irrespective of the previous states. More...
 
void state_changed (int new_state, TAO_Leader_Follower &lf)
 
int keep_waiting (void)
 Check if we should keep waiting. More...
 

Protected Attributes

ACE_Allocatorallocator_
 
bool const is_heap_created_
 
TAO_ORB_Coreorb_core_
 Cached copy of ORB_Core pointer. More...
 
- Protected Attributes inherited from TAO_LF_Event
int state_
 The current state. More...
 
TAO_LF_Followerfollower_
 The bounded follower. More...
 

Private Attributes

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

Additional Inherited Members

- Public Types inherited from TAO_LF_Event
enum  {
  LFS_IDLE = 0, LFS_ACTIVE, LFS_CONNECTION_WAIT, LFS_SUCCESS,
  LFS_FAILURE, LFS_TIMEOUT, LFS_CONNECTION_CLOSED
}
 
- Static Public Member Functions inherited from TAO_LF_Event
static const char * state_name (int st)
 
- Protected Member Functions inherited from TAO_LF_Invocation_Event
virtual void state_changed_i (int new_state)
 Validate and perform the state change. More...
 

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 importantly, 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?

Constructor & Destructor Documentation

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

Constructor.

TAO_Queued_Message::~TAO_Queued_Message ( void  )
virtual

Destructor.

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.

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_countThe number of bytes successfully 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.

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::copy_if_necessary ( const ACE_Message_Block chain)
pure virtual

Provide a hook for copying the underlying data.

Parameters
chainFor use in determining origin of underlying data. This parameter must not be modified (through const_cast).

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.

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_maxThe number of elements in iov
iovcntThe number of elements already used by iov, this method should update this counter
iovThe io vector

Implemented in TAO_Asynch_Queued_Message, and TAO_Synch_Queued_Message.

bool TAO_Queued_Message::is_expired ( const ACE_Time_Value now) const
virtual

Check for timeout.

Parameters
nowPass in the current time using ACE_High_Res_Timer::gettimeofday_hr(). This is a parameter in order to avoid calling gettimeofday_hr() inside of this method (which will be called in a tight loop).
Returns
true if the relative roundtrip timeout has expired.

Reimplemented in TAO_Asynch_Queued_Message.

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.

TAO_Queued_Message * TAO_Queued_Message::next ( void  ) const

Set/get the next element in the list.

TAO_Queued_Message * TAO_Queued_Message::prev ( void  ) const

Set/get the previous element in the list.

void TAO_Queued_Message::push_back ( TAO_Queued_Message *&  head,
TAO_Queued_Message *&  tail 
)

Insert the current element at the tail of the queue.

void TAO_Queued_Message::push_front ( TAO_Queued_Message *&  head,
TAO_Queued_Message *&  tail 
)

Insert the current element at the head of the queue.

void TAO_Queued_Message::remove_from_list ( TAO_Queued_Message *&  head,
TAO_Queued_Message *&  tail 
)

Remove this element from the list.

Member Data Documentation

ACE_Allocator* TAO_Queued_Message::allocator_
protected
bool const TAO_Queued_Message::is_heap_created_
protected
TAO_Queued_Message* TAO_Queued_Message::next_
private

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

TAO_ORB_Core* TAO_Queued_Message::orb_core_
protected

Cached copy of ORB_Core pointer.

TAO_Queued_Message* TAO_Queued_Message::prev_
private

The documentation for this class was generated from the following files: