void qlock(QLock *q) { Proc *up = externup(); Proc *p; uint64_t t0; cycles(&t0); if(!islo() && machp()->ilockdepth != 0){ print("qlock with ilockdepth %d,", machp()->ilockdepth); stacksnippet(); } if(up != nil && up->nlocks) print("qlock: %#p: nlocks %d", getcallerpc(&q), up->nlocks); if(!canlock(&q->use)){ lock(&q->use); slockstat(getcallerpc(&q), t0); } qlockstats.qlock++; if(!q->locked) { q->locked = 1; q->pc = getcallerpc(&q); unlock(&q->use); return; } if(up == nil) panic("qlock"); qlockstats.qlockq++; p = q->tail; if(p == 0) q->head = up; else p->qnext = up; q->tail = up; up->qnext = 0; up->state = Queueing; up->qpc = getcallerpc(&q); if(up->trace) proctrace(up, SLock, 0); unlock(&q->use); sched(); lockstat(getcallerpc(&q), t0); }
void wlock(RWlock *q) { Proc *up = externup(); Proc *p; uint64_t t0; cycles(&t0); if(!canlock(&q->use)){ lock(&q->use); slockstat(getcallerpc(&q), t0); } qlockstats.wlock++; if(q->readers == 0 && q->writer == 0){ /* noone waiting, go for it */ q->wpc = getcallerpc(&q); q->wproc = up; q->writer = 1; unlock(&q->use); return; } /* wait */ qlockstats.wlockq++; p = q->tail; if(up == nil) panic("wlock"); if(p == nil) q->head = up; else p->qnext = up; q->tail = up; up->qnext = 0; up->state = QueueingW; if(up->trace) proctrace(up, SLock, 0); unlock(&q->use); sched(); lockstat(getcallerpc(&q), t0); }
int main( int argc, char * argv[] ) { if( (App = new AppParam( argc, argv, VERID_main ) ) == 0 ) { cerr << "Can't new AppParam." << endl; exit( 1 ); } if( ! App->good() || App->help() || ! App->allArgs() ) App->abort( 1, true, __FILE__, __LINE__ ); FileStat lockstat( App->lockFn() ); if( ! lockstat.good() ) { AppError << lockstat.error() << endl; return( 1 ); } Semaphore sem( App->lockFn() ); if( ! sem.good() ) { AppError << sem.error() << endl; return( 1 ); } FileLock lock( App->lockFn(), (ios::openmode)(ios::in | ios::out) ); if( ! lock.good() ) { AppError << lock.error() << endl; return( 1 ); } if( ! sem.islocked() ) { if( ! lock.lockread() ) { AppError << lock.error() << endl; return( 1 ); } } for( ;; ) { AppDebug << "Sleeping for '" << App->sleepTime() << "' seconds." << endl; sleep( App->sleepTime() ); if( sem.islocked() ) { AppDebug << "sem LOCKED." << endl; if( ! lock.unlock() ) { AppError << lock.error() << endl; return( 1 ); } else { AppDebug << "read UNLOCKED." << endl; } if( ! sem.waitfor() ) { AppError << sem.error() << endl; } if( ! lock.lockread() ) { AppError << lock.error() << endl; return( 1 ); } else { AppDebug << "read LOCKED." << endl; } if( sem.islocked() ) { AppError << "still LOCKED!!!" << endl; return( 1 ); } AppDebug << "sem UNLOCKED." << endl; } } return( 0 ); }