nsprpub/pr/tests/rwlockrank.c

Fri, 16 Jan 2015 04:50:19 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 04:50:19 +0100
branch
TOR_BUG_9701
changeset 13
44a2da4a2ab2
permissions
-rw-r--r--

Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32

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

mercurial