PR_IMPLEMENT(PRLock*) PR_NewLock(void) { PRLock *lock; if (!_pr_initialized) _PR_ImplicitInitialization(); lock = PR_NEWZAP(PRLock); if (lock) { if (_PR_InitLock(lock) != PR_SUCCESS) { PR_DELETE(lock); return NULL; } } return lock; }
/* ** Create a new monitor. */ PR_IMPLEMENT(PRMonitor*) PR_NewMonitor() { PRMonitor *mon; PRStatus rv; if (!_pr_initialized) _PR_ImplicitInitialization(); mon = PR_NEWZAP(PRMonitor); if (mon == NULL) { PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); return NULL; } rv = _PR_InitLock(&mon->lock); PR_ASSERT(rv == PR_SUCCESS); if (rv != PR_SUCCESS) goto error1; mon->owner = NULL; rv = _PR_InitCondVar(&mon->entryCV, &mon->lock); PR_ASSERT(rv == PR_SUCCESS); if (rv != PR_SUCCESS) goto error2; rv = _PR_InitCondVar(&mon->waitCV, &mon->lock); PR_ASSERT(rv == PR_SUCCESS); if (rv != PR_SUCCESS) goto error3; mon->notifyTimes = 0; mon->entryCount = 0; mon->name = NULL; return mon; error3: _PR_FreeCondVar(&mon->entryCV); error2: _PR_FreeLock(&mon->lock); error1: PR_Free(mon); return NULL; }