tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }