/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/*
 * RWLock rank tests
 */

#include "nspr.h"
#include "plgetopt.h"

static int _debug_on;
static PRRWLock *rwlock0;
static PRRWLock *rwlock1;
static PRRWLock *rwlock2;

static void rwtest(void *args)
{
    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Unlock(rwlock1);

    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Unlock(rwlock1);

    /* Test correct lock rank. */
    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Rlock(rwlock2);
    PR_RWLock_Unlock(rwlock2);
    PR_RWLock_Unlock(rwlock1);

    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Rlock(rwlock2);
    PR_RWLock_Unlock(rwlock1);
    PR_RWLock_Unlock(rwlock2);

    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Rlock(rwlock0);
    PR_RWLock_Rlock(rwlock2);
    PR_RWLock_Unlock(rwlock2);
    PR_RWLock_Unlock(rwlock0);
    PR_RWLock_Unlock(rwlock1);

#if 0
    /* Test incorrect lock rank. */
    PR_RWLock_Rlock(rwlock2);
    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Unlock(rwlock1);
    PR_RWLock_Unlock(rwlock2);

    PR_RWLock_Rlock(rwlock2);
    PR_RWLock_Rlock(rwlock0);
    PR_RWLock_Rlock(rwlock1);
    PR_RWLock_Unlock(rwlock1);
    PR_RWLock_Unlock(rwlock0);
    PR_RWLock_Unlock(rwlock2);
#endif
}

int main(int argc, char **argv)
{
    PRStatus rc;
    PRThread *thread;
    PLOptStatus os;
    PLOptState *opt = PL_CreateOptState(argc, argv, "d");

    while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) {
        if (PL_OPT_BAD == os) continue;
        switch (opt->option) {
        case 'd':  /* debug mode */
            _debug_on = 1;
            break;
         default:
            break;
        }
    }
    PL_DestroyOptState(opt);

    rwlock0 = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "Lock 0");
    if (rwlock0 == NULL) {
        fprintf(stderr, "PR_NewRWLock failed - error %d\n",
                (int)PR_GetError());
        return 1;
    }
    rwlock1 = PR_NewRWLock(1, "Lock 1");
    if (rwlock1 == NULL) {
        fprintf(stderr, "PR_NewRWLock failed - error %d\n",
                (int)PR_GetError());
        return 1;
    }
    rwlock2 = PR_NewRWLock(2, "Lock 2");
    if (rwlock2 == NULL) {
        fprintf(stderr, "PR_NewRWLock failed - error %d\n",
                (int)PR_GetError());
        return 1;
    }

    thread = PR_CreateThread(PR_USER_THREAD, rwtest, NULL, PR_PRIORITY_NORMAL,
                             PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 0);
    if (thread == NULL) {
        fprintf(stderr, "PR_CreateThread failed - error %d\n",
                (int)PR_GetError());
        PR_ProcessExit(2);
    }
    if (_debug_on) {
        printf("%s: created thread = %p\n", argv[0], thread);
    }

    rc = PR_JoinThread(thread);
    PR_ASSERT(rc == PR_SUCCESS);

    PR_DestroyRWLock(rwlock0);
    rwlock0 = NULL;
    PR_DestroyRWLock(rwlock1);
    rwlock1 = NULL;
    PR_DestroyRWLock(rwlock2);
    rwlock2 = NULL;

    printf("PASS\n");
    return 0;
}
