# HG changeset patch # User Akshat Kumar # Date 1328210964 0 # Node ID 40f21636c8e3b6303ca8e95ce24b3fd0a3136778 # Parent 35f5add268d315f5d2e9dcfaf493411a0775c924 Plan 9: tsemacquire. Forked tsemacquire from semacquire, leaving semacquire unchanged - for Plan 9. Changed syscall numbers to keep things aligned between nix and Plan 9. "For testing purposes only." R=nix-dev, rminnich, john, nemo CC=nix-dev http://codereview.appspot.com/5578051 Committer: John Floren diff -r 35f5add268d3 -r 40f21636c8e3 sys/src/9/port/syscallfmt.c --- a/sys/src/9/port/syscallfmt.c Fri Jan 27 21:45:14 2012 +0000 +++ b/sys/src/9/port/syscallfmt.c Thu Feb 02 19:29:24 2012 +0000 @@ -231,6 +231,11 @@ i[0] = va_arg(list, int); fmtprint(&fmt, "%#p %d", v, i[0]); break; + case TSEMACQUIRE: + v = va_arg(list, int*); + l = va_arg(list, ulong); + fmtprint(&fmt, "%#p %ld", v, l); + break; case SEEK: v = va_arg(list, vlong*); i[0] = va_arg(list, int); diff -r 35f5add268d3 -r 40f21636c8e3 sys/src/9/port/sysproc.c --- a/sys/src/9/port/sysproc.c Fri Jan 27 21:45:14 2012 +0000 +++ b/sys/src/9/port/sysproc.c Thu Feb 02 19:29:24 2012 +0000 @@ -180,7 +180,8 @@ if((flag&RFNOTEG) == 0) p->noteid = up->noteid; - p->fpstate = up->fpstate; + /* don't penalize the child, it hasn't done FP in a note handler. */ + p->fpstate = up->fpstate & ~FPillegal; pid = p->pid; memset(p->time, 0, sizeof(p->time)); p->time[TReal] = MACHP(0)->ticks; @@ -1030,6 +1031,54 @@ return 1; } +/* Acquire semaphore or timeout */ +static int +tsemacquire(Segment *s, long *addr, ulong ms) +{ + int acquired; + Sema phore; + int timedout; + ulong t; + ulong tsemdbg; + + 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((tsemdbg = 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; +} + long syssemacquire(ulong *arg) { @@ -1050,6 +1099,25 @@ } long +systsemacquire(ulong *arg) +{ + long *addr; + ulong ms; + Segment *s; + + validaddr(arg[0], sizeof(long), 1); + evenaddr(arg[0]); + addr = (long*)arg[0]; + ms = arg[1]; + + if((s = seg(up, (ulong)addr, 0)) == nil) + error(Ebadarg); + if(*addr < 0) + error(Ebadarg); + return tsemacquire(s, addr, ms); +} + +long syssemrelease(ulong *arg) { long *addr, delta; diff -r 35f5add268d3 -r 40f21636c8e3 sys/src/9/port/systab.h --- a/sys/src/9/port/systab.h Fri Jan 27 21:45:14 2012 +0000 +++ b/sys/src/9/port/systab.h Thu Feb 02 19:29:24 2012 +0000 @@ -40,6 +40,7 @@ Syscall sysunmount; Syscall sys_wait; Syscall syssemacquire; +Syscall systsemacquire; Syscall syssemrelease; Syscall sysseek; Syscall sysfversion; @@ -93,6 +94,7 @@ [UNMOUNT] sysunmount, [_WAIT] sys_wait, [SEMACQUIRE] syssemacquire, + [TSEMACQUIRE] systsemacquire, [SEMRELEASE] syssemrelease, [SEEK] sysseek, [FVERSION] sysfversion, @@ -146,6 +148,7 @@ [UNMOUNT] "Unmount", [_WAIT] "_wait", [SEMACQUIRE] "Semacquire", + [TSEMACQUIRE] "Tsemacquire", [SEMRELEASE] "Semrelease", [SEEK] "Seek", [FVERSION] "Fversion", diff -r 35f5add268d3 -r 40f21636c8e3 sys/src/libc/9syscall/sys.h --- a/sys/src/libc/9syscall/sys.h Fri Jan 27 21:45:14 2012 +0000 +++ b/sys/src/libc/9syscall/sys.h Thu Feb 02 19:29:24 2012 +0000 @@ -53,7 +53,7 @@ #define SEMALT 54 #define EXECAC 55 #define NIXSYSCALL 56 -#define ZIOPREAD 57 -#define ZIOPWRITE 58 +#define ZIOPREAD 57 +#define ZIOPWRITE 58 #define ZIOFREE 59 #define TSEMACQUIRE 60 diff -r 35f5add268d3 -r 40f21636c8e3 sys/src/nix/port/sysproc.c --- a/sys/src/nix/port/sysproc.c Fri Jan 27 21:45:14 2012 +0000 +++ b/sys/src/nix/port/sysproc.c Thu Feb 02 19:29:24 2012 +0000 @@ -1272,14 +1272,14 @@ int *addr, ms; /* - * int semacquire(long* addr, int block); + * int tsemacquire(long* addr, ulong ms); * should be (and will be implemented below as) perhaps - * int semacquire(int* addr, int block); + * int tsemacquire(int* addr, ulong ms); */ addr = va_arg(list, int*); addr = validaddr(addr, sizeof(int), 1); evenaddr(PTR2UINT(addr)); - ms = va_arg(list, int); + ms = va_arg(list, ulong); if((s = seg(up, PTR2UINT(addr), 0)) == nil) error(Ebadarg);