diff options
Diffstat (limited to 'tests/Recursive_Condition_Test.cpp')
-rw-r--r-- | tests/Recursive_Condition_Test.cpp | 313 |
1 files changed, 0 insertions, 313 deletions
diff --git a/tests/Recursive_Condition_Test.cpp b/tests/Recursive_Condition_Test.cpp deleted file mode 100644 index 02643995d7c..00000000000 --- a/tests/Recursive_Condition_Test.cpp +++ /dev/null @@ -1,313 +0,0 @@ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// tests -// -// = FILENAME -// Recursive_Condition_Test.cpp -// -// = DESCRIPTION -// This test program validates the functionality of the -// ACE_Condition<ACE_Recursive_Thread_Mutex> template -// specialization when combined with the -// ACE_Thread_Timer_Queue_Adapter on Win32 and Posix pthreads. -// -// = AUTHOR -// Stephen Howard <stephen.e.howard@lmco.com> and -// Douglas C. Schmidt <schmidt@cs.wustl.edu> -// -// ============================================================================ - -#include "test_config.h" -#include "ace/OS_NS_unistd.h" -#include "ace/OS_NS_sys_time.h" -#include "ace/Event_Handler.h" -#include "ace/Log_Msg.h" -#include "ace/Thread_Manager.h" -#include "ace/Timer_Heap.h" -#include "ace/Timer_Queue_Adapters.h" - -ACE_RCSID(tests, Recursive_Condition_Test, "$Id$") - -#if defined (ACE_HAS_THREADS) - -typedef ACE_Thread_Timer_Queue_Adapter<ACE_Timer_Heap> Thread_Timer_Queue; - -class Test_Handler : public ACE_Event_Handler -{ -public: - Test_Handler (void) : nr_expirations_ (0) {} - int nr_expirations (void) { return this->nr_expirations_; } - - virtual int handle_timeout (const ACE_Time_Value &, - const void *arg) - { - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Test_Handler::handle_timeout\n"))); - ++this->nr_expirations_; - - void *nc_arg = const_cast<void *> (arg); - Thread_Timer_Queue *timer_queue = - reinterpret_cast<Thread_Timer_Queue *> (nc_arg); - - ACE_Time_Value timeout = ACE_OS::gettimeofday () + ACE_Time_Value (1, 0); - - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("(%t) scheduling new timer 1 sec from now\n"))); - if (timer_queue->schedule (this, timer_queue, timeout) == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("schedule failed"))); - - return 0; - } - -private: - int nr_expirations_; -}; - -// These are for the basic functionality tests. -ACE_SYNCH_RECURSIVE_MUTEX mutex_; -ACE_SYNCH_RECURSIVE_CONDITION condition_(mutex_); -// Test driver sets this to non-zero before spawning and to zero for waiter. -int protected_int = 0; - -static ACE_THR_FUNC_RETURN -waiter (void *) -{ - if (mutex_.acquire () != 0) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("acquire")), 0); - - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) waiting for cv signal...\n"))); - if (condition_.wait () == 0) - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) woken up!!!\n"))); - else - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), ACE_TEXT ("wait"))); - - int copy_int = protected_int; // Copy it in case it's erroneously changing - if (copy_int != 0) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) waiter found protected_int %d\n"), - copy_int)); - - if (mutex_.release () != 0) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), ACE_TEXT ("release"))); - - return 0; -} - -static int -test_1 (void) -{ - protected_int = 1; - if (ACE_Thread_Manager::instance()->spawn (waiter) == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 1 spawn")), - 1); - - ACE_OS::sleep (2); - if (mutex_.acquire () == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 1 mutex acquire")), - 1); - - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) signaling condition...\n"))); - protected_int = 0; - if (condition_.signal () == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 1 signal"))); - - if (mutex_.release () == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 1 release"))); - - ACE_Thread_Manager::instance ()->wait (); - return 0; -} - -static int -test_2 (void) -{ - protected_int = 1; - if (ACE_Thread_Manager::instance()->spawn (waiter) == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 2 spawn")), - 1); - - ACE_OS::sleep (2); - if (mutex_.acquire () == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 2 mutex acquire")), - 1); - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) signaling condition...\n"))); - if (condition_.signal () == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("test 2 signal"))); - - // Wait to clear protected_int to be sure cv properly reacquires the - // mutex before returning control to caller. - ACE_OS::sleep(2); - protected_int = 0; - if (mutex_.release () == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 2 release"))); - - ACE_Thread_Manager::instance ()->wait (); - return 0; -} - -static int -test_3 (void) -{ - protected_int = 1; - if (ACE_Thread_Manager::instance()->spawn_n (4, waiter) == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), - ACE_TEXT ("test 3 spawn")), 1); - - ACE_OS::sleep (2); - if (mutex_.acquire () == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 3 mutex acquire")), - 1); - - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) broadcasting condition...\n"))); - if (condition_.broadcast () == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 3 broadcast"))); - protected_int = 0; - if (mutex_.release () == -1) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 3 release"))); - - ACE_Thread_Manager::instance ()->wait (); - - return 0; -} - -static int -test_4 (void) -{ - const int recurse_count = 3; - - protected_int = recurse_count; - if (ACE_Thread_Manager::instance()->spawn (waiter) == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("spawn")), 1); - - ACE_OS::sleep (2); - int i; - for (i = 0; i < recurse_count; ++i) - if (mutex_.acquire () == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("pass %d, %p\n"), - i + 1, - ACE_TEXT ("recursive acquire")), - 1); - - // Don't report a failure if the mutex doesn't offer a view of the - // recursion count. - int nesting_level = mutex_.get_nesting_level (); - if (!(nesting_level == -1 && errno == ENOTSUP) && nesting_level != i) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT("test 4 nesting level %d;") - ACE_TEXT (" should be %d\n"), - nesting_level, i), - 1); - - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) signaling condition...\n"))); - if (condition_.signal () == -1) - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), - ACE_TEXT ("test 4 signal")), - 1); - - for (i = 0; i < recurse_count; ++i) - { - // Only decrement - be sure all the waiting threads are not released - // before we release the mutex the correct number of times. - --protected_int; - mutex_.release (); - } - - // The waiter thread will acquire the mutex as a result of the releases - // above... don't check the nesting level until waiter() has had a chance - // to wake up, acquire, and release the mutex. - ACE_Thread_Manager::instance ()->wait (); - - nesting_level = mutex_.get_nesting_level (); - if (!(nesting_level == -1 && errno == ENOTSUP) && nesting_level != 0) - ACE_ERROR_RETURN ((LM_ERROR, - ACE_TEXT("(%t) nesting level %d; should be 0\n"), - nesting_level), - 1); - - return 0; -} -#endif /* ACE_HAS_THREADS */ - -int -run_main (int, ACE_TCHAR *[]) -{ - ACE_START_TEST (ACE_TEXT ("Recursive_Condition_Test")); - -#if defined (ACE_HAS_THREADS) - - int status = 0; - - /* Test 1 - Simple test */ - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Test 1...\n"))); - if (test_1 () != 0) - ++status; - - /* Test #2 - Sleep 2 seconds before releasing mutex */ - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Test 2...\n"))); - if (test_2 () != 0) - ++status; - - /* Test #3 - One main thread - 4 subthreads */ - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Test 3...\n"))); - if (test_3 () != 0) - ++status; - - /* Test #4 - Multiple calls to mutex_.acquire and mutex_.release */ - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Test 4...\n"))); - if (test_4 () != 0) - ++status; - - // Timer queue usage. - Thread_Timer_Queue timer_queue; - Test_Handler handler; - if (0 != timer_queue.activate ()) - { - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), ACE_TEXT ("activate"))); - ++status; - } - - ACE_Time_Value timeout = - ACE_OS::gettimeofday() + ACE_Time_Value (1, 0); - - if (-1 == timer_queue.schedule (&handler, &timer_queue, timeout)) - { - ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"), ACE_TEXT ("schedule"))); - ++status; - } - - ACE_OS::sleep (10); - timer_queue.deactivate (); - timer_queue.wait (); - // Scheduling every second, waiting 10 seconds, should get at least 9 - int expirations = handler.nr_expirations (); - ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Caught %d timer expirations\n"), - expirations)); - if (expirations < 9) - ACE_ERROR ((LM_ERROR, ACE_TEXT ("Should have caught at least 9\n"))); - -#else - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("ACE doesn't support recursive condition variables on this platform\n"))); -#endif /* ACE_HAS_THREADS */ - ACE_END_TEST; - return 0; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Thread_Timer_Queue_Adapter<ACE_Timer_Heap>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Thread_Timer_Queue_Adapter<ACE_Timer_Heap> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |