# HG changeset patch # User John Floren # Date 1328740711 0 # Node ID 34ea01195f9f3c474ccda369eefcf36aa2cc816f # Parent 29403dfab2b1296d30ab2d13a911baec90fa0845 sysproc.c: restore tsemacquire to its former glory R=nix-dev CC=nemo, nix-dev, nixiedev http://codereview.appspot.com/5644061 diff -r 29403dfab2b1 -r 34ea01195f9f sys/src/nix/port/sysproc.c --- a/sys/src/nix/port/sysproc.c Wed Feb 08 22:33:03 2012 +0100 +++ b/sys/src/nix/port/sysproc.c Wed Feb 08 22:38:31 2012 +0000 @@ -1180,6 +1180,53 @@ return 1; } +/* Acquire semaphore or time-out */ +static int +tsemacquire(Segment* s, int* addr, ulong ms) +{ + int acquired; + Sema phore; + int timedout; + ulong t; + + if(canacquire(addr)) + return 1; + if(ms == 0) + return 0; + + acquired = 0; + timedout = 0; + semqueue(s, addr, &phore); + for(;;){ + phore.waiting = 1; + coherence(); + if(canacquire(addr)){ + acquired = 1; + break; + } + if(waserror()) + break; + t = m->ticks; + tsleep(&phore, semawoke, &phore, ms); + if(TK2MS(m->ticks-t) >= ms) { + timedout = 1; + poperror(); + break; + } + ms -= TK2MS(m->ticks-t); + poperror(); + } + semdequeue(s, &phore); + coherence(); /* not strictly necessary due to lock in semdequeue */ + if(!phore.waiting) + semwakeup(s, addr, 1); + if(timedout) + return 0; + if(!acquired) + nexterror(); + return 1; +} + void syssemacquire(Ar0* ar0, va_list list) { @@ -1205,6 +1252,30 @@ } void +systsemacquire(Ar0* ar0, va_list list) +{ + Segment *s; + int *addr, ms; + + /* + * int tsemacquire(long* addr, ulong ms); + * should be (and will be implemented below as) perhaps + * int tsemacquire(int* addr, ulong ms); + */ + addr = va_arg(list, int*); + addr = validaddr(addr, sizeof(int), 1); + evenaddr(PTR2UINT(addr)); + ms = va_arg(list, ulong); + + if((s = seg(up, PTR2UINT(addr), 0)) == nil) + error(Ebadarg); + if(*addr < 0) + error(Ebadarg); + + ar0->i = tsemacquire(s, addr, ms); +} + +void syssemrelease(Ar0* ar0, va_list list) { Segment *s;