## diffname port/taslock.c 1992/0222 ## diff -e /dev/null /n/bootesdump/1992/0222/sys/src/9/port/taslock.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "../port/error.h" void lock(Lock *l) { Lock *ll = l; int i; ulong pc; pc = getcallerpc(((uchar*)&l) - sizeof(l)); for(i = 0; i < 1000000; i++){ if (tas(&ll->key) == 0){ if(u) u->p->hasspin = 1; ll->pc = pc; return; } if(u && u->p->state == Running) sched(); } i = l->key; l->key = 0; panic("lock loop 0x%lux key 0x%lux pc 0x%lux held by pc 0x%lux\n", l, i, pc, l->pc); } int canlock(Lock *l) { if(tas(&l->key)) return 0; l->pc = getcallerpc(((uchar*)&l) - sizeof(l)); if(u && u->p) u->p->hasspin = 1; return 1; } void unlock(Lock *l) { l->pc = 0; l->key = 0; if(u && u->p) u->p->hasspin = 0; } . ## diffname port/taslock.c 1992/0321 ## diff -e /n/bootesdump/1992/0222/sys/src/9/port/taslock.c /n/bootesdump/1992/0321/sys/src/9/port/taslock.c 2c #include "../port/lib.h" . ## diffname port/taslock.c 1992/0428 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/taslock.c /n/bootesdump/1992/0428/sys/src/9/port/taslock.c 16c if(l == 0){ print("pc= %lux", pc); for(;;); } . ## diffname port/taslock.c 1992/0602 ## diff -e /n/bootesdump/1992/0428/sys/src/9/port/taslock.c /n/bootesdump/1992/0602/sys/src/9/port/taslock.c 27,28c spinner++; spinpc = pc; . 16,19c if (tas(&ll->key) == 0){ if(u) u->p->hasspin = 1; ll->pc = pc; return; } . 7a ulong spinner; ulong spinpc; . ## diffname port/taslock.c 1992/0905 ## diff -e /n/bootesdump/1992/0602/sys/src/9/port/taslock.c /n/bootesdump/1992/0905/sys/src/9/port/taslock.c 32,33d 19,25c for(i = 0; i < 10000000; i++){ . 8,10d ## diffname port/taslock.c 1992/0912 ## diff -e /n/bootesdump/1992/0905/sys/src/9/port/taslock.c /n/bootesdump/1992/0912/sys/src/9/port/taslock.c 16c for(i = 0; i < 100000000; i++){ . ## diffname port/taslock.c 1992/0913 ## diff -e /n/bootesdump/1992/0912/sys/src/9/port/taslock.c /n/bootesdump/1992/0913/sys/src/9/port/taslock.c 44a int s; . ## diffname port/taslock.c 1992/0914 ## diff -e /n/bootesdump/1992/0913/sys/src/9/port/taslock.c /n/bootesdump/1992/0914/sys/src/9/port/taslock.c 45,46d 26,28c panic("lock loop 0x%lux key 0x%lux pc 0x%lux held by pc 0x%lux\n", l->key, i, pc, l->pc); . 24d 20c l->pc = pc; . 16,17c for(i = 0; i < 10000000; i++){ if (tas(&l->key) == 0){ . 11d ## diffname port/taslock.c 1993/0501 ## diff -e /n/bootesdump/1992/0914/sys/src/9/port/taslock.c /n/fornaxdump/1993/0501/sys/src/brazil/port/taslock.c 45,46d 35,36d 18,19d ## diffname port/taslock.c 1993/0525 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/taslock.c /n/fornaxdump/1993/0525/sys/src/brazil/port/taslock.c 24c i, l->key, pc, l->pc); . 22d ## diffname port/taslock.c 1993/0528 ## diff -e /n/fornaxdump/1993/0525/sys/src/brazil/port/taslock.c /n/fornaxdump/1993/0528/sys/src/brazil/port/taslock.c 16c for(i = 0; i < 20000000; i++){ . ## diffname port/taslock.c 1993/0830 ## diff -e /n/fornaxdump/1993/0528/sys/src/brazil/port/taslock.c /n/fornaxdump/1993/0830/sys/src/brazil/port/taslock.c 22,23d 20d 11,18c for(;;){ while(l->key) ; if(tas(&l->key) == 0) . ## diffname port/taslock.c 1993/1204 ## diff -e /n/fornaxdump/1993/0830/sys/src/brazil/port/taslock.c /n/fornaxdump/1993/1204/sys/src/brazil/port/taslock.c 10a if(tas(&l->key) == 0) return; . ## diffname port/taslock.c 1994/0322 ## diff -e /n/fornaxdump/1993/1204/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0322/sys/src/brazil/port/taslock.c 34a } void iunlock(Lock *l) { ulong sr; sr = l->sr; l->key = 0; splx(sr); . 33d 26c . 20a void ilock(Lock *l) { l->sr = splhi(); if(tas(&l->key) == 0) return; for(;;){ while(l->key) ; if(tas(&l->key) == 0) return; } } . 12a . ## diffname port/taslock.c 1994/0323 ## diff -e /n/fornaxdump/1994/0322/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0323/sys/src/brazil/port/taslock.c 33a } . 32c if(tas(&l->key) == 0){ l->sr = x; . 27a } . 25,26c ulong x; x = splhi(); if(tas(&l->key) == 0){ l->sr = x; . ## diffname port/taslock.c 1994/0507 ## diff -e /n/fornaxdump/1994/0323/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0507/sys/src/brazil/port/taslock.c 32c /* print("ilock loop %lux\n", getcallerpc(0)); */ . ## diffname port/taslock.c 1994/0516 ## diff -e /n/fornaxdump/1994/0507/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0516/sys/src/brazil/port/taslock.c 32c print("ilock loop %lux\n", getcallerpc(0)); . ## diffname port/taslock.c 1994/0525 ## diff -e /n/fornaxdump/1994/0516/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0525/sys/src/brazil/port/taslock.c 32c . ## diffname port/taslock.c 1994/0805 ## diff -e /n/fornaxdump/1994/0525/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0805/sys/src/brazil/port/taslock.c 15,16c while(l->key) { if(loop-- <= 0) { dumpstack(); panic("lock loop: lock %lux\n", l); } } . 13a loop = 50000000; . 10a int loop; . ## diffname port/taslock.c 1994/0808 ## diff -e /n/fornaxdump/1994/0805/sys/src/brazil/port/taslock.c /n/fornaxdump/1994/0808/sys/src/brazil/port/taslock.c 18,23c while(l->key) ; . 16d 11,12d ## diffname port/taslock.c 1995/0108 ## diff -e /n/fornaxdump/1994/0808/sys/src/brazil/port/taslock.c /n/fornaxdump/1995/0108/sys/src/brazil/port/taslock.c 55a if(up) { n = up->inlock-2; if(n < 0) n = 0; up->inlock = n; } . 54a int n; . 13d 10a int n; if(up) { n = up->inlock+2; up->inlock = n; if(tas(&l->key) == 0) return; for(;;){ while(l->key) if(conf.nproc == 1) { up->yield = 1; sched(); } up->inlock = n; if(tas(&l->key) == 0) return; } } . ## diffname port/taslock.c 1995/0109 ## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/port/taslock.c /n/fornaxdump/1995/0109/sys/src/brazil/port/taslock.c 91c unlock(l); . 85a ilock(Lock *l) { ulong sr; sr = splhi(); lock(l); l->sr = sr; } void . 82a l->key = 0; . 76d 67d 62,64d 60d 58a return 1; . 46,57c if(up) { n = up->inlock; up->inlock = n+2; if(tas(&l->key)) { up->inlock = n; return 0; . 44c int n; . 41,42c int canlock(Lock *l) . ## diffname port/taslock.c 1995/0110 ## diff -e /n/fornaxdump/1995/0109/sys/src/brazil/port/taslock.c /n/fornaxdump/1995/0110/sys/src/brazil/port/taslock.c 91c l->key = 0; . 76,85d 64,71d 57a . 44,55d 37a } . 36c if(tas(&l->key) == 0){ l->sr = x; . 32a } . 31c void ilock(Lock *l) { ulong x; x = splhi(); if(tas(&l->key) == 0){ l->sr = x; . 29a } . 18,28d 13,15c for(;;){ while(l->key) ; . 11c if(tas(&l->key) == 0) return; . ## diffname port/taslock.c 1995/1009 ## diff -e /n/fornaxdump/1995/0110/sys/src/brazil/port/taslock.c /n/fornaxdump/1995/1009/sys/src/brazil/port/taslock.c 48a l->pc = getcallerpc(l); . 37a l->pc = pc; . 29a l->pc = pc; . 26a pc = getcallerpc(l); . 25a ulong pc; . 18a } . 16,17c if(i++ > 10000000) panic("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux\n", l->key, getcallerpc(l), l->pc); if(tas(&l->key) == 0){ l->pc = pc; . 14a i = 0; . 12a } . 11c int i; ulong pc; pc = getcallerpc(l); if(tas(&l->key) == 0){ l->pc = pc; . ## diffname port/taslock.c 1995/1014 ## diff -e /n/fornaxdump/1995/1009/sys/src/brazil/port/taslock.c /n/fornaxdump/1995/1014/sys/src/brazil/port/taslock.c 82a l->pc = 0; . 73a l->pc = 0; . 24,26c if(i++ > 100000000) panic("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux pl 0x%lux\n", l->key, pc, l->pc, splhi()); . ## diffname port/taslock.c 1995/1030 ## diff -e /n/fornaxdump/1995/1014/sys/src/brazil/port/taslock.c /n/fornaxdump/1995/1030/sys/src/brazil/port/taslock.c 66a l->pid = up ? up->pid : 0; . 54a l->pid = pid; . 45a l->pid = pid; . 40a pid = up ? up->pid : 0; . 38c ulong pc, pid; . 28a l->pid = pid; . 24,26c if(i++ > 100000000){ i = 0; lockloop(l, pc); } . 17a l->pid = pid; . 14a pid = up ? up->pid : 0; . 12c ulong pc, pid; . 8a lockloop(Lock *l, ulong pc) { print("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux proc %d\n", l->key, pc, l->pc, l->pid); dumpaproc(up); } void . ## diffname port/taslock.c 1996/0511 ## diff -e /n/fornaxdump/1995/1030/sys/src/brazil/port/taslock.c /n/fornaxdump/1996/0511/sys/src/brazil/port/taslock.c 90a l->key = 0; if(up != 0) up->priority = p; . 89c int p; p = l->pri; . 81,82c SET(pri); if(up) { pri = up->priority; up->priority = PriLock; } if(tas(&l->key)) { up->priority = pri; l->pc = getcallerpc(l); return 0; } l->pri = pri; . 78,79c int pri; . 43a lockloop(l, pc); . 42a if(conf.nmach == 1 && up->state == Running && (getstatus()&IE)) sched(); . 40d 38a l->pri = pri; . 31,37c pri = up->priority; up->priority = PriLock; for(i=0; i<1000; i++){ . 25,27c if(up == 0) { for(i=0; i<1000000; i++) if(tas(&l->key) == 0){ l->pc = pc; return; } lockloop(l, pc); . 23d 19,20c int pri, i; ulong pc; . ## diffname port/taslock.c 1996/0516 ## diff -e /n/fornaxdump/1996/0511/sys/src/brazil/port/taslock.c /n/fornaxdump/1996/0516/sys/src/brazil/port/taslock.c 105,106c l->pri = 0; . 100,102d 89d 86,87c else pri = 0; . 83,84c if(up) . 46a up->lockpri = 0; /* back to normal priority */ . 39a up->lockpri = 0; /* back to normal priority */ . 37a up->lockpri = l->pri; /* assume priority of process holding lock */ . 35d 33a /* priority interacts with code in ready() in proc.c */ . 27a l->pri = 0; . ## diffname port/taslock.c 1996/0517 ## diff -e /n/fornaxdump/1996/0516/sys/src/brazil/port/taslock.c /n/fornaxdump/1996/0517/sys/src/brazil/port/taslock.c 38c for(i=0; i<1000000; i++){ . ## diffname port/taslock.c 1996/0522 ## diff -e /n/fornaxdump/1996/0517/sys/src/brazil/port/taslock.c /n/fornaxdump/1996/0522/sys/src/brazil/port/taslock.c 114a l->pri = 0; . 103a l->pc = 0; . 102d 95d 93a l->pc = getcallerpc(l); if(up){ l->pid = up->pid; l->pri = up->priority; } else { l->pid = 0; l->pri = 0; . 85,92c if(tas(&l->key)) . 76a l->pri = 0; . 66a l->pri = 0; . 49,50d 46,47d 43a l->pid = pid; l->pri = pri; up->lockpri = 0; . 41,42d 38,39c /* possible priority inversion, try switching priority */ if(up && up->state == Running) if(getstatus()&IE) { print("priority inversion\n"); up->lockpri = l->pri; sched(); } } . 35,36c spins = 0; for(;;){ i = 0; while(l->key) if(i++ > SPINLOOP){ /* look for lock loops */ if(spins++ > LOCKLOOP/SPINLOOP){ spins = 0; lockloop(l, pc); } . 24,31c /* quick try, it might work */ if(tas(&l->key) == 0){ l->pc = pc; l->pid = pid; l->pri = pri; . 22a if(up){ pid = up->pid; pri = up->priority; } else { pid = 0; pri = 0; } . 19,20c int i, pri, spins; ulong pc, pid; . 15a #define LOCKLOOP 100000000 /* to detect a lock loop */ #define SPINLOOP 10000000 /* to keep tas's off the bus */ . ## diffname port/taslock.c 1996/0523 ## diff -e /n/fornaxdump/1996/0522/sys/src/brazil/port/taslock.c /n/fornaxdump/1996/0523/sys/src/brazil/port/taslock.c 136d 125d 110,116c l->pid = up ? up->pid : 0; . 97d 86d 65,66c if(up) up->lockpri = 0; . 61d 46,59c if(i++ > 100000000){ i = 0; lockloop(l, pc); . 42d 38d 34d 26,32c pid = up ? up->pid : 0; . 22c int i; . 16,18d 13a /* lower priority till we get the lock */ if(up && up->state == Running && (getstatus()&IE)){ up->lockpri = 1; sched(); } . ## diffname port/taslock.c 1997/0220 ## diff -e /n/fornaxdump/1996/0523/sys/src/brazil/port/taslock.c /n/emeliedump/1997/0220/sys/src/brazil/port/taslock.c 109a coherence(); . 98a coherence(); . ## diffname port/taslock.c 1997/0327 ## diff -e /n/emeliedump/1997/0220/sys/src/brazil/port/taslock.c /n/emeliedump/1997/0327/sys/src/brazil/port/taslock.c 109a l->key = 0; . 108d 98a l->key = 0; . 97d 16c if(up && up->state == Running && islo()){ . ## diffname port/taslock.c 1997/0409 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/taslock.c /n/emeliedump/1997/0409/sys/src/brazil/port/taslock.c 73a #else { int i; i = 0; while(l->key){ if(i++ > 100000000) panic("ilock loop: caller pc %luX, held by %luX\n", pc, l->pc); } } #endif /* notdef */ . 71a #ifdef notdef . ## diffname port/taslock.c 1997/0411 ## diff -e /n/emeliedump/1997/0409/sys/src/brazil/port/taslock.c /n/emeliedump/1997/0411/sys/src/brazil/port/taslock.c 75,83d 72d ## diffname port/taslock.c 1998/0228 ## diff -e /n/emeliedump/1997/0411/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0228/sys/src/brazil/port/taslock.c 73a x = splhi(); . 71a splx(x); . ## diffname port/taslock.c 1998/0522 ## diff -e /n/emeliedump/1998/0228/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0522/sys/src/brazil/port/taslock.c 98a if(l->key == 0) print("unlock: not locked: pc %uX\n", getcallerpc(l)); . 70a if(conf.nmach < 2) panic("ilock: no way out: pc %uX\n", pc); . ## diffname port/taslock.c 1998/0603 ## diff -e /n/emeliedump/1998/0522/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0603/sys/src/brazil/port/taslock.c 113a if(l->key == 0) print("iunlock: not locked: pc %uX\n", getcallerpc(l)); . ## diffname port/taslock.c 1998/0604 ## diff -e /n/emeliedump/1998/0603/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0604/sys/src/brazil/port/taslock.c 115a if(!l->isilock) print("unlock of ilock: pc %lux, held by %lux\n", getcallerpc(l), l->pc); . 105a if(up && p < up->priority) up->priority = p; . 103a if(l->isilock) print("iunlock of lock: pc %lux, held by %lux\n", getcallerpc(l), l->pc); . 101a int p; p = l->pri; . 95c l->p = up; l->isilock = 0; if(up){ l->pri = up->priority; up->priority = PriLock; } . 82c l->p = up; l->isilock = 1; . 67c l->p = up; l->isilock = 1; . 61d 58c ulong pc; . 46,48c l->p = up; l->isilock = 0; if(up){ l->pri = up->priority; up->priority = PriLock; } . 43a } . 39,42c while(l->key){ if(conf.nmach < 2){ if(i++ > 1000){ i = 0; lockloop(l, pc); } sched(); } else { if(i++ > 100000000){ i = 0; lockloop(l, pc); } . 33c l->p = up; l->isilock = 0; if(up){ l->pri = up->priority; up->priority = PriLock; } . 29d 26c ulong pc; . 19d 15,17c if(up && up->state == Running && islo()) . 12c l->key, pc, l->pc, l->p ? l->p->pid : 0); . ## diffname port/taslock.c 1998/0605 ## diff -e /n/emeliedump/1998/0604/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0605/sys/src/brazil/port/taslock.c 147a if(up) { if (--up->nlocks < 0) print("number of locks < 0: pc %lux, held by %lux\n", getcallerpc(l), l->pc); } . 130,131c if(up) { if (up != l->p) { print("different unlocker 0x%lux pc 0x%lux held by pc 0x%lux proc %d\n", l->key, pc, l->pc, l->p ? l->p->pid : 0); dumpaproc(up); } if (--up->nlocks < 0) print("number of locks < 0: pc %lux, held by %lux\n", getcallerpc(l), l->pc); if (p < up->priority) up->priority = p; } . 122a pc = getcallerpc(l); . 121a ulong pc; . 111a up->nlocks++; . 92a if (up) up->nlocks++; . 76a if (up) up->nlocks++; . 58a up->nlocks++; . 31a up->nlocks++; . ## diffname port/taslock.c 1998/0606 ## diff -e /n/emeliedump/1998/0605/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0606/sys/src/brazil/port/taslock.c 174a m->splpc = getcallerpc(l); splxpc(sr); . 168,173d 140,151d 131,133d 128,129d 117,121d 102a if(cansched){ up->lockwait = 0; up->priority = oldpri; } . 97,98d 91a lockstats.inglare++; . 87a lockstats.glare++; cansched = up != nil && up->state == Running; if(cansched){ oldpri = up->priority; up->lockwait = 1; up->priority = PriLock; } else oldpri = 0; . 79,80d 75a lockstats.locks++; . 73c ulong pc, oldpri; int cansched; . 59,62c if(cansched){ up->lockwait = 0; up->priority = oldpri; . 42c if(conf.nmach < 2 && cansched){ . 39a lockstats.inglare++; . 38a lockstats.glare++; cansched = up != nil && up->state == Running; if(cansched){ oldpri = up->priority; up->lockwait = 1; up->priority = PriLock; } else oldpri = 0; . 31,35d 26a lockstats.locks++; . 22,23c int i, cansched; ulong pc, oldpri; . 13a if(p != nil) dumpaproc(p); . 12c l->key, pc, l->pc, p ? p->pid : 0); . 10a Proc *p; p = l->p; . 7a struct { ulong locks; ulong glare; ulong inglare; } lockstats; . ## diffname port/taslock.c 1998/0825 ## diff -e /n/emeliedump/1998/0606/sys/src/brazil/port/taslock.c /n/emeliedump/1998/0825/sys/src/brazil/port/taslock.c 166c print("iunlock: not locked: pc %luX\n", getcallerpc(l)); . 152c print("unlock: not locked: pc %luX\n", getcallerpc(l)); . 20c print("lock loop key 0x%lux pc 0x%lux held by pc 0x%lux proc %lud\n", . ## diffname port/taslock.c 1999/0319 ## diff -e /n/emeliedump/1998/0825/sys/src/brazil/port/taslock.c /n/emeliedump/1999/0319/sys/src/brazil/port/taslock.c 113c panic("ilock: no way out: pc %uX held by %uX\n", pc, l->pc); . ## diffname port/taslock.c 1999/0402 ## diff -e /n/emeliedump/1999/0319/sys/src/brazil/port/taslock.c /n/emeliedump/1999/0402/sys/src/brazil/port/taslock.c 113c panic("ilock: no way out: pc %uX\n", pc); . ## diffname port/taslock.c 1999/0501 ## diff -e /n/emeliedump/1999/0402/sys/src/brazil/port/taslock.c /n/emeliedump/1999/0501/sys/src/brazil/port/taslock.c 175c m->splpc = getcallerpc(&l); . 168c print("unlock of ilock: pc %lux, held by %lux\n", getcallerpc(&l), l->pc); . 166c print("iunlock: not locked: pc %luX\n", getcallerpc(&l)); . 154c print("iunlock of lock: pc %lux, held by %lux\n", getcallerpc(&l), l->pc); . 152c print("unlock: not locked: pc %luX\n", getcallerpc(&l)); . 141c l->pc = getcallerpc(&l); . 92c pc = getcallerpc(&l); . 36c pc = getcallerpc(&l); . ## diffname port/taslock.c 1999/0710 ## diff -e /n/emeliedump/1999/0501/sys/src/brazil/port/taslock.c /n/emeliedump/1999/0710/sys/src/brazil/port/taslock.c 168c print("iunlock of lock: pc %lux, held by %lux\n", getcallerpc(&l), l->pc); . 154c print("unlock of ilock: pc %lux, held by %lux\n", getcallerpc(&l), l->pc); . ## diffname port/taslock.c 1999/0810 ## diff -e /n/emeliedump/1999/0710/sys/src/brazil/port/taslock.c /n/emeliedump/1999/0810/sys/src/brazil/port/taslock.c 104a if(l->glare++ > 10000){ print("glare %lux\n", l); l->glare = 0; } . ## diffname port/taslock.c 1999/0811 ## diff -e /n/emeliedump/1999/0810/sys/src/brazil/port/taslock.c /n/emeliedump/1999/0811/sys/src/brazil/port/taslock.c 120c lockstats.inglare++; . 104,108c lockstats.glare++; . 93c lockstats.locks++; . 56c lockstats.inglare++; . 46c lockstats.glare++; . 38c lockstats.locks++; . ## diffname port/taslock.c 2000/1101 ## diff -e /n/emeliedump/1999/0811/sys/src/brazil/port/taslock.c /n/emeliedump/2000/1101/sys/src/9/port/taslock.c 19a { ulong x = (ulong)p; uchar *cp; int i; if(x < KTZERO) { cp = (uchar*)l; for(i = 0; i < 64; i++) print("%2.2ux ", cp[i]); print("\n"); } } . ## diffname port/taslock.c 2000/1106 ## diff -e /n/emeliedump/2000/1101/sys/src/9/port/taslock.c /n/emeliedump/2000/1106/sys/src/9/port/taslock.c 123a } . 122a { dumplockmem("ilock:", l); . 20,29d 13a static void dumplockmem(char *tag, Lock *l) { uchar *cp; int i; iprint("%s: ", tag); cp = (uchar*)l; for(i = 0; i < 64; i++) iprint("%2.2ux ", cp[i]); iprint("\n"); } . ## diffname port/taslock.c 2001/0127 ## diff -e /n/emeliedump/2000/1106/sys/src/9/port/taslock.c /n/emeliedump/2001/0127/sys/src/9/port/taslock.c 189c //coherence(); . 173c //coherence(); . ## diffname port/taslock.c 2001/0314 ## diff -e /n/emeliedump/2001/0127/sys/src/9/port/taslock.c /n/emeliedump/2001/0314/sys/src/9/port/taslock.c 189c coherence(); . 173c coherence(); . ## diffname port/taslock.c 2001/0527 ## diff -e /n/emeliedump/2001/0314/sys/src/9/port/taslock.c /n/emeliedump/2001/0527/sys/src/9/port/taslock.c 33,34c print("lock 0x%lux loop key 0x%lux pc 0x%lux held by pc 0x%lux proc %lud\n", l, l->key, pc, l->pc, p ? p->pid : 0); . ## diffname port/taslock.c 2001/0920 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/taslock.c /n/emeliedump/2001/0920/sys/src/9/port/taslock.c 32a print("lock loop %p\n", l); delay(1000); . ## diffname port/taslock.c 2002/0114 ## diff -e /n/emeliedump/2001/0920/sys/src/9/port/taslock.c /n/emeliedump/2002/0114/sys/src/9/port/taslock.c 130c panic("ilock: no way out: pc %luX\n", pc); . ## diffname port/taslock.c 2002/0315 ## diff -e /n/emeliedump/2002/0114/sys/src/9/port/taslock.c /n/emeliedump/2002/0315/sys/src/9/port/taslock.c 175a if (l->edfwaiting) edf_releaselock(l); . 168d 145c up->lockwait = nil; . 123c up->lockwait = l; . 92c up->lockwait = nil; . 74,75c if (isedf(up)){ /* Edf process waiting for a lock; process holding lock will not * be scheduled unless we give up the processor. We give up * the processor, but make sure we get awoken when the lock * is released */ if (edf_waitlock(l)) sched(); } else if(conf.nmach < 2 && cansched){ if (i++ > 1000){ . 66a up->lockwait = l; . 65d 6a #include "../port/edf.h" . ## diffname port/taslock.c 2002/0322 ## diff -e /n/emeliedump/2002/0315/sys/src/9/port/taslock.c /n/emeliedump/2002/0322/sys/src/9/port/taslock.c 84c if (i++ > 5000){ . ## diffname port/taslock.c 2002/0328 ## diff -e /n/emeliedump/2002/0322/sys/src/9/port/taslock.c /n/emeliedump/2002/0328/sys/src/9/port/taslock.c 184,185d 75,84c if(conf.nmach < 2 && cansched){ if (i++ > 1000){ . ## diffname port/taslock.c 2002/0402 ## diff -e /n/emeliedump/2002/0328/sys/src/9/port/taslock.c /n/emeliedump/2002/0402/sys/src/9/port/taslock.c 174a if (up && --up->nlocks == 0 && up->delaysched){ up->delaysched = 0; sched(); } . 172a if(l->p != up) print("unlock: up changed: pc %lux, acquired at pc %lux, lock p 0x%p, unlock up 0x%p\n", getcallerpc(&l), l->pc, l->p, up); // decpcref(l); . 160a // incpcref(l); . 159a if (up) up->lastlock = l; . 158a } . 157c if (up) up->nlocks++; if(tas(&l->key)){ if (up) up->nlocks--; . 140a if (up) up->lastlock = l; . 132c } . 128,130c if(conf.nmach < 2){ dumplockmem("ilock:", l); . 112a if (up) up->lastlock = l; . 97a if (up) up->nlocks--; . 89a // incpcref(l); . 88a if (up) up->lastlock = l; . 87a if (up) up->nlocks++; . 60a if (up) up->nlocks--; /* didn't get the lock, allow scheding */ . 56a // incpcref(l); . 55a if (up) up->lastlock = l; . 54c lockstats.locks++; /* prevent being scheded */ if (up) up->nlocks++; . 14a typedef struct PC { ulong pc; int count; } PC; PC lpcs[1024]; void incpcref(Lock *l) { int i; for(i = 0; i < nelem(lpcs)-1; i++){ if(lpcs[i].pc == l->pc) break; if(lpcs[i].pc == 0){ lpcs[i].pc = l->pc; break; } } lpcs[i].count++; } void decpcref(Lock *l) { int i; for(i = 0; i < nelem(lpcs)-1; i++){ if(lpcs[i].pc == l->pc) break; if(lpcs[i].pc == 0){ lpcs[i].pc = l->pc; break; } } lpcs[i].count--; } . 7d ## diffname port/taslock.c 2002/0403 ## diff -e /n/emeliedump/2002/0402/sys/src/9/port/taslock.c /n/emeliedump/2002/0403/sys/src/9/port/taslock.c 248c l->pc = ~1; . 227,228c l->pc = ~0; . 212d 210c if(up) up->lastlock = l; . 206c if(up) up->nlocks--; . 204c if(up) up->nlocks++; . 192,195d 168,174d 159c if(up) up->lastlock = l; . 151,152c ulong pc; . 143c if(up) up->nlocks--; . 137,141c return 1; . 134d 132c if(up) up->lastlock = l; . 130c if(up) up->nlocks++; . 117,127c if(i++ > 100000000){ i = 0; lockloop(l, pc); . 105,112d 102c if(up) up->nlocks--; /* didn't get the lock, allow scheding */ . 100c return 0; . 97d 92,93c lockstats.locks++; if(up) up->nlocks++; /* prevent being scheded */ . 87,88c int i; ulong pc; . 84c int . 72,73d 14,52d 8c struct { . ## diffname port/taslock.c 2002/0404 ## diff -e /n/emeliedump/2002/0403/sys/src/9/port/taslock.c /n/emeliedump/2002/0404/sys/src/9/port/taslock.c 181d 161d 123c if(up) up->lastlock = l; . 87a return 0; /* For the compiler */ . 56c if(up) up->lastlock = l; . ## diffname port/taslock.c 2002/0406 ## diff -e /n/emeliedump/2002/0404/sys/src/9/port/taslock.c /n/emeliedump/2002/0406/sys/src/9/port/taslock.c 169d 165c coherence(); /* give up the processor if ... */ if(up && --up->nlocks == 0 /* we've closed the last nexted lock */ && up->delaysched /* we delayed scheduling because of the lock */ && up->state == Running){ /* we're in running state */ . ## diffname port/taslock.c 2002/0413 ## diff -e /n/emeliedump/2002/0406/sys/src/9/port/taslock.c /n/emeliedump/2002/0413/sys/src/9/port/taslock.c 170,172c && up->state == Running){ /* we're in running state */ if(!islo()) buggeredsched++; else{ up->delaysched = 0; sched(); } . 168c if(up && --up->nlocks == 0 /* we've closed the last nested lock */ . 154a int buggeredsched; . ## diffname port/taslock.c 2002/0414 ## diff -e /n/emeliedump/2002/0413/sys/src/9/port/taslock.c /n/emeliedump/2002/0414/sys/src/9/port/taslock.c 168,178c if(up) --up->nlocks; . 155d ## diffname port/taslock.c 2002/0416 ## diff -e /n/emeliedump/2002/0414/sys/src/9/port/taslock.c /n/emeliedump/2002/0416/sys/src/9/port/taslock.c 167,168c /* give up the processor if ... */ if(up && --up->nlocks == 0 /* we've closed the last nexted lock */ && up->delaysched /* we delayed scheduling because of the lock */ && up->state == Running){ /* we're in running state */ up->delaysched = 0; sched(); } . ## diffname port/taslock.c 2002/0418 ## diff -e /n/emeliedump/2002/0416/sys/src/9/port/taslock.c /n/emeliedump/2002/0418/sys/src/9/port/taslock.c 184a if(islo()) print("iunlock while lo: pc %lux, held by %lux\n", getcallerpc(&l), l->pc); . ## diffname port/taslock.c 2002/0420 ## diff -e /n/emeliedump/2002/0418/sys/src/9/port/taslock.c /n/emeliedump/2002/0420/sys/src/9/port/taslock.c 192a m->ilockdepth--; . 167,173c if(up) --up->nlocks; . 101a m->ilockdepth++; . 39,41d ## diffname port/taslock.c 2002/0421 ## diff -e /n/emeliedump/2002/0420/sys/src/9/port/taslock.c /n/emeliedump/2002/0421/sys/src/9/port/taslock.c 122a m->ilockdepth++; . 100a m->ilockdepth++; . 99d ## diffname port/taslock.c 2002/0626 ## diff -e /n/emeliedump/2002/0421/sys/src/9/port/taslock.c /n/emeliedump/2002/0626/sys/src/9/port/taslock.c 125c up->lastilock = l; . 102c up->lastilock = l; . ## diffname port/taslock.c 2002/0925 ## diff -e /n/emeliedump/2002/0626/sys/src/9/port/taslock.c /n/emeliedump/2002/0925/sys/src/9/port/taslock.c 187a if(up) up->lastilock = nil; . ## diffname port/taslock.c 2003/0405 ## diff -e /n/emeliedump/2002/0925/sys/src/9/port/taslock.c /n/emeliedump/2003/0405/sys/src/9/port/taslock.c 82a if(l->key == 0x55555555) panic("lock(7): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 74a if(l->key == 0x55555555) panic("lock(6): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 72a if(l->key == 0x55555555) panic("lock(5): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 70a if(l->key == 0x55555555) panic("lock(4): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 69a if(l->key == 0x55555555) panic("lock(3): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 66a if(l->key == 0x55555555) panic("lock(2): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 59a if(l->key == 0x55555555) panic("lock(1a): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 51a if(l->key == 0x55555555) panic("lock(1): l %p, key 5*, pc %.lux, %p\n", l, pc, _l); . 45a Lock *_l = l; . ## diffname port/taslock.c 2003/0418 ## diff -e /n/emeliedump/2003/0405/sys/src/9/port/taslock.c /n/emeliedump/2003/0418/sys/src/9/port/taslock.c 98,99d 88,89d 84,85d 80,81d 77,78d 72,73d 63,64d 53,54d 46d