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/. */
13 static PRRWLock
* rwlock0
;
14 static PRRWLock
* rwlock1
;
15 static PRRWLock
* rwlock2
;
17 static void rwtest(void* args
) {
18 PR_RWLock_Rlock(rwlock1
);
19 PR_RWLock_Unlock(rwlock1
);
21 PR_RWLock_Rlock(rwlock1
);
22 PR_RWLock_Unlock(rwlock1
);
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
);
30 PR_RWLock_Rlock(rwlock1
);
31 PR_RWLock_Rlock(rwlock2
);
32 PR_RWLock_Unlock(rwlock1
);
33 PR_RWLock_Unlock(rwlock2
);
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
);
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
);
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
);
58 int main(int argc
, char** argv
) {
62 PLOptState
* opt
= PL_CreateOptState(argc
, argv
, "d");
64 while (PL_OPT_EOL
!= (os
= PL_GetNextOpt(opt
))) {
65 if (PL_OPT_BAD
== os
) {
68 switch (opt
->option
) {
69 case 'd': /* debug mode */
76 PL_DestroyOptState(opt
);
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());
83 rwlock1
= PR_NewRWLock(1, "Lock 1");
84 if (rwlock1
== NULL
) {
85 fprintf(stderr
, "PR_NewRWLock failed - error %d\n", (int)PR_GetError());
88 rwlock2
= PR_NewRWLock(2, "Lock 2");
89 if (rwlock2
== NULL
) {
90 fprintf(stderr
, "PR_NewRWLock failed - error %d\n", (int)PR_GetError());
94 thread
= PR_CreateThread(PR_USER_THREAD
, rwtest
, NULL
, PR_PRIORITY_NORMAL
,
95 PR_GLOBAL_THREAD
, PR_JOINABLE_THREAD
, 0);
97 fprintf(stderr
, "PR_CreateThread failed - error %d\n", (int)PR_GetError());
101 printf("%s: created thread = %p\n", argv
[0], thread
);
104 rc
= PR_JoinThread(thread
);
105 PR_ASSERT(rc
== PR_SUCCESS
);
107 PR_DestroyRWLock(rwlock0
);
109 PR_DestroyRWLock(rwlock1
);
111 PR_DestroyRWLock(rwlock2
);