diff options
author | rpj <rpj> | 2005-04-06 02:16:29 +0000 |
---|---|---|
committer | rpj <rpj> | 2005-04-06 02:16:29 +0000 |
commit | 6e1c5f6a98f24308e3c9fa9f01101de6dd810153 (patch) | |
tree | 8e63d2a6f6b5de69c4b9a3a5f425f5e7db7f45d7 /tests/once3.c | |
parent | baacf6c941b44504f703463b053de357a8adb607 (diff) |
fix unguarded global variable access
Diffstat (limited to 'tests/once3.c')
-rw-r--r-- | tests/once3.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/tests/once3.c b/tests/once3.c index fabed51..51d2daa 100644 --- a/tests/once3.c +++ b/tests/once3.c @@ -53,13 +53,20 @@ pthread_once_t o = PTHREAD_ONCE_INIT; pthread_once_t once[NUM_ONCE]; -static int numOnce = 0; -static int numThreads = 0; +typedef struct { + int i; + CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t numOnce = {0, {0}}; +static sharedInt_t numThreads = {0, {0}}; void myfunc(void) { - numOnce++; + EnterCriticalSection(&numOnce.cs); + numOnce.i++; + LeaveCriticalSection(&numOnce.cs); /* Simulate slow once routine so that following threads pile up behind it */ Sleep(10); /* test for cancelation late so we're sure to have waiters. */ @@ -77,7 +84,9 @@ mythread(void * arg) */ pthread_cancel(pthread_self()); assert(pthread_once(&once[(int) arg], myfunc) == 0); - numThreads++; + EnterCriticalSection(&numThreads.cs); + numThreads.i++; + LeaveCriticalSection(&numThreads.cs); return 0; } @@ -87,6 +96,9 @@ main() pthread_t t[NUM_THREADS][NUM_ONCE]; int i, j; + InitializeCriticalSection(&numThreads.cs); + InitializeCriticalSection(&numOnce.cs); + for (j = 0; j < NUM_ONCE; j++) { once[j] = o; @@ -107,8 +119,11 @@ main() * pthread_once and so numThreads should never be incremented. However, * numOnce should be incremented by every thread (NUM_THREADS*NUM_ONCE). */ - assert(numOnce == NUM_ONCE * NUM_THREADS); - assert(numThreads == 0); + assert(numOnce.i == NUM_ONCE * NUM_THREADS); + assert(numThreads.i == 0); + + DeleteCriticalSection(&numOnce.cs); + DeleteCriticalSection(&numThreads.cs); return 0; } |