|
|
1.1 ! root 1: #include "u.h" ! 2: #include "../port/lib.h" ! 3: #include "mem.h" ! 4: #include "dat.h" ! 5: #include "fns.h" ! 6: #include "../port/error.h" ! 7: ! 8: void ! 9: lock(Lock *l) ! 10: { ! 11: int i; ! 12: ulong pc; ! 13: ! 14: pc = getcallerpc(((uchar*)&l) - sizeof(l)); ! 15: ! 16: for(i = 0; i < 10000000; i++){ ! 17: if (tas(&l->key) == 0){ ! 18: if(u) ! 19: u->p->hasspin = 1; ! 20: l->pc = pc; ! 21: return; ! 22: } ! 23: } ! 24: l->key = 0; ! 25: panic("lock loop 0x%lux key 0x%lux pc 0x%lux held by pc 0x%lux\n", ! 26: l->key, i, pc, l->pc); ! 27: } ! 28: ! 29: void ! 30: ilock(Lock *l) ! 31: { ! 32: int i; ! 33: ulong pc; ! 34: ulong x; ! 35: ! 36: pc = getcallerpc(((uchar*)&l) - sizeof(l)); ! 37: ! 38: x = splhi(); ! 39: for(i = 0; i < 10000000; i++){ ! 40: if (tas(&l->key) == 0){ ! 41: l->pc = pc; ! 42: l->sr = x; ! 43: return; ! 44: } ! 45: } ! 46: l->key = 0; ! 47: splx(x); ! 48: panic("lock loop 0x%lux key 0x%lux pc 0x%lux held by pc 0x%lux\n", ! 49: l->key, i, pc, l->pc); ! 50: } ! 51: ! 52: int ! 53: canlock(Lock *l) ! 54: { ! 55: if(tas(&l->key)) ! 56: return 0; ! 57: l->pc = getcallerpc(((uchar*)&l) - sizeof(l)); ! 58: if(u && u->p) ! 59: u->p->hasspin = 1; ! 60: return 1; ! 61: } ! 62: ! 63: void ! 64: unlock(Lock *l) ! 65: { ! 66: l->pc = 0; ! 67: l->key = 0; ! 68: if(u && u->p) ! 69: u->p->hasspin = 0; ! 70: } ! 71: ! 72: void ! 73: iunlock(Lock *l) ! 74: { ! 75: ulong sr; ! 76: ! 77: sr = l->sr; ! 78: l->pc = 0; ! 79: l->key = 0; ! 80: splx(sr); ! 81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.