This is CJRLock.m in view mode; [Download] [Up]
/* * CJRLock -- Foundation Kit-less NSLock, NSConditionLock * * (c) 1997 Chris Roehrig <croehrig@House.ORG> * */ #import "CJRLock.h" #import "ThreadedApp.h" /*************** CJRLock ***************/ extern cthread_t mainThread; @implementation CJRLock:Object - init { [super init]; mutex = mutex_alloc(); return self; } - free { mutex_free(mutex); return [super free]; } - (void)lock { if( cthread_self() != mainThread ){ // ok to block... mutex_lock(mutex); } else { // Don't block main event loop; use ThreadedApp's lock [NXApp lock:mutex]; } } - (void)unlock { mutex_unlock(mutex); if( cthread_self() != mainThread ){ // notify main thread that an unlock has occurred (see ThreadedApp) [NXApp threadDidUnlock:self]; } } - (BOOL)tryLock { return mutex_try_lock(mutex); } @end /*************** CJRConditionLock ***************/ @implementation CJRConditionLock:Object - initWithCondition:(int)condition { [super init]; mutex = mutex_alloc(); cond = condition_alloc(); data = condition; return self; } - init { return [self initWithCondition:0]; } - free { condition_free(cond); mutex_free(mutex); return [super free]; } - (void)lock { if( cthread_self() != mainThread ){ // ok to block... mutex_lock(mutex); } else { // Don't block main event loop; use ThreadedApp's lock [NXApp lock:mutex]; } } - (void)unlock { mutex_unlock(mutex); // wake up other threads waiting for the lock... condition_broadcast(cond); if( cthread_self() != mainThread ){ // notify main thread that an unlock has occurred (see ThreadedApp) [NXApp threadDidUnlock:self]; } } - (int)condition { return data; } - (BOOL)tryLock { return mutex_try_lock(mutex); } - (void)lockWhenCondition:(int)condition { if( cthread_self() != mainThread ){ // blocking is ok... mutex_lock(mutex); while( data != condition ) condition_wait(cond,mutex); } else { // Don't block the main thread... [NXApp lock:mutex whenCondition:cond withData:&data is:condition]; } } - (BOOL)tryLockWhenCondition:(int)condition { if( mutex_try_lock(mutex) ){ if( condition==data ){ return YES; } else { mutex_unlock(mutex); return NO; } } else { return NO; } } - (void)unlockWithCondition:(int)condition { data = condition; mutex_unlock(mutex); // wake up other threads waiting for the lock... condition_broadcast(cond); // notify (wake up) the main thread if( cthread_self() != mainThread ){ [NXApp threadDidUnlock:self]; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.