source: rtems/testsuites/psxtests/psxbarrier01/test.c @ 2317457

4.104.115
Last change on this file since 2317457 was 2317457, checked in by Joel Sherrill <joel.sherrill@…>, on 12/08/09 at 17:52:53

2009-12-08 Joel Sherrill <joel.sherrill@…>

  • include/pmacros.h, psx01/task.c, psx02/init.c, psx02/task.c, psx03/init.c, psx03/task.c, psx04/init.c, psx04/task1.c, psx04/task2.c, psx04/task3.c, psx05/init.c, psx05/task.c, psx05/task2.c, psx05/task3.c, psx06/init.c, psx06/task.c, psx06/task2.c, psx07/init.c, psx08/init.c, psx08/task2.c, psx08/task3.c, psx09/init.c, psx10/init.c, psx10/task.c, psx10/task2.c, psx10/task3.c, psx11/init.c, psx11/task.c, psx12/init.c, psxalarm01/init.c, psxbarrier01/test.c, psxcancel01/init.c, psxchroot01/test.c, psxclock/init.c, psxfile01/test.c, psxfile01/test_cat.c, psxfile01/test_extend.c, psxfile01/test_write.c, psxitimer/init.c, psxkey01/task.c, psxkey02/init.c, psxkey03/init.c, psxmount/test.c, psxmsgq01/init.c, psxmsgq03/init.c, psxmsgq04/init.c, psxreaddir/test.c, psxrwlock01/test.c, psxsem01/init.c, psxsignal01/init.c, psxsignal01/task1.c, psxsignal02/init.c, psxsignal03/init.c, psxsignal05/init.c, psxspin01/test.c, psxspin02/test.c, psxstack01/init.c, psxstat/test.c, psxtime/test.c, psxualarm/init.c: Use rtems_test_assert() consistently instead of system assert(). rtems_test_assert() is designed to integrate into the RTEMS test suite infrastructure.
  • Property mode set to 100644
