diff options
| author | rpj <rpj> | 2005-03-08 07:37:55 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2005-03-08 07:37:55 +0000 | 
| commit | 4eeada8a144281ac6ee39b87650cd48aa02a2d88 (patch) | |
| tree | 86fb986cd7d985347b4c2433a2b2aab49449cb6e /tests | |
| parent | d5c78e3656cbc7410f333bfa80e2929947e6d0e5 (diff) | |
New testsnap-2005-03-08
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/once2.c | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/tests/once2.c b/tests/once2.c new file mode 100644 index 0000000..22881d8 --- /dev/null +++ b/tests/once2.c @@ -0,0 +1,94 @@ +/* + * once2.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create several static pthread_once objects and channel several threads + * through each. + * + * Depends on API functions: + *	pthread_once() + *	pthread_create() + */ + +#include "test.h" + +#define NUM_THREADS 100 /* Targeting each once control */ +#define NUM_ONCE    10 + +pthread_once_t o = PTHREAD_ONCE_INIT; +pthread_once_t once[NUM_ONCE]; + +static int numOnce = 0; +static int numThreads = 0; + +void +myfunc(void) +{ +  numOnce++; +  /* Simulate slow once routine so that following threads pile up behind it */ +  Sleep(100); +} + +void * +mythread(void * arg) +{ +   assert(pthread_once(&once[(int) arg], myfunc) == 0); +   numThreads++; +   return 0; +} + +int +main() +{ +  pthread_t t[NUM_THREADS][NUM_ONCE]; +  int i, j; +   +  for (j = 0; j < NUM_ONCE; j++) +    { +      once[j] = o; + +      for (i = 0; i < NUM_THREADS; i++) +        assert(pthread_create(&t[i][j], NULL, mythread, (void *) j) == 0); +    } + +  for (j = 0; j < NUM_ONCE; j++) +    for (i = 0; i < NUM_THREADS; i++) +      if (pthread_join(t[i][j], NULL) != 0) +        printf("Join failed for [thread,once] = [%d,%d]\n", i, j); + +  assert(numOnce == NUM_ONCE); +  assert(numThreads == NUM_THREADS * NUM_ONCE); + +  return 0; +} | 
