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.
|
|
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_Message * | next (void) const |
| Set/get the next element in the list.
|
TAO_Queued_Message * | prev (void) const |
| Set/get the previous element in the list.
|
void | remove_from_list (TAO_Queued_Message *&head, TAO_Queued_Message *&tail) |
| Remove this element from the list.
|
void | push_back (TAO_Queued_Message *&head, TAO_Queued_Message *&tail) |
| Insert the current element at the tail of the queue.
|
void | push_front (TAO_Queued_Message *&head, TAO_Queued_Message *&tail) |
| Insert the current element at the head of the queue.
|
|
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_Message * | clone (ACE_Allocator *allocator)=0 |
| Clone this element.
|
virtual void | destroy (void)=0 |
| Reclaim resources.
|
virtual bool | is_expired (const ACE_Time_Value &now) const |
| Check for timeout.
|
virtual void | copy_if_necessary (const ACE_Message_Block *chain)=0 |
| Provide a hook for copying the underlying data.
|
| TAO_LF_Invocation_Event (void) |
| Constructor.
|
virtual | ~TAO_LF_Invocation_Event (void) |
| Destructor.
|
int | successful (void) const |
int | error_detected (void) const |
| TAO_LF_Event (void) |
| Constructor.
|
virtual | ~TAO_LF_Event (void) |
| Destructor.
|
virtual int | bind (TAO_LF_Follower *follower) |
| Bind a follower.
|
virtual int | unbind (TAO_LF_Follower *follower) |
| Unbind the follower.
|
void | reset_state (int new_state) |
| Reset the state, irrespective of the previous states.
|
void | state_changed (int new_state, TAO_Leader_Follower &lf) |
int | keep_waiting (void) |
| Check if we should keep waiting.
|
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?