nsprpub/pr/tests/rwlockrank.c

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     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/. */
     5 /*
     6  * RWLock rank tests
     7  */
     9 #include "nspr.h"
    10 #include "plgetopt.h"
    12 static int _debug_on;
    13 static PRRWLock *rwlock0;
    14 static PRRWLock *rwlock1;
    15 static PRRWLock *rwlock2;
    17 static void rwtest(void *args)
    18 {
    19     PR_RWLock_Rlock(rwlock1);
    20     PR_RWLock_Unlock(rwlock1);
    22     PR_RWLock_Rlock(rwlock1);
    23     PR_RWLock_Unlock(rwlock1);
    25     // Test correct lock rank.
    26     PR_RWLock_Rlock(rwlock1);
    27     PR_RWLock_Rlock(rwlock2);
    28     PR_RWLock_Unlock(rwlock2);
    29     PR_RWLock_Unlock(rwlock1);
    31     PR_RWLock_Rlock(rwlock1);
    32     PR_RWLock_Rlock(rwlock2);
    33     PR_RWLock_Unlock(rwlock1);
    34     PR_RWLock_Unlock(rwlock2);
    36     PR_RWLock_Rlock(rwlock1);
    37     PR_RWLock_Rlock(rwlock0);
    38     PR_RWLock_Rlock(rwlock2);
    39     PR_RWLock_Unlock(rwlock2);
    40     PR_RWLock_Unlock(rwlock0);
    41     PR_RWLock_Unlock(rwlock1);
    43 #if 0
    44     // Test incorrect lock rank.
    45     PR_RWLock_Rlock(rwlock2);
    46     PR_RWLock_Rlock(rwlock1);
    47     PR_RWLock_Unlock(rwlock1);
    48     PR_RWLock_Unlock(rwlock2);
    50     PR_RWLock_Rlock(rwlock2);
    51     PR_RWLock_Rlock(rwlock0);
    52     PR_RWLock_Rlock(rwlock1);
    53     PR_RWLock_Unlock(rwlock1);
    54     PR_RWLock_Unlock(rwlock0);
    55     PR_RWLock_Unlock(rwlock2);
    56 #endif
    57 }
    59 int main(int argc, char **argv)
    60 {
    61     PRStatus rc;
    62     PRThread *thread;
    63     PLOptStatus os;
    64     PLOptState *opt = PL_CreateOptState(argc, argv, "d");
    66     while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) {
    67         if (PL_OPT_BAD == os) continue;
    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);
    78     rwlock0 = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "Lock 0");
    79     if (rwlock0 == NULL) {
    80         fprintf(stderr, "PR_NewRWLock failed - error %d\n",
    81                 (int)PR_GetError());
    82         return 1;
    83     }
    84     rwlock1 = PR_NewRWLock(1, "Lock 1");
    85     if (rwlock1 == NULL) {
    86         fprintf(stderr, "PR_NewRWLock failed - error %d\n",
    87                 (int)PR_GetError());
    88         return 1;
    89     }
    90     rwlock2 = PR_NewRWLock(2, "Lock 2");
    91     if (rwlock2 == NULL) {
    92         fprintf(stderr, "PR_NewRWLock failed - error %d\n",
    93                 (int)PR_GetError());
    94         return 1;
    95     }
    97     thread = PR_CreateThread(PR_USER_THREAD, rwtest, NULL, PR_PRIORITY_NORMAL,
    98                              PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0);
    99     if (thread == NULL) {
   100         fprintf(stderr, "PR_CreateThread failed - error %d\n",
   101                 (int)PR_GetError());
   102         PR_ProcessExit(2);
   103     }
   104     if (_debug_on) {
   105         printf("%s: created thread = %p\n", argv[0], thread);
   106     }
   108     rc = PR_JoinThread(thread);
   109     PR_ASSERT(rc == PR_SUCCESS);
   111     PR_DestroyRWLock(rwlock0);
   112     rwlock0 = NULL;
   113     PR_DestroyRWLock(rwlock1);
   114     rwlock1 = NULL;
   115     PR_DestroyRWLock(rwlock2);
   116     rwlock2 = NULL;
   118     printf("PASS\n");
   119     return 0;
   120 }

mercurial