rwlockrank.c (2823B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 /* 6 * RWLock rank tests 7 */ 8 9 #include "nspr.h" 10 #include "plgetopt.h" 11 12 static int _debug_on; 13 static PRRWLock* rwlock0; 14 static PRRWLock* rwlock1; 15 static PRRWLock* rwlock2; 16 17 static void rwtest(void* args) { 18 PR_RWLock_Rlock(rwlock1); 19 PR_RWLock_Unlock(rwlock1); 20 21 PR_RWLock_Rlock(rwlock1); 22 PR_RWLock_Unlock(rwlock1); 23 24 /* Test correct lock rank. */ 25 PR_RWLock_Rlock(rwlock1); 26 PR_RWLock_Rlock(rwlock2); 27 PR_RWLock_Unlock(rwlock2); 28 PR_RWLock_Unlock(rwlock1); 29 30 PR_RWLock_Rlock(rwlock1); 31 PR_RWLock_Rlock(rwlock2); 32 PR_RWLock_Unlock(rwlock1); 33 PR_RWLock_Unlock(rwlock2); 34 35 PR_RWLock_Rlock(rwlock1); 36 PR_RWLock_Rlock(rwlock0); 37 PR_RWLock_Rlock(rwlock2); 38 PR_RWLock_Unlock(rwlock2); 39 PR_RWLock_Unlock(rwlock0); 40 PR_RWLock_Unlock(rwlock1); 41 42 #if 0 43 /* Test incorrect lock rank. */ 44 PR_RWLock_Rlock(rwlock2); 45 PR_RWLock_Rlock(rwlock1); 46 PR_RWLock_Unlock(rwlock1); 47 PR_RWLock_Unlock(rwlock2); 48 49 PR_RWLock_Rlock(rwlock2); 50 PR_RWLock_Rlock(rwlock0); 51 PR_RWLock_Rlock(rwlock1); 52 PR_RWLock_Unlock(rwlock1); 53 PR_RWLock_Unlock(rwlock0); 54 PR_RWLock_Unlock(rwlock2); 55 #endif 56 } 57 58 int main(int argc, char** argv) { 59 PRStatus rc; 60 PRThread* thread; 61 PLOptStatus os; 62 PLOptState* opt = PL_CreateOptState(argc, argv, "d"); 63 64 while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { 65 if (PL_OPT_BAD == os) { 66 continue; 67 } 68 switch (opt->option) { 69 case 'd': /* debug mode */ 70 _debug_on = 1; 71 break; 72 default: 73 break; 74 } 75 } 76 PL_DestroyOptState(opt); 77 78 rwlock0 = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "Lock 0"); 79 if (rwlock0 == NULL) { 80 fprintf(stderr, "PR_NewRWLock failed - error %d\n", (int)PR_GetError()); 81 return 1; 82 } 83 rwlock1 = PR_NewRWLock(1, "Lock 1"); 84 if (rwlock1 == NULL) { 85 fprintf(stderr, "PR_NewRWLock failed - error %d\n", (int)PR_GetError()); 86 return 1; 87 } 88 rwlock2 = PR_NewRWLock(2, "Lock 2"); 89 if (rwlock2 == NULL) { 90 fprintf(stderr, "PR_NewRWLock failed - error %d\n", (int)PR_GetError()); 91 return 1; 92 } 93 94 thread = PR_CreateThread(PR_USER_THREAD, rwtest, NULL, PR_PRIORITY_NORMAL, 95 PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0); 96 if (thread == NULL) { 97 fprintf(stderr, "PR_CreateThread failed - error %d\n", (int)PR_GetError()); 98 PR_ProcessExit(2); 99 } 100 if (_debug_on) { 101 printf("%s: created thread = %p\n", argv[0], thread); 102 } 103 104 rc = PR_JoinThread(thread); 105 PR_ASSERT(rc == PR_SUCCESS); 106 107 PR_DestroyRWLock(rwlock0); 108 rwlock0 = NULL; 109 PR_DestroyRWLock(rwlock1); 110 rwlock1 = NULL; 111 PR_DestroyRWLock(rwlock2); 112 rwlock2 = NULL; 113 114 printf("PASS\n"); 115 return 0; 116 }