ACE+TAO-7_0_8
[ACE_TAO.git] / ACE / tests / Barrier_Test.cpp
blob9f332599731e15477982cedc3d7b7e9da7fe80ee
2 //=============================================================================
3 /**
4 * @file Barrier_Test.cpp
6 * This program illustrates how the ACE barrier synchronization
7 * mechanisms work.
9 * @author Prashant Jain <pjain@cs.wustl.edu> and Doug Schmidt <d.schmidt@vanderbilt.edu>
11 //=============================================================================
14 #include "test_config.h"
15 #include "ace/Barrier.h"
16 #include "ace/Thread_Manager.h"
20 #if defined (ACE_HAS_THREADS)
22 struct Tester_Args
23 // = TITLE
24 // These arguments are passed into each test thread.
26 Tester_Args (ACE_Barrier &tb, int i)
27 : tester_barrier_ (tb),
28 n_iterations_ (i) {}
30 ACE_Barrier &tester_barrier_;
31 // Reference to the tester barrier. This controls each iteration
32 // of the tester function running in every thread.
34 int n_iterations_;
35 // Number of iterations to run.
38 // Iterate <n_iterations> time printing off a message and "waiting"
39 // for all other threads to complete this iteration.
41 static void *
42 wait_tester (Tester_Args *args)
44 for (int iterations = 1;
45 iterations <= args->n_iterations_;
46 iterations++)
48 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) in iteration %d\n"),
49 iterations));
51 // Block until all other threads have waited, then continue.
52 if (args->tester_barrier_.wait () != 0)
53 ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t) %p\n"),
54 ACE_TEXT ("wait failed")));
57 return 0;
60 // Wait on the barrier, expecting it to be shut down before completing
61 // the wait.
63 static void *
64 shut_tester (Tester_Args *args)
66 if (args->tester_barrier_.wait () == 0)
67 ACE_ERROR ((LM_ERROR,
68 ACE_TEXT ("(%t) wait succeeded, should have shut down\n")));
69 else if (errno != ESHUTDOWN)
70 ACE_ERROR ((LM_ERROR,
71 ACE_TEXT ("(%t) wait failed, expecting ESHUTDOWN, %p\n"),
72 ACE_TEXT ("got")));
73 return 0;
76 #endif /* ACE_HAS_THREADS */
78 int
79 run_main (int, ACE_TCHAR *[])
81 ACE_START_TEST (ACE_TEXT ("Barrier_Test"));
83 #if defined (ACE_HAS_THREADS)
84 int n_threads = ACE_MAX_THREADS;
85 int n_iterations = ACE_MAX_ITERATIONS;
87 ACE_Barrier tester_barrier (n_threads);
89 Tester_Args args (tester_barrier, n_iterations);
91 for (size_t iteration_count = 0;
92 iteration_count < ACE_MAX_ITERATIONS;
93 iteration_count++)
95 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("starting iteration %d\n"),
96 iteration_count));
98 if (ACE_Thread_Manager::instance ()->spawn_n
99 (n_threads,
100 (ACE_THR_FUNC) wait_tester,
101 (void *) &args,
102 THR_NEW_LWP | THR_JOINABLE) == -1)
104 ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
105 ACE_TEXT ("spawn_n")), 1);
107 ACE_Thread_Manager::instance ()->wait ();
110 // Now test ACE_Barrier shutdown. Set up a barrier for n_threads, and start
111 // n_threads - 1 threads to wait, then shut the barrier down.
112 ACE_Barrier shut_barrier (n_threads);
113 Tester_Args shut_args (shut_barrier, 1);
114 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Starting shutdown test threads\n")));
115 if (ACE_Thread_Manager::instance ()->spawn_n
116 (n_threads - 1,
117 (ACE_THR_FUNC) shut_tester,
118 (void *) &shut_args,
119 THR_NEW_LWP | THR_JOINABLE) == -1)
120 ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("spawn_n")), 1);
122 shut_barrier.shutdown ();
123 ACE_Thread_Manager::instance ()->wait ();
125 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("test done\n")));
126 #else
127 ACE_ERROR ((LM_INFO,
128 ACE_TEXT ("threads not supported on this platform\n")));
129 #endif /* ACE_HAS_THREADS */
130 ACE_END_TEST;
131 return 0;