PR_IMPLEMENT(PRMonitor*) PR_NewMonitor(void) { PRMonitor *mon; int rv; if (!_pr_initialized) _PR_ImplicitInitialization(); mon = PR_NEWZAP(PRMonitor); if (mon == NULL) { PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); return NULL; } rv = _PT_PTHREAD_MUTEX_INIT(mon->lock, _pt_mattr); PR_ASSERT(0 == rv); if (0 != rv) goto error1; _PT_PTHREAD_INVALIDATE_THR_HANDLE(mon->owner); rv = _PT_PTHREAD_COND_INIT(mon->entryCV, _pt_cvar_attr); PR_ASSERT(0 == rv); if (0 != rv) goto error2; rv = _PT_PTHREAD_COND_INIT(mon->waitCV, _pt_cvar_attr); PR_ASSERT(0 == rv); if (0 != rv) goto error3; mon->notifyTimes = 0; mon->entryCount = 0; mon->refCount = 1; mon->name = NULL; return mon; error3: pthread_cond_destroy(&mon->entryCV); error2: pthread_mutex_destroy(&mon->lock); error1: PR_Free(mon); PR_SetError(PR_OPERATION_NOT_SUPPORTED_ERROR, 0); return NULL; } /* PR_NewMonitor */
PR_IMPLEMENT(PRLock*) PR_NewLock(void) { PRIntn rv; PRLock *lock; if (!_pr_initialized) _PR_ImplicitInitialization(); lock = PR_NEWZAP(PRLock); if (lock != NULL) { rv = _PT_PTHREAD_MUTEX_INIT(lock->mutex, _pt_mattr); PR_ASSERT(0 == rv); } #if defined(DEBUG) pt_debug.locks_created += 1; #endif return lock; } /* PR_NewLock */
PR_IMPLEMENT(PRMonitor*) PR_NewMonitor(void) { PRMonitor *mon; PRCondVar *cvar; if (!_pr_initialized) _PR_ImplicitInitialization(); cvar = PR_NEWZAP(PRCondVar); if (NULL == cvar) { PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); return NULL; } mon = PR_NEWZAP(PRMonitor); if (mon != NULL) { int rv; rv = _PT_PTHREAD_MUTEX_INIT(mon->lock.mutex, _pt_mattr); PR_ASSERT(0 == rv); _PT_PTHREAD_INVALIDATE_THR_HANDLE(mon->owner); mon->cvar = cvar; rv = _PT_PTHREAD_COND_INIT(mon->cvar->cv, _pt_cvar_attr); PR_ASSERT(0 == rv); mon->entryCount = 0; mon->cvar->lock = &mon->lock; if (0 != rv) { PR_DELETE(mon); PR_DELETE(cvar); mon = NULL; } } return mon; } /* PR_NewMonitor */