diff options
Diffstat (limited to 'examples/Threads/wfmo.cpp')
-rw-r--r-- | examples/Threads/wfmo.cpp | 123 |
1 files changed, 0 insertions, 123 deletions
diff --git a/examples/Threads/wfmo.cpp b/examples/Threads/wfmo.cpp deleted file mode 100644 index 68492307f7f..00000000000 --- a/examples/Threads/wfmo.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// $Id$ - -// This test program illustrates that the Win32 -// <WaitForMultipleObjects> function can be called in multiple -// threads, all of which wait on the same set of HANDLEs. Note that -// the dispatching of the threads should be relatively "fair" (i.e., -// everyone gets a chance to process the various HANDLEs as they -// become active). Thanks to Ari Erev <Ari_Erev@comverse.com> for -// suggesting this and providing the initial code. - -#include "ace/Task.h" - -ACE_RCSID(Threads, wfmo, "$Id$") - -#if defined (ACE_WIN32) - -// Number of threads. -static const int THREAD_COUNT = 5; - -// Number of iterations. -static const int MAX_ITERATIONS = 100; - -class WFMO_Test : public ACE_Task <ACE_NULL_SYNCH> -{ -public: - virtual int open (void *); - virtual int svc (void); - - // Use two handles here.. - ACE_sema_t sema_handles_[2]; - int semaphore_count_; -}; - -static WFMO_Test wfmo_test; - -int -WFMO_Test::open (void *arg) -{ - int thread_count = int (arg); - ACE_ASSERT (this->activate (0, thread_count) != -1); - return 0; -} - -int -WFMO_Test::svc (void) -{ - while(1) - { - int result = ::WaitForMultipleObjects (2, this->sema_handles_, - FALSE, INFINITE); - - if (result == WAIT_OBJECT_0) - // Signal the other semaphore just to see if we can get - // another thread to wakeup. - ACE_ASSERT (ACE_OS::sema_post (&sema_handles_[1]) != -1); - else if (result == WAIT_OBJECT_0 + 1) - ; - else - { - ACE_DEBUG ((LM_DEBUG, "Error in WaitForMultipleObejcts\n")); - ACE_OS::exit (0); - } - - // semaphore_count_ will be displayed by the "main" thread. It's - // value must be 2. Note that although this is a shared - // resource it's not protected via a mutex because the ++ - // operation on Intel is atomic. - - semaphore_count_++; - ACE_DEBUG ((LM_DEBUG, "(%t) thread has been signaled.\n")); - - // Yield this thread so that the other one(s) have a chance to - // run. - ACE_OS::thr_yield (); - } - - return 0; -} - -int -main (int argc, char *argv[]) -{ - int thread_count = THREAD_COUNT; - - if (argc > 1) - thread_count = ACE_OS::atoi (argv[1]); - - wfmo_test.open ((void *) thread_count); - - // Initialize the semaphores. - ACE_ASSERT (ACE_OS::sema_init (&wfmo_test.sema_handles_[0], thread_count + 5) - != -1); - ACE_ASSERT (ACE_OS::sema_init (&wfmo_test.sema_handles_[1], thread_count + 5) - != -1); - - for (int i = 0; i < MAX_ITERATIONS; i++) - { - wfmo_test.semaphore_count_ = 0; - - ACE_ASSERT (ACE_OS::sema_post (&wfmo_test.sema_handles_[0]) != -1); - - // No real synchronization here. Just sleep enough so that at - // least one (or two threads) run as a result of the semaphore. - ACE_OS::sleep (1); - - // Add one for the other thread that was signaled. - ACE_DEBUG ((LM_DEBUG, - "semaphore_count_ = %d (should have been %d).\n", - wfmo_test.semaphore_count_, - 2)); // Two semaphores should have been released. - } - - ACE_OS::exit (0); - - return 0; -} -#else -int -main (int, char *[]) -{ - ACE_DEBUG ((LM_DEBUG, "this test only runs on Win32\n")); -} -#endif /* ACE_WIN32 */ |