itlibthread: delete NetBSD special case - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit 5b37d9126474864b5299426e27b2af37fcc96dd0 /src/plan9port/commit/5b37d9126474864b5299426e27b2af37fcc96dd0.gph mx1.adamsgaard.dk 70 1parent 69439fae6705a125047246c889384ed3aeb4d104 /src/plan9port/commit/69439fae6705a125047246c889384ed3aeb4d104.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Wed, 30 Dec 2020 00:06:35 -0500 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ilibthread: delete NetBSD special case Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iI added a direct call from thread.c to pthread.c's _threadpthreadstart Err mx1.adamsgaard.dk 70 iin May, and no one has complained about NetBSD being broken. Err mx1.adamsgaard.dk 70 iSo probably no one is using this on NetBSD at all. Err mx1.adamsgaard.dk 70 iMake pthread the only option. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i D src/libthread/NetBSD-386-asm.s | 7 ------- Err mx1.adamsgaard.dk 70 i D src/libthread/NetBSD-power-asm.s | 16 ---------------- Err mx1.adamsgaard.dk 70 i D src/libthread/NetBSD.c | 437 ------------------------------- Err mx1.adamsgaard.dk 70 i M src/libthread/sysofiles.sh | 9 ++++----- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i4 files changed, 4 insertions(+), 465 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/NetBSD-386-asm.s b/src/libthread/NetBSD-386-asm.s /src/plan9port/file/src/libthread/NetBSD-386-asm.s.gph mx1.adamsgaard.dk 70 it@@ -1,7 +0,0 @@ Err mx1.adamsgaard.dk 70 i-.globl _tas Err mx1.adamsgaard.dk 70 i-_tas: Err mx1.adamsgaard.dk 70 i- movl $0xCAFEBABE, %eax Err mx1.adamsgaard.dk 70 i- movl 4(%esp), %ecx Err mx1.adamsgaard.dk 70 i- xchgl %eax, 0(%ecx) Err mx1.adamsgaard.dk 70 i- ret Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/NetBSD-power-asm.s b/src/libthread/NetBSD-power-asm.s /src/plan9port/file/src/libthread/NetBSD-power-asm.s.gph mx1.adamsgaard.dk 70 it@@ -1,16 +0,0 @@ Err mx1.adamsgaard.dk 70 i- .globl _tas Err mx1.adamsgaard.dk 70 i-_tas: Err mx1.adamsgaard.dk 70 i- li %r0, 0 Err mx1.adamsgaard.dk 70 i- mr %r4, %r3 Err mx1.adamsgaard.dk 70 i- lis %r5, 0xcafe Err mx1.adamsgaard.dk 70 i- ori %r5, %r5, 0xbabe Err mx1.adamsgaard.dk 70 i-1: Err mx1.adamsgaard.dk 70 i- lwarx %r3, %r0, %r4 Err mx1.adamsgaard.dk 70 i- cmpwi %r3, 0 Err mx1.adamsgaard.dk 70 i- bne 2f Err mx1.adamsgaard.dk 70 i- stwcx. %r5, %r0, %r4 Err mx1.adamsgaard.dk 70 i- bne- 1b Err mx1.adamsgaard.dk 70 i-2: Err mx1.adamsgaard.dk 70 i- sync Err mx1.adamsgaard.dk 70 i- blr Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/NetBSD.c b/src/libthread/NetBSD.c /src/plan9port/file/src/libthread/NetBSD.c.gph mx1.adamsgaard.dk 70 it@@ -1,437 +0,0 @@ Err mx1.adamsgaard.dk 70 i-#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-#undef exits Err mx1.adamsgaard.dk 70 i-#undef _exits Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static int Err mx1.adamsgaard.dk 70 i-timefmt(Fmt *fmt) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- static char *mon[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", Err mx1.adamsgaard.dk 70 i- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; Err mx1.adamsgaard.dk 70 i- vlong ns; Err mx1.adamsgaard.dk 70 i- Tm tm; Err mx1.adamsgaard.dk 70 i- ns = nsec(); Err mx1.adamsgaard.dk 70 i- tm = *localtime(time(0)); Err mx1.adamsgaard.dk 70 i- return fmtprint(fmt, "%s %2d %02d:%02d:%02d.%03d", Err mx1.adamsgaard.dk 70 i- mon[tm.mon], tm.mday, tm.hour, tm.min, tm.sec, Err mx1.adamsgaard.dk 70 i- (int)(ns%1000000000)/1000000); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i- * spin locks Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i-extern int _tas(int*); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_threadunlock(Lock *l, ulong pc) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- USED(pc); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- l->held = 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-int Err mx1.adamsgaard.dk 70 i-_threadlock(Lock *l, int block, ulong pc) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- int i; Err mx1.adamsgaard.dk 70 i-static int first=1; Err mx1.adamsgaard.dk 70 i-if(first) {first=0; fmtinstall('\001', timefmt);} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- USED(pc); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* once fast */ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- if(!block) Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* a thousand times pretty fast */ Err mx1.adamsgaard.dk 70 i- for(i=0; i<1000; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- sched_yield(); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- /* now increasingly slow */ Err mx1.adamsgaard.dk 70 i- for(i=0; i<10; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- usleep(1); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-fprint(2, "%\001 %s: lock loop1 %p from %lux\n", argv0, l, pc); Err mx1.adamsgaard.dk 70 i- for(i=0; i<10; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- usleep(10); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-fprint(2, "%\001 %s: lock loop2 %p from %lux\n", argv0, l, pc); Err mx1.adamsgaard.dk 70 i- for(i=0; i<10; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- usleep(100); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-fprint(2, "%\001 %s: lock loop3 %p from %lux\n", argv0, l, pc); Err mx1.adamsgaard.dk 70 i- for(i=0; i<10; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- usleep(1000); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-fprint(2, "%\001 %s: lock loop4 %p from %lux\n", argv0, l, pc); Err mx1.adamsgaard.dk 70 i- for(i=0; i<10; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- usleep(10*1000); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-fprint(2, "%\001 %s: lock loop5 %p from %lux\n", argv0, l, pc); Err mx1.adamsgaard.dk 70 i- for(i=0; i<1000; i++){ Err mx1.adamsgaard.dk 70 i- if(!_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i- usleep(100*1000); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-fprint(2, "%\001 %s: lock loop6 %p from %lux\n", argv0, l, pc); Err mx1.adamsgaard.dk 70 i- /* take your time */ Err mx1.adamsgaard.dk 70 i- while(_tas(&l->held)) Err mx1.adamsgaard.dk 70 i- usleep(1000*1000); Err mx1.adamsgaard.dk 70 i- return 1; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i- * sleep and wakeup Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i-static void Err mx1.adamsgaard.dk 70 i-ign(int x) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- USED(x); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static void /*__attribute__((constructor))*/ Err mx1.adamsgaard.dk 70 i-ignusr1(int restart) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- struct sigaction sa; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- memset(&sa, 0, sizeof sa); Err mx1.adamsgaard.dk 70 i- sa.sa_handler = ign; Err mx1.adamsgaard.dk 70 i- sigemptyset(&sa.sa_mask); Err mx1.adamsgaard.dk 70 i- sigaddset(&sa.sa_mask, SIGUSR1); Err mx1.adamsgaard.dk 70 i- if(restart) Err mx1.adamsgaard.dk 70 i- sa.sa_flags = SA_RESTART; Err mx1.adamsgaard.dk 70 i- sigaction(SIGUSR1, &sa, nil); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_procsleep(_Procrendez *r) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- sigset_t mask; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * Go to sleep. Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * Block USR1, set the handler to interrupt system calls, Err mx1.adamsgaard.dk 70 i- * unlock the vouslock so our waker can wake us, Err mx1.adamsgaard.dk 70 i- * and then suspend. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i-again: Err mx1.adamsgaard.dk 70 i- r->asleep = 1; Err mx1.adamsgaard.dk 70 i- r->pid = getpid(); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- sigprocmask(SIG_SETMASK, nil, &mask); Err mx1.adamsgaard.dk 70 i- sigaddset(&mask, SIGUSR1); Err mx1.adamsgaard.dk 70 i- sigprocmask(SIG_SETMASK, &mask, nil); Err mx1.adamsgaard.dk 70 i- ignusr1(0); Err mx1.adamsgaard.dk 70 i- unlock(r->l); Err mx1.adamsgaard.dk 70 i- sigdelset(&mask, SIGUSR1); Err mx1.adamsgaard.dk 70 i- sigsuspend(&mask); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * We're awake. Make USR1 not interrupt system calls. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- lock(r->l); Err mx1.adamsgaard.dk 70 i- ignusr1(1); Err mx1.adamsgaard.dk 70 i- if(r->asleep && r->pid == getpid()){ Err mx1.adamsgaard.dk 70 i- /* Didn't really wake up - signal from something else */ Err mx1.adamsgaard.dk 70 i- goto again; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_procwakeupandunlock(_Procrendez *r) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- int pid; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- pid = 0; Err mx1.adamsgaard.dk 70 i- if(r->asleep){ Err mx1.adamsgaard.dk 70 i- r->asleep = 0; Err mx1.adamsgaard.dk 70 i- assert(r->pid >= 1); Err mx1.adamsgaard.dk 70 i- pid = r->pid; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- assert(r->l); Err mx1.adamsgaard.dk 70 i- unlock(r->l); Err mx1.adamsgaard.dk 70 i- if(pid) Err mx1.adamsgaard.dk 70 i- kill(pid, SIGUSR1); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i- * process creation and exit Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i-typedef struct Stackfree Stackfree; Err mx1.adamsgaard.dk 70 i-struct Stackfree Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- Stackfree *next; Err mx1.adamsgaard.dk 70 i- int pid; Err mx1.adamsgaard.dk 70 i- int pid1; Err mx1.adamsgaard.dk 70 i-}; Err mx1.adamsgaard.dk 70 i-static Lock stacklock; Err mx1.adamsgaard.dk 70 i-static Stackfree *stackfree; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static void Err mx1.adamsgaard.dk 70 i-delayfreestack(uchar *stk, int pid, int pid1) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- Stackfree *sf; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- sf = (Stackfree*)stk; Err mx1.adamsgaard.dk 70 i- sf->pid = pid; Err mx1.adamsgaard.dk 70 i- sf->pid1 = pid1; Err mx1.adamsgaard.dk 70 i- lock(&stacklock); Err mx1.adamsgaard.dk 70 i- sf->next = stackfree; Err mx1.adamsgaard.dk 70 i- stackfree = sf; Err mx1.adamsgaard.dk 70 i- unlock(&stacklock); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static void Err mx1.adamsgaard.dk 70 i-dofreestacks(void) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- Stackfree *sf, *last, *next; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(stackfree==nil || !canlock(&stacklock)) Err mx1.adamsgaard.dk 70 i- return; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- for(last=nil,sf=stackfree; sf; last=sf,sf=next){ Err mx1.adamsgaard.dk 70 i- next = sf->next; Err mx1.adamsgaard.dk 70 i- if(sf->pid >= 1 && kill(sf->pid, 0) < 0 && errno == ESRCH) Err mx1.adamsgaard.dk 70 i- if(sf->pid1 >= 1 && kill(sf->pid1, 0) < 0 && errno == ESRCH){ Err mx1.adamsgaard.dk 70 i- free(sf); Err mx1.adamsgaard.dk 70 i- if(last) Err mx1.adamsgaard.dk 70 i- last->next = next; Err mx1.adamsgaard.dk 70 i- else Err mx1.adamsgaard.dk 70 i- stackfree = next; Err mx1.adamsgaard.dk 70 i- sf = last; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- unlock(&stacklock); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static int Err mx1.adamsgaard.dk 70 i-startprocfn(void *v) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- void **a; Err mx1.adamsgaard.dk 70 i- uchar *stk; Err mx1.adamsgaard.dk 70 i- void (*fn)(void*); Err mx1.adamsgaard.dk 70 i- Proc *p; Err mx1.adamsgaard.dk 70 i- int pid0, pid1; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- a = (void**)v; Err mx1.adamsgaard.dk 70 i- fn = a[0]; Err mx1.adamsgaard.dk 70 i- p = a[1]; Err mx1.adamsgaard.dk 70 i- stk = a[2]; Err mx1.adamsgaard.dk 70 i- pid0 = (int)a[4]; Err mx1.adamsgaard.dk 70 i- pid1 = getpid(); Err mx1.adamsgaard.dk 70 i- free(a); Err mx1.adamsgaard.dk 70 i- p->osprocid = pid1; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- (*fn)(p); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- delayfreestack(stk, pid0, pid1); Err mx1.adamsgaard.dk 70 i- _exit(0); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i- * indirect through here so that parent need not wait for child zombie Err mx1.adamsgaard.dk 70 i- * Err mx1.adamsgaard.dk 70 i- * slight race - if child exits and then another process starts before we Err mx1.adamsgaard.dk 70 i- * manage to exit, we'll be running on a freed stack. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i-static int Err mx1.adamsgaard.dk 70 i-trampnowait(void *v) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- void **a; Err mx1.adamsgaard.dk 70 i- int *kidpid; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- a = (void*)v; Err mx1.adamsgaard.dk 70 i- kidpid = a[3]; Err mx1.adamsgaard.dk 70 i- a[4] = (void*)getpid(); Err mx1.adamsgaard.dk 70 i- *kidpid = clone(startprocfn, a[2]+65536-512, CLONE_VM|CLONE_FILES, a); Err mx1.adamsgaard.dk 70 i- _exit(0); Err mx1.adamsgaard.dk 70 i- return 0; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_procstart(Proc *p, void (*fn)(Proc*)) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- void **a; Err mx1.adamsgaard.dk 70 i- uchar *stk; Err mx1.adamsgaard.dk 70 i- int pid, kidpid, status; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- dofreestacks(); Err mx1.adamsgaard.dk 70 i- a = malloc(5*sizeof a[0]); Err mx1.adamsgaard.dk 70 i- if(a == nil) Err mx1.adamsgaard.dk 70 i- sysfatal("_procstart malloc: %r"); Err mx1.adamsgaard.dk 70 i- stk = malloc(65536); Err mx1.adamsgaard.dk 70 i- if(stk == nil) Err mx1.adamsgaard.dk 70 i- sysfatal("_procstart malloc stack: %r"); Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- a[0] = fn; Err mx1.adamsgaard.dk 70 i- a[1] = p; Err mx1.adamsgaard.dk 70 i- a[2] = stk; Err mx1.adamsgaard.dk 70 i- a[3] = &kidpid; Err mx1.adamsgaard.dk 70 i- kidpid = -1; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- pid = clone(trampnowait, stk+65536-16, CLONE_VM|CLONE_FILES, a); Err mx1.adamsgaard.dk 70 i- if(pid > 0) Err mx1.adamsgaard.dk 70 i- if(wait4(pid, &status, __WALL, 0) < 0) Err mx1.adamsgaard.dk 70 i- fprint(2, "ffork wait4: %r\n"); Err mx1.adamsgaard.dk 70 i- if(pid < 0 || kidpid < 0){ Err mx1.adamsgaard.dk 70 i- fprint(2, "_procstart clone: %r\n"); Err mx1.adamsgaard.dk 70 i- abort(); Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static char *threadexitsmsg; Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-sigusr2handler(int s) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i-/* fprint(2, "%d usr2 %d\n", time(0), getpid()); */ Err mx1.adamsgaard.dk 70 i- if(threadexitsmsg) Err mx1.adamsgaard.dk 70 i- _exits(threadexitsmsg); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-threadexitsall(char *msg) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- static int pid[1024]; Err mx1.adamsgaard.dk 70 i- int i, npid, mypid; Err mx1.adamsgaard.dk 70 i- Proc *p; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(msg == nil) Err mx1.adamsgaard.dk 70 i- msg = ""; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- /* Err mx1.adamsgaard.dk 70 i- * Only one guy, ever, gets to run this. Err mx1.adamsgaard.dk 70 i- * If two guys do it, inevitably they end up Err mx1.adamsgaard.dk 70 i- * tripping over each other in the underlying Err mx1.adamsgaard.dk 70 i- * C library exit() implementation, which is Err mx1.adamsgaard.dk 70 i- * trying to run the atexit handlers and apparently Err mx1.adamsgaard.dk 70 i- * not thread safe. This has been observed on Err mx1.adamsgaard.dk 70 i- * both Linux and OpenBSD. Sigh. Err mx1.adamsgaard.dk 70 i- */ Err mx1.adamsgaard.dk 70 i- { Err mx1.adamsgaard.dk 70 i- static Lock onelock; Err mx1.adamsgaard.dk 70 i- if(!canlock(&onelock)) Err mx1.adamsgaard.dk 70 i- _exits(threadexitsmsg); Err mx1.adamsgaard.dk 70 i- threadexitsmsg = msg; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- mypid = getpid(); Err mx1.adamsgaard.dk 70 i- lock(&_threadprocslock); Err mx1.adamsgaard.dk 70 i- npid = 0; Err mx1.adamsgaard.dk 70 i- for(p=_threadprocs; p; p=p->next) Err mx1.adamsgaard.dk 70 i- if(p->osprocid != mypid && p->osprocid >= 1) Err mx1.adamsgaard.dk 70 i- pid[npid++] = p->osprocid; Err mx1.adamsgaard.dk 70 i- for(i=0; ipid == pid) Err mx1.adamsgaard.dk 70 i- return p; Err mx1.adamsgaard.dk 70 i- if(p->pid == 0){ Err mx1.adamsgaard.dk 70 i- print("found 0 at %d (h=%d)\n", (i+h)%nelem(perproc), h); Err mx1.adamsgaard.dk 70 i- break; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- fprint(2, "myperproc %d (%s): cannot find self\n", pid, argv0); Err mx1.adamsgaard.dk 70 i- abort(); Err mx1.adamsgaard.dk 70 i- return nil; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-static Perproc* Err mx1.adamsgaard.dk 70 i-newperproc(void) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- int i, pid, h; Err mx1.adamsgaard.dk 70 i- Perproc *p; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- lock(&perlock); Err mx1.adamsgaard.dk 70 i- pid = getpid(); Err mx1.adamsgaard.dk 70 i- h = pid%nelem(perproc); Err mx1.adamsgaard.dk 70 i- for(i=0; ipid == pid || p->pid == -1 || p->pid == 0){ Err mx1.adamsgaard.dk 70 i- p->pid = pid; Err mx1.adamsgaard.dk 70 i- unlock(&perlock); Err mx1.adamsgaard.dk 70 i- return p; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i- fprint(2, "newperproc %d: out of procs\n", pid); Err mx1.adamsgaard.dk 70 i- abort(); Err mx1.adamsgaard.dk 70 i- return nil; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-Proc* Err mx1.adamsgaard.dk 70 i-_threadproc(void) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- return myperproc()->proc; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_threadsetproc(Proc *p) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- Perproc *pp; Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i- if(p) Err mx1.adamsgaard.dk 70 i- p->osprocid = getpid(); Err mx1.adamsgaard.dk 70 i- pp = newperproc(); Err mx1.adamsgaard.dk 70 i- pp->proc = p; Err mx1.adamsgaard.dk 70 i- if(p == nil) Err mx1.adamsgaard.dk 70 i- pp->pid = -1; Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_pthreadinit(void) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- signal(SIGUSR2, sigusr2handler); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i-void Err mx1.adamsgaard.dk 70 i-_threadpexit(void) Err mx1.adamsgaard.dk 70 i-{ Err mx1.adamsgaard.dk 70 i- _exit(0); Err mx1.adamsgaard.dk 70 i-} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/sysofiles.sh b/src/libthread/sysofiles.sh /src/plan9port/file/src/libthread/sysofiles.sh.gph mx1.adamsgaard.dk 70 it@@ -2,15 +2,14 @@ Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i test -f $PLAN9/config && . $PLAN9/config Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+echo pthread.o Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i case "$SYSNAME" in Err mx1.adamsgaard.dk 70 i-NetBSD) Err mx1.adamsgaard.dk 70 i- echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o stkmalloc.o Err mx1.adamsgaard.dk 70 i- ;; Err mx1.adamsgaard.dk 70 i OpenBSD) Err mx1.adamsgaard.dk 70 i- echo pthread.o stkmmap.o Err mx1.adamsgaard.dk 70 i+ echo stkmmap.o Err mx1.adamsgaard.dk 70 i ;; Err mx1.adamsgaard.dk 70 i *) Err mx1.adamsgaard.dk 70 i- echo pthread.o stkmalloc.o Err mx1.adamsgaard.dk 70 i+ echo stkmalloc.o Err mx1.adamsgaard.dk 70 i esac Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i # Various libc don't supply swapcontext, makecontext, so we do. Err mx1.adamsgaard.dk 70 .