diff options
author | Johnny Willemsen <jwillemsen@remedy.nl> | 2010-09-07 10:59:20 +0000 |
---|---|---|
committer | Johnny Willemsen <jwillemsen@remedy.nl> | 2010-09-07 10:59:20 +0000 |
commit | 765fb0f20770d9cc6e4a0c2d9fb6f388f5ea7d2f (patch) | |
tree | 0c5ce964768d1621e7f31453c3893cc3f1f5c97d /ACE/tests/Bug_3878_Regression_Test.cpp | |
parent | 730f0547f9e33c3f10dbd2babb75ace20686c236 (diff) | |
download | ATCD-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.cpp | 269 |
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; +} + |