Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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 );
}