plan 9 kernel history: overview | file list | diff list

1991/0606/gnot/lock.c (diff list | history)

gnot/lock.c on 1990/03091
1990/03091    
#include "u.h" 
#include "lib.h" 
#include "mem.h" 
#include "dat.h" 
#include "fns.h" 
1991/0606    
#include "errno.h" 
1990/03091    
 
1990/0617    
#define PCOFF -1 
1990/0403    
 
/* 
 *  N.B.  Ken's compiler generates a TAS instruction for the sequence: 
 * 
 *  	if(l->key >= 0){ 
 *		l->key |= 0x80; 
 *		... 
1990/0601    
 * 
 *	DO NOT TAKE THE ADDRESS OF l->key or the TAS will disappear. 
1990/0403    
 */ 
1990/03091    
void 
lock(Lock *l) 
{ 
1990/1226    
	Lock *ll = l;	/* do NOT take the address of ll */ 
1990/03091    
	int i; 
 
	/* 
	 * Try the fast grab first 
	 */ 
1990/0705    
    	if(ll->key >= 0){ 
		ll->key |= 0x80; 
		ll->pc = ((ulong*)&l)[PCOFF]; 
1990/03091    
		return; 
	} 
	for(i=0; i<10000000; i++) 
1990/0705    
    		if(ll->key >= 0){ 
			ll->key |= 0x80; 
			ll->pc = ((ulong*)&l)[PCOFF]; 
1990/03091    
			return; 
1990/0601    
		} 
1990/0705    
	ll->key = 0; 
1991/0109    
	print("lock loop %lux pc %lux held by pc %lux\n", l, ((ulong*)&l)[PCOFF], l->pc); 
1990/03091    
} 
 
int 
canlock(Lock *l) 
{ 
1990/1226    
	Lock *ll = l;	/* do NOT take the address of ll */ 
1990/0705    
	if(ll->key >= 0){ 
		ll->key |= 0x80; 
		ll->pc = ((ulong*)&l)[PCOFF]; 
1990/03091    
		return 1; 
	} 
	return 0; 
} 
 
void 
unlock(Lock *l) 
{ 
	l->pc = 0; 
1990/0403    
	l->key = 0; 
1991/0606    
} 
 
void 
mklockseg(Seg *s) 
{ 
	error(Esegaddr); 
1990/03091    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)