1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/nsprpub/pr/tests/rwlockrank.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,120 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +/* 1.9 + * RWLock rank tests 1.10 + */ 1.11 + 1.12 +#include "nspr.h" 1.13 +#include "plgetopt.h" 1.14 + 1.15 +static int _debug_on; 1.16 +static PRRWLock *rwlock0; 1.17 +static PRRWLock *rwlock1; 1.18 +static PRRWLock *rwlock2; 1.19 + 1.20 +static void rwtest(void *args) 1.21 +{ 1.22 + PR_RWLock_Rlock(rwlock1); 1.23 + PR_RWLock_Unlock(rwlock1); 1.24 + 1.25 + PR_RWLock_Rlock(rwlock1); 1.26 + PR_RWLock_Unlock(rwlock1); 1.27 + 1.28 + // Test correct lock rank. 1.29 + PR_RWLock_Rlock(rwlock1); 1.30 + PR_RWLock_Rlock(rwlock2); 1.31 + PR_RWLock_Unlock(rwlock2); 1.32 + PR_RWLock_Unlock(rwlock1); 1.33 + 1.34 + PR_RWLock_Rlock(rwlock1); 1.35 + PR_RWLock_Rlock(rwlock2); 1.36 + PR_RWLock_Unlock(rwlock1); 1.37 + PR_RWLock_Unlock(rwlock2); 1.38 + 1.39 + PR_RWLock_Rlock(rwlock1); 1.40 + PR_RWLock_Rlock(rwlock0); 1.41 + PR_RWLock_Rlock(rwlock2); 1.42 + PR_RWLock_Unlock(rwlock2); 1.43 + PR_RWLock_Unlock(rwlock0); 1.44 + PR_RWLock_Unlock(rwlock1); 1.45 + 1.46 +#if 0 1.47 + // Test incorrect lock rank. 1.48 + PR_RWLock_Rlock(rwlock2); 1.49 + PR_RWLock_Rlock(rwlock1); 1.50 + PR_RWLock_Unlock(rwlock1); 1.51 + PR_RWLock_Unlock(rwlock2); 1.52 + 1.53 + PR_RWLock_Rlock(rwlock2); 1.54 + PR_RWLock_Rlock(rwlock0); 1.55 + PR_RWLock_Rlock(rwlock1); 1.56 + PR_RWLock_Unlock(rwlock1); 1.57 + PR_RWLock_Unlock(rwlock0); 1.58 + PR_RWLock_Unlock(rwlock2); 1.59 +#endif 1.60 +} 1.61 + 1.62 +int main(int argc, char **argv) 1.63 +{ 1.64 + PRStatus rc; 1.65 + PRThread *thread; 1.66 + PLOptStatus os; 1.67 + PLOptState *opt = PL_CreateOptState(argc, argv, "d"); 1.68 + 1.69 + while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { 1.70 + if (PL_OPT_BAD == os) continue; 1.71 + switch (opt->option) { 1.72 + case 'd': /* debug mode */ 1.73 + _debug_on = 1; 1.74 + break; 1.75 + default: 1.76 + break; 1.77 + } 1.78 + } 1.79 + PL_DestroyOptState(opt); 1.80 + 1.81 + rwlock0 = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "Lock 0"); 1.82 + if (rwlock0 == NULL) { 1.83 + fprintf(stderr, "PR_NewRWLock failed - error %d\n", 1.84 + (int)PR_GetError()); 1.85 + return 1; 1.86 + } 1.87 + rwlock1 = PR_NewRWLock(1, "Lock 1"); 1.88 + if (rwlock1 == NULL) { 1.89 + fprintf(stderr, "PR_NewRWLock failed - error %d\n", 1.90 + (int)PR_GetError()); 1.91 + return 1; 1.92 + } 1.93 + rwlock2 = PR_NewRWLock(2, "Lock 2"); 1.94 + if (rwlock2 == NULL) { 1.95 + fprintf(stderr, "PR_NewRWLock failed - error %d\n", 1.96 + (int)PR_GetError()); 1.97 + return 1; 1.98 + } 1.99 + 1.100 + thread = PR_CreateThread(PR_USER_THREAD, rwtest, NULL, PR_PRIORITY_NORMAL, 1.101 + PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0); 1.102 + if (thread == NULL) { 1.103 + fprintf(stderr, "PR_CreateThread failed - error %d\n", 1.104 + (int)PR_GetError()); 1.105 + PR_ProcessExit(2); 1.106 + } 1.107 + if (_debug_on) { 1.108 + printf("%s: created thread = %p\n", argv[0], thread); 1.109 + } 1.110 + 1.111 + rc = PR_JoinThread(thread); 1.112 + PR_ASSERT(rc == PR_SUCCESS); 1.113 + 1.114 + PR_DestroyRWLock(rwlock0); 1.115 + rwlock0 = NULL; 1.116 + PR_DestroyRWLock(rwlock1); 1.117 + rwlock1 = NULL; 1.118 + PR_DestroyRWLock(rwlock2); 1.119 + rwlock2 = NULL; 1.120 + 1.121 + printf("PASS\n"); 1.122 + return 0; 1.123 +}