File size: 8.0 KB
Line 
1/*
2 *  This test exercises the POSIX Barrier manager.
3 *
4 *  COPYRIGHT (c) 1989-2009.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.rtems.com/license/LICENSE.
10 *
11 *  $Id$
12 */
13
14#include <stdio.h>
15#include <errno.h>
16#include <stdlib.h>
17
18/* #define __USE_XOPEN2K XXX already defined on GNU/Linux */
19#include <pthread.h>
20
21#include "tmacros.h"
22
23#define NUMBER_THREADS 2
24pthread_t ThreadIds[NUMBER_THREADS];
25pthread_barrier_t Barrier;
26void *BarrierThread(void *arg);
27
28void *BarrierThread(void *arg)
29{
30  pthread_t id = *(pthread_t *) arg;
31  int       status;
32
33  printf( "pthread_barrier_wait( &Barrier ) for thread 0x%08" PRIxpthread_t "\n", id );
34  status = pthread_barrier_wait( &Barrier );
35  printf( "pthread_barrier_wait - 0x%08" PRIxpthread_t " released\n", id );
36  rtems_test_assert(  (status == 0) || (status == PTHREAD_BARRIER_SERIAL_THREAD) );
37
38  return NULL;
39}
40
41/*
42 *  main entry point to the test
43 */
44
45#if defined(__rtems__)
46int test_main(void);
47
48int test_main(void)
49#else
50int main(
51  int    argc,
52  char **argv
53)
54#endif
55{
56  pthread_barrier_t     bad_barrier = 100;
57  pthread_barrier_t     barrier;
58  pthread_barrierattr_t attr;
59  int                   status;
60  int                   p;
61  int                   i;
62
63  puts( "\n\n*** POSIX BARRIER TEST 01 ***" );
64
65  /*************** NULL POINTER CHECKS *****************/
66  puts( "pthread_barrierattr_init( NULL ) -- EINVAL" );
67  status = pthread_barrierattr_init( NULL );
68  rtems_test_assert(  status == EINVAL );
69
70  puts( "pthread_barrierattr_setpshared( NULL, private ) -- EINVAL" );
71  status = pthread_barrierattr_setpshared( NULL, PTHREAD_PROCESS_PRIVATE );
72  rtems_test_assert(  status == EINVAL );
73
74  puts( "pthread_barrierattr_setpshared( NULL, shared ) -- EINVAL" );
75  status = pthread_barrierattr_setpshared( NULL, PTHREAD_PROCESS_SHARED );
76  rtems_test_assert(  status == EINVAL );
77
78  puts( "pthread_barrierattr_getpshared( NULL, &p ) -- EINVAL" );
79  status = pthread_barrierattr_getpshared( NULL, &p );
80  rtems_test_assert(  status == EINVAL );
81
82  puts( "pthread_barrierattr_destroy( NULL ) -- EINVAL" );
83  status = pthread_barrierattr_destroy( NULL );
84  rtems_test_assert(  status == EINVAL );
85
86  /*************** NOT INITIALIZED CHECKS *****************/
87  /* cheat visibility */
88  attr.is_initialized = 0;
89  puts( "pthread_barrierattr_setpshared( &attr, shared ) -- EINVAL" );
90  status = pthread_barrierattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );
91  rtems_test_assert(  status == EINVAL );
92
93  puts( "pthread_barrierattr_getpshared( &attr, NULL ) -- EINVAL" );
94  status = pthread_barrierattr_getpshared( &attr, NULL );
95  rtems_test_assert(  status == EINVAL );
96
97  puts( "pthread_barrierattr_destroy( &attr ) -- EINVAL" );
98  status = pthread_barrierattr_destroy( &attr );
99  rtems_test_assert(  status == EINVAL );
100
101
102  /*************** ACTUALLY WORK THIS TIME *****************/
103
104  puts( "pthread_barrierattr_init( &attr ) -- OK" );
105  status = pthread_barrierattr_init( &attr );
106  rtems_test_assert(  status == 0 );
107
108  puts( "pthread_barrierattr_setpshared( &attr, private ) -- OK" );
109  status = pthread_barrierattr_setpshared( &attr, PTHREAD_PROCESS_PRIVATE );
110  rtems_test_assert(  status == 0 );
111
112  puts( "pthread_barrierattr_getpshared( &attr, &p ) -- OK" );
113  status = pthread_barrierattr_getpshared( &attr, &p );
114  rtems_test_assert(  status == 0 );
115  rtems_test_assert(  p == PTHREAD_PROCESS_PRIVATE );
116
117  puts( "pthread_barrierattr_setpshared( &attr, shared ) -- OK" );
118  status = pthread_barrierattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );
119  rtems_test_assert(  status == 0 );
120
121  puts( "pthread_barrierattr_getpshared( &attr, &p ) -- OK" );
122  status = pthread_barrierattr_getpshared( &attr, &p );
123  rtems_test_assert(  status == 0 );
124  rtems_test_assert(  p == PTHREAD_PROCESS_SHARED );
125
126  /*************** BAD PSHARED CHECK *****************/
127  puts( "pthread_barrierattr_setpshared( &attr, private ) -- EINVAL" );
128  status = pthread_barrierattr_setpshared( &attr, ~PTHREAD_PROCESS_PRIVATE );
129  rtems_test_assert(  status == EINVAL );
130
131  /*************** DESTROY/REUSE CHECK *****************/
132  puts( "pthread_barrierattr_destroy( &attr ) -- OK" );
133  status = pthread_barrierattr_destroy( &attr );
134  rtems_test_assert(  status == 0 );
135
136  puts( "pthread_barrierattr_getpshared( &attr, &p ) destroyed -- EINVAL" );
137  status = pthread_barrierattr_getpshared( &attr, &p );
138  rtems_test_assert(  status == EINVAL );
139
140  /*************** pthread_barrier_init ERROR CHECKs *********/
141  /* NULL barrier argument */
142  puts( "pthread_barrier_init( NULL, NULL, 2 ) -- EINVAL" );
143  status = pthread_barrier_init( NULL, NULL, 2 );
144  rtems_test_assert(  status == EINVAL );
145
146  /* uninitialized attr argument */
147  puts( "pthread_barrier_init( &barrier, &attr, 2 ) -- EINVAL" );
148  status = pthread_barrier_init( &barrier, &attr, 2 );
149  rtems_test_assert(  status == EINVAL );
150
151  /* zero count argument */
152  puts( "pthread_barrierattr_init( &attr ) -- OK" );
153  status = pthread_barrierattr_init( &attr );
154  rtems_test_assert(  status == 0 );
155
156  puts( "pthread_barrier_init( &barrier, &attr, 0 ) -- EINVAL" );
157  status = pthread_barrier_init( &barrier, &attr, 0 );
158  rtems_test_assert(  status == EINVAL );
159
160  /* allocating too many */
161  puts( "pthread_barrier_init( &barrier, NULL, 1 ) -- OK" );
162  status = pthread_barrier_init( &barrier, NULL, 1 );
163  rtems_test_assert(  status == 0 );
164
165  puts( "pthread_barrier_init( &barrier, NULL, 1 ) -- EAGAIN" );
166  status = pthread_barrier_init( &barrier, NULL, 1 );
167  rtems_test_assert(  status == EAGAIN );
168
169  /* clean up */
170  puts( "pthread_barrier_destroy( &barrier ) -- OK" );
171  status = pthread_barrier_destroy( &barrier );
172  rtems_test_assert(  status == 0 );
173
174  puts( "pthread_barrierattr_destroy( &attr ) -- OK" );
175  status = pthread_barrierattr_destroy( &attr );
176  rtems_test_assert(  status == 0 );
177
178  /*************** pthread_barrier_destroy ERROR CHECKs *********/
179  /* NULL barrier argument */
180  puts( "pthread_barrier_destroy( NULL ) -- EINVAL" );
181  status = pthread_barrier_destroy( NULL );
182  rtems_test_assert(  status == EINVAL );
183
184  puts( "pthread_barrier_destroy( &bad_barrier ) -- EINVAL" );
185  status = pthread_barrier_destroy( &bad_barrier );
186  rtems_test_assert(  status == EINVAL );
187
188  /*************** pthread_barrier_wait ERROR CHECKs *********/
189  /* NULL barrier argument */
190  puts( "pthread_barrier_wait( NULL ) -- EINVAL" );
191  status = pthread_barrier_wait( NULL );
192  rtems_test_assert(  status == EINVAL );
193
194  puts( "pthread_barrier_wait( &bad_barrier ) -- EINVAL" );
195  status = pthread_barrier_wait( &bad_barrier );
196  rtems_test_assert(  status == EINVAL );
197
198  /*************** ACTUALLY CREATE ONE CHECK *****************/
199  puts( "pthread_barrierattr_init( &attr ) -- OK" );
200  status = pthread_barrierattr_init( &attr );
201  rtems_test_assert(  status == 0 );
202
203  puts( "pthread_barrier_init( &barrier, &attr, 2 ) -- OK" );
204  status = pthread_barrier_init( &barrier, &attr, 2 );
205  rtems_test_assert(  status == 0 );
206  rtems_test_assert(  barrier != 0 );
207
208  puts( "pthread_barrier_destroy( &barrier ) -- OK" );
209  status = pthread_barrier_destroy( &barrier );
210  rtems_test_assert(  status == 0 );
211
212  /*************** CREATE THREADS AND LET THEM RELEASE *****************/
213  puts( "pthread_barrier_init( &Barrier, &attr, NUMBER_THREADS ) -- OK" );
214  status = pthread_barrier_init( &Barrier, &attr, NUMBER_THREADS );
215  rtems_test_assert(  status == 0 );
216  rtems_test_assert(  barrier != 0 );
217
218  for (i=0 ; i<NUMBER_THREADS ; i++ ) {
219
220    /* check for unable to destroy while threads waiting */
221    if (i == NUMBER_THREADS - 1) {
222      puts( "pthread_barrier_destroy( &Barrier ) -- EBUSY" );
223      status = pthread_barrier_destroy( &Barrier );
224      rtems_test_assert(  status == EBUSY );
225    }
226
227    /* create a thread to block on the barrier */
228    printf( "Init: pthread_create - thread %d OK\n", i+1 );
229    status = pthread_create(&ThreadIds[i], NULL, BarrierThread, &ThreadIds[i]);
230    rtems_test_assert(  !status );
231
232    sleep(1);
233  }
234
235  /*************** END OF TEST *****************/
236  puts( "*** END OF POSIX BARRIER TEST 01 ***" );
237  exit(0);
238}
Note: See TracBrowser for help on using the repository browser.