summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ace/Message_Queue.cpp6
-rw-r--r--ace/Message_Queue.h11
-rw-r--r--ace/Message_Queue.i16
3 files changed, 29 insertions, 4 deletions
diff --git a/ace/Message_Queue.cpp b/ace/Message_Queue.cpp
index 445028cfd10..574f3d5f6e8 100644
--- a/ace/Message_Queue.cpp
+++ b/ace/Message_Queue.cpp
@@ -311,7 +311,11 @@ ACE_Message_Queue_NT::enqueue (ACE_Message_Block *new_item,
ACE_GUARD_RETURN (ACE_Thread_Mutex, ace_mon, this->lock_, -1);
if (!this->deactivated_)
{
- size_t msize = new_item->size ();
+ size_t msize = 0;
+ for (ACE_Message_Block *temp = new_item;
+ temp != 0;
+ temp = temp->cont ())
+ msize += temp->size ();
if (::PostQueuedCompletionStatus (this->completion_port_,
msize,
this->deactivated_,
diff --git a/ace/Message_Queue.h b/ace/Message_Queue.h
index 76f7b05467c..2d084b1c918 100644
--- a/ace/Message_Queue.h
+++ b/ace/Message_Queue.h
@@ -70,11 +70,15 @@ public:
// when a signal occurs, or if the time specified in timeout
// elapses, (in which case errno = EWOULDBLOCK).
+ virtual int enqueue_tail (ACE_Message_Block *new_item,
+ ACE_Time_Value *timeout = 0) = 0;
virtual int enqueue (ACE_Message_Block *new_item,
ACE_Time_Value *timeout = 0) = 0;
// Enqueue a <ACE_Message_Block *> into the tail of the queue.
// Return -1 on failure, number of items in queue otherwise.
+ virtual int dequeue_head (ACE_Message_Block *&first_item,
+ ACE_Time_Value *timeout = 0) = 0;
virtual int dequeue (ACE_Message_Block *&first_item,
ACE_Time_Value *timeout = 0) = 0;
// Dequeue and return the <ACE_Message_Block *> at the head of the
@@ -289,9 +293,6 @@ class ACE_Export ACE_Message_Queue_NT : public ACE_Message_Queue_Base
// * peek_dequeue_head ().
// * ACE_Message_Queue_Iterators.
// * No flow control.
- // * Message_Block chains. The continuation field of ACE_Message_Block
- // * is ignored; only the first block of a fragment chain is
- // * recognized.
public:
// = Initialization and termination methods.
ACE_Message_Queue_NT (size_t max_threads = ACE_Message_Queue_Base::DEFAULT_HWM);
@@ -311,12 +312,16 @@ public:
// = Enqueue and dequeue methods.
+ virtual int enqueue_tail (ACE_Message_Block *new_item,
+ ACE_Time_Value *timeout = 0);
virtual int enqueue (ACE_Message_Block *new_item,
ACE_Time_Value *timeout = 0);
// Enqueue an <ACE_Message_Block *> at the end of the queue.
// Returns -1 on failure, else the number of items still on the
// queue.
+ virtual int dequeue_head (ACE_Message_Block *&first_item,
+ ACE_Time_Value *timeout = 0);
virtual int dequeue (ACE_Message_Block *&first_item,
ACE_Time_Value *timeout = 0);
// Dequeue and return the <ACE_Message_Block *> at the head of the
diff --git a/ace/Message_Queue.i b/ace/Message_Queue.i
index e1f953b0f7a..2cdac504bbd 100644
--- a/ace/Message_Queue.i
+++ b/ace/Message_Queue.i
@@ -94,6 +94,22 @@ ACE_Message_Queue_Vx::message_count (void)
#if defined (ACE_WIN32) && (ACE_HAS_WINNT4 != 0)
ACE_INLINE int
+ACE_Message_Queue_NT::enqueue_tail (ACE_Message_Block *new_item,
+ ACE_Time_Value *timeout)
+{
+ ACE_TRACE ("ACE_Message_Queue_NT::enqueue_tail");
+ return this->enqueue (new_item, timeout);
+}
+
+ACE_INLINE int
+ACE_Message_Queue_NT::dequeue_head (ACE_Message_Block *&first_item,
+ ACE_Time_Value *timeout)
+{
+ ACE_TRACE ("ACE_Message_Queue_NT::dequeue_head");
+ return this->dequeue (first_item, timeout);
+}
+
+ACE_INLINE int
ACE_Message_Queue_NT::is_full (void)
{
ACE_TRACE ("ACE_Message_Queue_NT::is_full");