summaryrefslogtreecommitdiff
path: root/ACE/tests/Bug_3878_Regression_Test.cpp
diff options
context:
space:
mode:
authorJohnny Willemsen <jwillemsen@remedy.nl>2010-09-07 10:59:20 +0000
committerJohnny Willemsen <jwillemsen@remedy.nl>2010-09-07 10:59:20 +0000
commit765fb0f20770d9cc6e4a0c2d9fb6f388f5ea7d2f (patch)
tree0c5ce964768d1621e7f31453c3893cc3f1f5c97d /ACE/tests/Bug_3878_Regression_Test.cpp
parent730f0547f9e33c3f10dbd2babb75ace20686c236 (diff)
downloadATCD-765fb0f20770d9cc6e4a0c2d9fb6f388f5ea7d2f.tar.gz
Tue Sep 7 10:52:59 UTC 2010 Johnny Willemsen <jwillemsen@remedy.nl>
* Kokyu/DSRT_Direct_Dispatcher_Impl_T.cpp: Use ACE_GUARD * Kokyu/Dispatcher_Task.cpp: Initialise pointer with 0 * PROBLEM-REPORT-FORM: * VERSION: Updated support email addresses * ace/ACE.inl: Layout changes * ace/ACE.cpp: Layout changes, simplified some ifdef checks * ace/Auto_IncDec_T.h: * ace/Env_Value_T.h: Use ACE_Copy_Disabled * ace/Bound_Ptr.inl: Documentation updates * ace/CORBA_macros.h: Removed all deprecated macros * ace/Dynamic_Service_Base.cpp: Use ACE_GUARD_RETURN * ace/Event_Handler_T.h: * ace/Event_Handler_T.inl: * ace/Event_Handler_T.cpp: Removed checks for ACE_HAS_TEMPLATE_TYPEDEFS, I think all compilers have this now, let us see if nothing breaks * ace/FILE.h: Doxygen updates * ace/Future.h: * ace/Future.cpp: Use mutex defines * ace/Future_Set.h: Use ACE_Copy_Disabled * ace/Future_Set.cpp: Initialise pointer with 0 * ace/Global_Macros.h: Removed checks for ACE_HAS_TEMPLATE_TYPEDEFS, doxygen changes, make it possible for users to redefine ACE_GUARD macros * ace/Guard_T.h: * ace/Guard_T.inl: * ace/Guard_T.cpp: Doxygen changes, disable ACE_Guard checks for this file * ace/Hash_Map_Manager_T.h: * ace/Hash_Multi_Map_Manager_T.h: * ace/Map_Manager.h: Update to indicate the usage of ACE_GUARD * ace/INET_Addr.h: Doxygen changes * ace/Local_Tokens.h: Disable part of this file for ACE_Guard fuzz check * ace/Log_Msg.cpp: Use ACE_OS::thr_self * ace/Malloc_T.h: Disable part of this file for ACE_Guard fuzz check, doxygen changes * ace/Message_Queue_T.h: * ace/Message_Queue_T.cpp: * ace/Message_Queue_Vx.h: * ace/Message_Queue_Vx.cpp: Removed ACE_Guard argument to some methods, not used and now cause fuzz to fail * ace/Mutex.h: * ace/Mutex.inl: Added non const lock(), this fixes bugzilla 3878. Thanks to Susan Finster <sfinster at daetwyler-rd dot com> for reporting this * ace/Null_Barrier.h: * ace/Null_Condition.h: * ace/Null_Mutex.h: * ace/Null_Semaphore.h: Removed old comments, disable part for ACE_Guard, removed ACE_Null_Mutex_Guard * ace/OS_NS_Thread.cpp: Layout changes, use ACE_Guard * ace/OS_NS_poll.cpp: * ace/OS_NS_sys_select.cpp: Layout changes * ace/OS_NS_sys_socket.inl: Comment change * ace/Read_Buffer.h: * ace/Remote_Tokens.h: * ace/SOCK.h: Doxygen changes * ace/SOCK_Connector.h: * ace/SOCK_Dgram_Mcast.h: Doxygen changes * ace/SOCK_Connector.cpp: Layout and const changes * ace/Select_Reactor.h: Disable part of this file for ACE_Guard fuzz check * ace/Service_Gestalt.h: Use ACE_Copy_Disabled * ace/Sig_Handler.cpp: Use ACE_GUARD macros * ace/Synch_Traits.h: Removed ACE_HAS_TEMPLATE_TYPEDEFS checks * ace/TSS_T.h: * ace/TSS_T.cpp: Use ACE_Copy_Disabled, reworked some code to fix ACE_Guard fuzz checks * ace/Task_Ex_T.h: Use ACE_Copy_Disabled * apps/Gateway/Peer/Peer.cpp: * apps/JAWS/server/HTTP_Server.cpp: * apps/JAWS/server/JAWS_IO.cpp: Initialise pointers with 0 * apps/JAWS/server/HTTP_Helpers.cpp: Use ACE_GUARD macros * apps/JAWS2/JAWS/Cache_Hash_T.cpp: * apps/JAWS2/JAWS/Cache_Manager_T.cpp: * apps/JAWS2/JAWS/Cache_Object.cpp: * apps/JAWS2/JAWS/Concurrency.cpp: * apps/JAWS2/JAWS/FILE.cpp: * apps/JAWS2/JAWS/Jaws_IO.cpp: * apps/JAWS2/JAWS/Reaper.cpp: * apps/JAWS3/jaws3/FILE.cpp: Use ACE_GUARD macros * apps/gperf/src/Options.cpp: Rename of local variable so that we don't need to disable ACE_OS fuzz check * bin/fuzz.pl: Improved ACE_Guard checks and enable this one by default * bin/generate_doxygen.pl: Let DANCE use the CIAO version file for the moment * bin/make_release.py: Don't create static and wince solutions as part of the release anymore, if you use these, generate them by hand in the future. Added vc10 project files * examples/APG/Proactor/HA_Proactive_Status.cpp: * examples/APG/Reactor/Client.cpp: * examples/APG/Reactor/HAStatus.cpp: * examples/APG/Streams/Answerer.cpp: * examples/APG/Streams/CommandStream.cpp: * examples/APG/ThreadManagement/Pool.cpp: * examples/APG/ThreadPools/LF_ThreadPool.cpp: * examples/APG/ThreadPools/Task_ThreadPool.cpp: * examples/APG/ThreadSafety/Semaphore.cpp: * examples/APG/Threads/Message_Blocks.cpp: * examples/APG/Threads/Message_Queue.cpp: * examples/ASX/Message_Queue/bounded_buffer.cpp: * examples/ASX/Message_Queue/priority_buffer.cpp: * examples/Bounded_Packet_Relay/Thread_Bounded_Packet_Relay.cpp: * examples/C++NPv2/AIO_Client_Logging_Daemon.cpp: * examples/C++NPv2/display_logfile.cpp: * examples/IPC_SAP/UPIPE_SAP/ex1.cpp: * examples/Reactor/Misc/test_demuxing.cpp: * examples/Reactor/WFMO_Reactor/Talker.cpp: * examples/Threads/barrier2.cpp: * examples/Threads/thread_pool.cpp: Initialise pointers with 0 * examples/APG/ThreadPools/ThreadPool.cpp: Use ACE_Thread_ID to store a print a thread id using ACE_DEBUG, that is the only way that is 100% portable * examples/APG/Threads/Guards.cpp: Disable ACE_Guard fuzz * examples/Threads/reader_writer.cpp: * examples/Threads/recursive_mutex.cpp: Use ACE_GUARD macros * examples/Threads/thread_specific.cpp: * examples/Threads/tss1.cpp: Removed code not used * include/makeinclude/platform_g++_common.GNU: Added CROSS_COMPILE support to this file * include/makeinclude/platform_linux.GNU: * include/makeinclude/platform_linux_common.GNU: Moved some bits to platform_g++_common.GNU, works with G++ in general * include/makeinclude/platform_qnx_neutrino.GNU: * include/makeinclude/platform_qnx_rtp_gcc.GNU: Cleanup * netsvcs/lib/Log_Message_Receiver.h: * netsvcs/lib/Log_Message_Receiver.cpp: Use ACE_GUARD macros * performance-tests/Misc/Misc.mpc: Enable test_guard * performance-tests/Misc/test_guard.cpp: Made this compiling again * performance-tests/Synch-Benchmarks/Base_Test/Baseline_Test.cpp: * performance-tests/TCP/tcp_test.cpp: Renamed variable to not need ACE_OS fuzz disable code * protocols/ace/HTBP/HTBP_ID_Requestor.cpp: * protocols/ace/HTBP/HTBP_Session.cpp: Use ACE_GUARD macros * protocols/ace/RMCast/Acknowledge.h: * protocols/ace/RMCast/Acknowledge.cpp: * protocols/ace/RMCast/Bits.h: * protocols/ace/RMCast/Flow.h: * protocols/ace/RMCast/Flow.cpp: * protocols/ace/RMCast/Fragment.h: * protocols/ace/RMCast/Fragment.cpp: * protocols/ace/RMCast/Link.h: * protocols/ace/RMCast/Link.cpp: * protocols/ace/RMCast/Parameters.h: * protocols/ace/RMCast/Protocol.h: * protocols/ace/RMCast/Protocol.cpp: * protocols/ace/RMCast/Reassemble.h: * protocols/ace/RMCast/Reassemble.cpp: * protocols/ace/RMCast/Retransmit.h: * protocols/ace/RMCast/Retransmit.cpp: * protocols/ace/RMCast/Simulator.h: * protocols/ace/RMCast/Simulator.cpp: * protocols/ace/RMCast/Socket.h: * protocols/ace/RMCast/Socket.cpp: * protocols/ace/RMCast/Stack.h: * protocols/ace/RMCast/Stack.cpp: * protocols/ace/TMCast/FaultDetector.hpp: * protocols/ace/TMCast/Group.cpp: * protocols/ace/TMCast/Group.hpp: * protocols/ace/TMCast/GroupFwd.hpp: * protocols/ace/TMCast/LinkListener.hpp: * protocols/ace/TMCast/MTQueue.hpp: * protocols/ace/TMCast/MTQueue.cpp: * protocols/ace/TMCast/Messaging.hpp: * protocols/ace/TMCast/Protocol.hpp: * protocols/ace/TMCast/Protocol.cpp: * protocols/ace/TMCast/TransactionController.hpp: Removed commented out code, Id changes, disable ACE_Guard check for this project * rpmbuild/ace-tao.spec: Fixed some problems in this spec file * tests/Aio_Platform_Test.cpp: * tests/Basic_Types_Test.cpp: * tests/Bug_1576_Regression_Test.cpp: * tests/Bug_3532_Regression_Test.cpp: * tests/Bug_3673_Regression_Test.cpp: * tests/Bug_3709_Regression_Test.cpp: * tests/Bug_3744_Regression_Test.cpp: * tests/Compiler_Features_03_Test.cpp: * tests/Compiler_Features_09_Test.cpp: * tests/Compiler_Features_13_Test.cpp: * tests/Compiler_Features_14_Test.cpp: * tests/Env_Value_Test.cpp: * tests/Hash_Map_Bucket_Iterator_Test.cpp: * tests/Logging_Strategy_Test.cpp: * tests/MT_SOCK_Test.cpp: * tests/Pipe_Test.cpp: * tests/Priority_Task_Test.cpp: * tests/Proactor_UDP_Test.cpp: * tests/QtReactor_Test.cpp: * tests/Reactor_Notification_Queue_Test.cpp: * tests/Reactor_Registration_Test.cpp: * tests/Reference_Counted_Event_Handler_Test.cpp: * tests/Time_Service_Test.cpp: Zapped ACE_RCSID * tests/Message_Block_Test.cpp: * tests/Multicast_Test_IPV6.cpp: Initialise pointer with 0 * tests/Reader_Writer_Test.cpp: Use ACE_GUARD * tests/Recursive_Mutex_Test.cpp: Disable ACE_Guard fuzz for part of this file * tests/Bug_3878_Regression_Test.cpp: New test for bugzilla 3878 * tests/SSL/Bug_2912_Regression_Test.cpp: * tests/TP_Reactor_Test.cpp: Use ACE_GUARD * tests/Simple_Message_Block_Test.cpp: * tests/Svc_Handler_Test.cpp: * tests/Thread_Pool_Test.cpp: * tests/UPIPE_SAP_Test.cpp: Initialise pointers with 0 * tests/Thread_Mutex_Test.cpp: Disable ACE_Guard fuzz * tests/Upgradable_RW_Test.cpp: Use ACE_GUARD * tests/run_test.lst: * tests/tests.mpc: Added 3878
Diffstat (limited to 'ACE/tests/Bug_3878_Regression_Test.cpp')
-rw-r--r--ACE/tests/Bug_3878_Regression_Test.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/ACE/tests/Bug_3878_Regression_Test.cpp b/ACE/tests/Bug_3878_Regression_Test.cpp
new file mode 100644
index 00000000000..b0c5510440b
--- /dev/null
+++ b/ACE/tests/Bug_3878_Regression_Test.cpp
@@ -0,0 +1,269 @@
+// $Id$
+
+#include "ace/config-lite.h"
+
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_time.h"
+#include "ace/Task.h"
+#include "ace/Containers.h"
+#include "ace/Synch.h"
+#include "ace/SString.h"
+#include "ace/Method_Request.h"
+#include "ace/Future.h"
+#include "ace/Activation_Queue.h"
+#include "test_config.h"
+
+class Worker;
+
+class IManager
+{
+public:
+ virtual ~IManager (void) { }
+
+ virtual int return_to_work (Worker *worker) = 0;
+};
+
+// Listing 2 code/ch16
+class Worker : public ACE_Task<ACE_MT_SYNCH>
+{
+public:
+ Worker (IManager *manager) : manager_(manager) { }
+
+ virtual int svc (void)
+ {
+ ACE_Thread_ID id;
+ thread_id_ = id;
+ while (1)
+ {
+ ACE_Message_Block *mb = 0;
+ if (this->getq (mb) == -1)
+ ACE_ERROR_BREAK
+ ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("getq")));
+ if (mb->msg_type () == ACE_Message_Block::MB_HANGUP)
+ {
+ ACE_DEBUG ((LM_INFO,
+ ACE_TEXT ("(%t) Shutting down\n")));
+ mb->release ();
+ break;
+ }
+ // Process the message.
+ process_message (mb);
+ // Return to work.
+ this->manager_->return_to_work (this);
+ }
+
+ return 0;
+ }
+
+ const ACE_Thread_ID& thread_id (void)
+ {
+ return thread_id_;
+ }
+
+private:
+ void process_message (ACE_Message_Block *mb)
+ {
+ ACE_TRACE (ACE_TEXT ("Worker::process_message"));
+ int msgId;
+ ACE_OS::memcpy (&msgId, mb->rd_ptr (), sizeof(int));
+ mb->release ();
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) Started processing message %d\n"),
+ msgId));
+ ACE_OS::sleep (3);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) Finished processing message %d\n"),
+ msgId));
+ }
+
+ IManager *manager_;
+ ACE_Thread_ID thread_id_;
+};
+
+// Listing 1 code/ch16
+class Manager: public ACE_Task<ACE_MT_SYNCH>, private IManager
+{
+public:
+ enum {POOL_SIZE = 5, MAX_TIMEOUT = 5};
+
+ Manager ()
+ : shutdown_(0), workers_lock_(), workers_cond_(workers_lock_)
+ {
+ ACE_TRACE (ACE_TEXT ("Manager::Manager"));
+ }
+
+ int svc (void)
+ {
+ ACE_TRACE (ACE_TEXT ("Manager::svc"));
+
+ ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%t) Manager started\n")));
+
+ // Create pool.
+ create_worker_pool ();
+
+ while (!done ())
+ {
+ ACE_Message_Block *mb = 0;
+ ACE_Time_Value tv ((long)MAX_TIMEOUT);
+ tv += ACE_OS::time (0);
+
+ // Get a message request.
+ if (this->getq (mb, &tv) < 0)
+ {
+ shut_down ();
+ break;
+ }
+
+ // Choose a worker.
+ Worker *worker = 0;
+ {
+ ACE_GUARD_RETURN (ACE_Mutex,
+ worker_mon, this->workers_lock_, -1);
+
+ while (this->workers_.is_empty ())
+ workers_cond_.wait ();
+
+ this->workers_.dequeue_head (worker);
+ }
+
+ // Ask the worker to do the job.
+ worker->putq (mb);
+ }
+
+ return 0;
+ }
+
+ int shut_down (void);
+
+ const ACE_Thread_ID& thread_id (Worker *worker);
+
+ virtual int return_to_work (Worker *worker)
+ {
+ ACE_GUARD_RETURN (ACE_Mutex,
+ worker_mon, this->workers_lock_, -1);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) Worker %t returning to work.\n")));
+ this->workers_.enqueue_tail (worker);
+ this->workers_cond_.signal ();
+
+ return 0;
+ }
+
+private:
+ int create_worker_pool (void)
+ {
+ ACE_GUARD_RETURN (ACE_Mutex,
+ worker_mon,
+ this->workers_lock_,
+ -1);
+ for (int i = 0; i < POOL_SIZE; i++)
+ {
+ Worker *worker;
+ ACE_NEW_RETURN (worker, Worker (this), -1);
+ this->workers_.enqueue_tail (worker);
+ worker->activate ();
+ }
+
+ return 0;
+ }
+
+ int done (void);
+
+private:
+ int shutdown_;
+ ACE_Mutex workers_lock_;
+ ACE_Condition<ACE_Mutex> workers_cond_;
+ ACE_Unbounded_Queue<Worker* > workers_;
+};
+// Listing 1
+
+int Manager::done (void)
+{
+ return (shutdown_ == 1);
+}
+
+int
+Manager::shut_down (void)
+{
+ ACE_TRACE (ACE_TEXT ("Manager::shut_down"));
+ ACE_Unbounded_Queue<Worker* >::ITERATOR iter =
+ this->workers_.begin ();
+ Worker **worker_ptr = 0;
+ do
+ {
+ iter.next (worker_ptr);
+ Worker *worker = (*worker_ptr);
+ ACE_Thread_ID id = thread_id (worker);
+ char buf [65];
+ id.to_string (buf);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) Attempting shutdown of %C\n"),
+ buf));
+
+ // Send the hangup message.
+ ACE_Message_Block *mb = 0;
+ ACE_NEW_RETURN
+ (mb,
+ ACE_Message_Block(0,
+ ACE_Message_Block::MB_HANGUP),
+ -1);
+ worker->putq (mb);
+
+ // Wait for the exit.
+ worker->wait ();
+
+ ACE_ASSERT (worker->msg_queue ()->is_empty ());
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) Worker %C shut down.\n"),
+ buf));
+ delete worker;
+ }
+ while (iter.advance ());
+
+ shutdown_ = 1;
+
+ return 0;
+}
+
+const ACE_Thread_ID&
+Manager::thread_id (Worker *worker)
+{
+ return worker->thread_id ();
+}
+
+int
+run_main (int, ACE_TCHAR *[])
+{
+ ACE_START_TEST (ACE_TEXT ("Bug_3878_Regression_Test"));
+
+#if defined (ACE_HAS_THREADS)
+ Manager tp;
+ tp.activate ();
+
+ // Wait for a moment every time you send a message.
+ ACE_Time_Value tv;
+ tv.msec (100);
+
+ ACE_Message_Block *mb = 0;
+ for (int i = 0; i < 3; i++)
+ {
+ ACE_NEW_RETURN
+ (mb, ACE_Message_Block(sizeof(int)), -1);
+
+ ACE_OS::memcpy (mb->wr_ptr (), &i, sizeof(int));
+
+ ACE_OS::sleep (tv);
+
+ // Add a new work item.
+ tp.putq (mb);
+ }
+
+ ACE_Thread_Manager::instance ()->wait ();
+#endif
+
+ ACE_END_TEST;
+
+ return 0;
+}
+