From 65a391a415e559663c43077b90b70de225b1d7ea Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Sat, 7 Jan 2023 16:43:24 +0100 Subject: support accessing the underlying queue (e.g. for iteration) --- ACE/ace/Message_Queue_T.cpp | 7 +++++++ ACE/ace/Message_Queue_T.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/ACE/ace/Message_Queue_T.cpp b/ACE/ace/Message_Queue_T.cpp index 76ff7aa38fa..007aeda5067 100644 --- a/ACE/ace/Message_Queue_T.cpp +++ b/ACE/ace/Message_Queue_T.cpp @@ -691,6 +691,13 @@ ACE_Message_Queue_Ex::set_time_pol this->queue_.set_time_policy (rhs); } +template +ACE_Message_Queue & +ACE_Message_Queue_Ex::queue () const +{ + return this->queue_; +} + template ACE_Message_Queue_Iterator::ACE_Message_Queue_Iterator (ACE_Message_Queue &q) : queue_ (q) diff --git a/ACE/ace/Message_Queue_T.h b/ACE/ace/Message_Queue_T.h index 4b4a7bea10a..0ff0f56077e 100644 --- a/ACE/ace/Message_Queue_T.h +++ b/ACE/ace/Message_Queue_T.h @@ -1385,6 +1385,8 @@ public: /// Dump the state of an object. virtual void dump () const; + ACE_Message_Queue &queue () const; + /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; -- cgit v1.2.1 From e4bf4867d9a36e7b155cd9358c97811ce599f16c Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Sat, 7 Jan 2023 19:52:20 +0100 Subject: removed constness --- ACE/ace/Message_Queue_T.cpp | 2 +- ACE/ace/Message_Queue_T.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ACE/ace/Message_Queue_T.cpp b/ACE/ace/Message_Queue_T.cpp index 007aeda5067..6ff89561fa5 100644 --- a/ACE/ace/Message_Queue_T.cpp +++ b/ACE/ace/Message_Queue_T.cpp @@ -693,7 +693,7 @@ ACE_Message_Queue_Ex::set_time_pol template ACE_Message_Queue & -ACE_Message_Queue_Ex::queue () const +ACE_Message_Queue_Ex::queue () { return this->queue_; } diff --git a/ACE/ace/Message_Queue_T.h b/ACE/ace/Message_Queue_T.h index 0ff0f56077e..f52361004fc 100644 --- a/ACE/ace/Message_Queue_T.h +++ b/ACE/ace/Message_Queue_T.h @@ -1385,7 +1385,7 @@ public: /// Dump the state of an object. virtual void dump () const; - ACE_Message_Queue &queue () const; + ACE_Message_Queue &queue (); /// Declare the dynamic allocation hooks. ACE_ALLOC_HOOK_DECLARE; -- cgit v1.2.1 From a905022c2d552261e6d60c497140b5ff7669dd4d Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Mon, 9 Jan 2023 18:02:05 +0100 Subject: added API comments and unit test case as requested --- ACE/ace/Message_Queue_T.h | 3 ++ ACE/tests/Message_Queue_Test_Ex.cpp | 98 +++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/ACE/ace/Message_Queue_T.h b/ACE/ace/Message_Queue_T.h index f52361004fc..5c9473fdb78 100644 --- a/ACE/ace/Message_Queue_T.h +++ b/ACE/ace/Message_Queue_T.h @@ -1385,6 +1385,9 @@ public: /// Dump the state of an object. virtual void dump () const; + /// Support access to the underlying . Note that + /// manipulating the lower level queue directly may be hazardous (, but + /// necessary in some scenarios); be sure to lock the queue first. ACE_Message_Queue &queue (); /// Declare the dynamic allocation hooks. diff --git a/ACE/tests/Message_Queue_Test_Ex.cpp b/ACE/tests/Message_Queue_Test_Ex.cpp index 853eebb8504..3c01eb12adc 100644 --- a/ACE/tests/Message_Queue_Test_Ex.cpp +++ b/ACE/tests/Message_Queue_Test_Ex.cpp @@ -709,6 +709,98 @@ int queue_priority_test (ACE_Message_Queue_Ex& q) return status; } +class Queue_Ex_Iterator_No_Lock + : public ACE_Message_Queue_Iterator +{ + typedef ACE_Message_Queue_Iterator inherited; + + public: + typedef ACE_Message_Queue_Ex MESSAGE_QUEUE_EX_T; + + Queue_Ex_Iterator_No_Lock (MESSAGE_QUEUE_EX_T& queue_in) + : inherited (queue_in.queue ()) + {} + virtual ~Queue_Ex_Iterator_No_Lock () {} + + int next (User_Class*& message_inout) + { + if (inherited::curr_) + { + message_inout = reinterpret_cast (inherited::curr_->base ()); + return 1; + } // end IF + + return 0; + } + int done (void) const { return (!inherited::curr_ ? 1 : 0); } + int advance (void) + { + if (inherited::curr_) + inherited::curr_ = inherited::curr_->next (); + + return (inherited::curr_ ? 1 : 0); + } +}; + +int queue_iterator_test (ACE_Message_Queue_Ex& q) +{ + int status = 0; + if (!q.is_empty ()) + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Iterator test queue not empty\n")), 1); + + // Set up a few objects with names for how they should come out of the queue. + ACE_Auto_Basic_Ptr b1, b2, b3, b4; + b1.reset (new User_Class ("first")); + b2.reset (new User_Class ("second")); + b3.reset (new User_Class ("third")); + b4.reset (new User_Class ("fourth")); + if (-1 == q.enqueue_tail (b1.get (), 0)) + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b1")), 1); + if (-1 == q.enqueue_tail (b2.get (), 0)) + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b2")), 1); + if (-1 == q.enqueue_tail (b3.get (), 0)) + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b3")), 1); + if (-1 == q.enqueue_tail (b4.get (), 0)) + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b4")), 1); + + User_Class* b = 0; + int counter = 0; + { ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, aGuard, q.lock (), 1); + for (Queue_Ex_Iterator_No_Lock iterator (q); + iterator.next (b); + iterator.advance ()) + { ACE_ASSERT (b); + ++counter; + if (counter == 1) + { + if (ACE_OS::strcmp (b->message (), "first") != 0) + { + ACE_ERROR ((LM_ERROR, ACE_TEXT ("First message was %C\n"), b->message ())); + ++status; + } + } + else if (counter == 4) + { + if (ACE_OS::strcmp (b->message (), "fourth") != 0) + { + ACE_ERROR ((LM_ERROR, ACE_TEXT ("Fourth message was %C\n"), b->message ())); + ++status; + } + } + + b = NULL; + } // end FOR + } // end lock scope + + // clean up + while (!q.is_empty ()) + q.dequeue_head (b, 0); + + if (status == 0) + ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Iterator test: OK\n"))); + return status; +} + int run_main (int argc, ACE_TCHAR *argv[]) { @@ -745,6 +837,12 @@ run_main (int argc, ACE_TCHAR *argv[]) ++status; } + // Check iterator operations. + if (0 != queue_iterator_test (q1)) + { + ++status; + } + ACE_NEW_RETURN (timer, ACE_High_Res_Timer, -1); -- cgit v1.2.1 From 22be043fb46aff505eea86e66fe19bf5249f1ad3 Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Mon, 9 Jan 2023 19:12:43 +0100 Subject: address some static code analysis issues --- ACE/tests/Message_Queue_Test_Ex.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ACE/tests/Message_Queue_Test_Ex.cpp b/ACE/tests/Message_Queue_Test_Ex.cpp index 3c01eb12adc..edf1bc68830 100644 --- a/ACE/tests/Message_Queue_Test_Ex.cpp +++ b/ACE/tests/Message_Queue_Test_Ex.cpp @@ -717,7 +717,7 @@ class Queue_Ex_Iterator_No_Lock public: typedef ACE_Message_Queue_Ex MESSAGE_QUEUE_EX_T; - Queue_Ex_Iterator_No_Lock (MESSAGE_QUEUE_EX_T& queue_in) + explicit Queue_Ex_Iterator_No_Lock (MESSAGE_QUEUE_EX_T& queue_in) : inherited (queue_in.queue ()) {} virtual ~Queue_Ex_Iterator_No_Lock () {} @@ -764,8 +764,8 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b4")), 1); User_Class* b = 0; - int counter = 0; { ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, aGuard, q.lock (), 1); + int counter = 0; for (Queue_Ex_Iterator_No_Lock iterator (q); iterator.next (b); iterator.advance ()) @@ -788,7 +788,7 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) } } - b = NULL; + b = 0; } // end FOR } // end lock scope -- cgit v1.2.1 From 8b6ad82dc91f728cea2c9e86a17e5969a3338fcc Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Mon, 9 Jan 2023 19:38:43 +0100 Subject: 0 --> NULL --> nullptr --- ACE/tests/Message_Queue_Test_Ex.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ACE/tests/Message_Queue_Test_Ex.cpp b/ACE/tests/Message_Queue_Test_Ex.cpp index edf1bc68830..db10902e9db 100644 --- a/ACE/tests/Message_Queue_Test_Ex.cpp +++ b/ACE/tests/Message_Queue_Test_Ex.cpp @@ -763,7 +763,7 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) if (-1 == q.enqueue_tail (b4.get (), 0)) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b4")), 1); - User_Class* b = 0; + User_Class* b = nullptr; { ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, aGuard, q.lock (), 1); int counter = 0; for (Queue_Ex_Iterator_No_Lock iterator (q); @@ -788,7 +788,7 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) } } - b = 0; + b = nullptr; } // end FOR } // end lock scope -- cgit v1.2.1 From 3e44fb91cf724aeb48b38169482a4878de316afc Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Wed, 5 Apr 2023 17:37:23 +0200 Subject: integrated review comments --- ACE/tests/Message_Queue_Test_Ex.cpp | 39 +++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ACE/tests/Message_Queue_Test_Ex.cpp b/ACE/tests/Message_Queue_Test_Ex.cpp index db10902e9db..8f45cb54d67 100644 --- a/ACE/tests/Message_Queue_Test_Ex.cpp +++ b/ACE/tests/Message_Queue_Test_Ex.cpp @@ -712,33 +712,38 @@ int queue_priority_test (ACE_Message_Queue_Ex& q) class Queue_Ex_Iterator_No_Lock : public ACE_Message_Queue_Iterator { - typedef ACE_Message_Queue_Iterator inherited; - public: typedef ACE_Message_Queue_Ex MESSAGE_QUEUE_EX_T; explicit Queue_Ex_Iterator_No_Lock (MESSAGE_QUEUE_EX_T& queue_in) - : inherited (queue_in.queue ()) + : ACE_Message_Queue_Iterator (queue_in.queue ()) {} - virtual ~Queue_Ex_Iterator_No_Lock () {} + virtual ~Queue_Ex_Iterator_No_Lock () = default; int next (User_Class*& message_inout) { - if (inherited::curr_) + if (ACE_Message_Queue_Iterator::curr_) { - message_inout = reinterpret_cast (inherited::curr_->base ()); + message_inout = + reinterpret_cast (ACE_Message_Queue_Iterator::curr_->base ()); return 1; - } // end IF + } return 0; } - int done (void) const { return (!inherited::curr_ ? 1 : 0); } - int advance (void) + + int done () const + { + return (!ACE_Message_Queue_Iterator::curr_ ? 1 : 0); + } + + int advance () { - if (inherited::curr_) - inherited::curr_ = inherited::curr_->next (); + if (ACE_Message_Queue_Iterator::curr_) + ACE_Message_Queue_Iterator::curr_ = + ACE_Message_Queue_Iterator::curr_->next (); - return (inherited::curr_ ? 1 : 0); + return (ACE_Message_Queue_Iterator::curr_ ? 1 : 0); } }; @@ -749,11 +754,11 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Iterator test queue not empty\n")), 1); // Set up a few objects with names for how they should come out of the queue. - ACE_Auto_Basic_Ptr b1, b2, b3, b4; - b1.reset (new User_Class ("first")); - b2.reset (new User_Class ("second")); - b3.reset (new User_Class ("third")); - b4.reset (new User_Class ("fourth")); + std::unique_ptr b1, b2, b3, b4; + b1 = std::make_unique ("first"); + b2 = std::make_unique ("second"); + b3 = std::make_unique ("third"); + b4 = std::make_unique ("fourth"); if (-1 == q.enqueue_tail (b1.get (), 0)) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b1")), 1); if (-1 == q.enqueue_tail (b2.get (), 0)) -- cgit v1.2.1 From 5625244fd7bb77bafabce28fdec790f51ef50080 Mon Sep 17 00:00:00 2001 From: Erik Sohns Date: Thu, 6 Apr 2023 11:08:34 +0200 Subject: more review comments --- ACE/tests/Message_Queue_Test_Ex.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ACE/tests/Message_Queue_Test_Ex.cpp b/ACE/tests/Message_Queue_Test_Ex.cpp index 8f45cb54d67..200a2103179 100644 --- a/ACE/tests/Message_Queue_Test_Ex.cpp +++ b/ACE/tests/Message_Queue_Test_Ex.cpp @@ -740,8 +740,10 @@ class Queue_Ex_Iterator_No_Lock int advance () { if (ACE_Message_Queue_Iterator::curr_) + { ACE_Message_Queue_Iterator::curr_ = ACE_Message_Queue_Iterator::curr_->next (); + } return (ACE_Message_Queue_Iterator::curr_ ? 1 : 0); } @@ -754,11 +756,10 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Iterator test queue not empty\n")), 1); // Set up a few objects with names for how they should come out of the queue. - std::unique_ptr b1, b2, b3, b4; - b1 = std::make_unique ("first"); - b2 = std::make_unique ("second"); - b3 = std::make_unique ("third"); - b4 = std::make_unique ("fourth"); + std::unique_ptr b1 = std::make_unique ("first"); + std::unique_ptr b2 = std::make_unique ("second"); + std::unique_ptr b3 = std::make_unique ("third"); + std::unique_ptr b4 = std::make_unique ("fourth"); if (-1 == q.enqueue_tail (b1.get (), 0)) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b1")), 1); if (-1 == q.enqueue_tail (b2.get (), 0)) @@ -769,7 +770,8 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("b4")), 1); User_Class* b = nullptr; - { ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, aGuard, q.lock (), 1); + { + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, aGuard, q.lock (), 1); int counter = 0; for (Queue_Ex_Iterator_No_Lock iterator (q); iterator.next (b); @@ -794,10 +796,9 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) } b = nullptr; - } // end FOR - } // end lock scope + } + } - // clean up while (!q.is_empty ()) q.dequeue_head (b, 0); -- cgit v1.2.1 From a78936549748c2dbb9e751d4d21baa532228f1df Mon Sep 17 00:00:00 2001 From: Johnny Willemsen Date: Fri, 7 Apr 2023 08:23:22 +0200 Subject: Update Message_Queue_Test_Ex.cpp --- ACE/tests/Message_Queue_Test_Ex.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ACE/tests/Message_Queue_Test_Ex.cpp b/ACE/tests/Message_Queue_Test_Ex.cpp index 200a2103179..6b698629a1b 100644 --- a/ACE/tests/Message_Queue_Test_Ex.cpp +++ b/ACE/tests/Message_Queue_Test_Ex.cpp @@ -776,7 +776,8 @@ int queue_iterator_test (ACE_Message_Queue_Ex& q) for (Queue_Ex_Iterator_No_Lock iterator (q); iterator.next (b); iterator.advance ()) - { ACE_ASSERT (b); + { + ACE_ASSERT (b); ++counter; if (counter == 1) { -- cgit v1.2.1