2 //=============================================================================
4 * @file Barrier_Test.cpp
6 * This program illustrates how the ACE barrier synchronization
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)
24 // These arguments are passed into each test thread.
26 Tester_Args (ACE_Barrier
&tb
, int i
)
27 : tester_barrier_ (tb
),
30 ACE_Barrier
&tester_barrier_
;
31 // Reference to the tester barrier. This controls each iteration
32 // of the tester function running in every thread.
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.
42 wait_tester (Tester_Args
*args
)
44 for (int iterations
= 1;
45 iterations
<= args
->n_iterations_
;
48 ACE_DEBUG ((LM_DEBUG
, ACE_TEXT ("(%t) in iteration %d\n"),
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")));
60 // Wait on the barrier, expecting it to be shut down before completing
64 shut_tester (Tester_Args
*args
)
66 if (args
->tester_barrier_
.wait () == 0)
68 ACE_TEXT ("(%t) wait succeeded, should have shut down\n")));
69 else if (errno
!= ESHUTDOWN
)
71 ACE_TEXT ("(%t) wait failed, expecting ESHUTDOWN, %p\n"),
76 #endif /* ACE_HAS_THREADS */
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
;
95 ACE_DEBUG ((LM_DEBUG
, ACE_TEXT ("starting iteration %d\n"),
98 if (ACE_Thread_Manager::instance ()->spawn_n
100 (ACE_THR_FUNC
) wait_tester
,
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
117 (ACE_THR_FUNC
) shut_tester
,
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")));
128 ACE_TEXT ("threads not supported on this platform\n")));
129 #endif /* ACE_HAS_THREADS */