Blame


1 76193d7c 2003-09-30 devnull #include <signal.h>
2 cd7ddc9b 2003-11-23 devnull #include "threadimpl.h"
3 76193d7c 2003-09-30 devnull
4 76193d7c 2003-09-30 devnull char *_threadexitsallstatus;
5 76193d7c 2003-09-30 devnull Channel *_threadwaitchan;
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull void
8 76193d7c 2003-09-30 devnull threadexits(char *exitstr)
9 76193d7c 2003-09-30 devnull {
10 76193d7c 2003-09-30 devnull Proc *p;
11 76193d7c 2003-09-30 devnull Thread *t;
12 76193d7c 2003-09-30 devnull
13 76193d7c 2003-09-30 devnull p = _threadgetproc();
14 76193d7c 2003-09-30 devnull t = p->thread;
15 e97ceade 2003-12-06 devnull if(t == p->idle)
16 e97ceade 2003-12-06 devnull p->idle = nil;
17 76193d7c 2003-09-30 devnull t->moribund = 1;
18 cd7ddc9b 2003-11-23 devnull _threaddebug(DBGSCHED, "threadexits %s", exitstr);
19 76193d7c 2003-09-30 devnull if(exitstr==nil)
20 76193d7c 2003-09-30 devnull exitstr="";
21 76193d7c 2003-09-30 devnull utfecpy(p->exitstr, p->exitstr+ERRMAX, exitstr);
22 76193d7c 2003-09-30 devnull _sched();
23 76193d7c 2003-09-30 devnull }
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull void
26 76193d7c 2003-09-30 devnull threadexitsall(char *exitstr)
27 76193d7c 2003-09-30 devnull {
28 76193d7c 2003-09-30 devnull Proc *p;
29 76193d7c 2003-09-30 devnull int *pid;
30 76193d7c 2003-09-30 devnull int i, npid, mypid;
31 76193d7c 2003-09-30 devnull
32 cd7ddc9b 2003-11-23 devnull _threaddebug(DBGSCHED, "threadexitsall %s", exitstr);
33 76193d7c 2003-09-30 devnull if(exitstr == nil)
34 76193d7c 2003-09-30 devnull exitstr = "";
35 76193d7c 2003-09-30 devnull _threadexitsallstatus = exitstr;
36 76193d7c 2003-09-30 devnull _threaddebug(DBGSCHED, "_threadexitsallstatus set to %p", _threadexitsallstatus);
37 76193d7c 2003-09-30 devnull mypid = _threadgetpid();
38 76193d7c 2003-09-30 devnull
39 76193d7c 2003-09-30 devnull /*
40 76193d7c 2003-09-30 devnull * signal others.
41 cd7ddc9b 2003-11-23 devnull * copying all the pids first avoids other thread's
42 76193d7c 2003-09-30 devnull * teardown procedures getting in the way.
43 76193d7c 2003-09-30 devnull */
44 76193d7c 2003-09-30 devnull lock(&_threadpq.lock);
45 76193d7c 2003-09-30 devnull npid = 0;
46 76193d7c 2003-09-30 devnull for(p=_threadpq.head; p; p=p->next)
47 76193d7c 2003-09-30 devnull npid++;
48 76193d7c 2003-09-30 devnull pid = _threadmalloc(npid*sizeof(pid[0]), 0);
49 76193d7c 2003-09-30 devnull npid = 0;
50 76193d7c 2003-09-30 devnull for(p = _threadpq.head; p; p=p->next)
51 76193d7c 2003-09-30 devnull pid[npid++] = p->pid;
52 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
53 cd7ddc9b 2003-11-23 devnull for(i=0; i<npid; i++){
54 cd7ddc9b 2003-11-23 devnull _threaddebug(DBGSCHED, "threadexitsall kill %d", pid[i]);
55 cd7ddc9b 2003-11-23 devnull if(pid[i]==0 || pid[i]==-1)
56 cd7ddc9b 2003-11-23 devnull fprint(2, "bad pid in threadexitsall: %d\n", pid[i]);
57 cd7ddc9b 2003-11-23 devnull else if(pid[i] != mypid)
58 76193d7c 2003-09-30 devnull kill(pid[i], SIGTERM);
59 cd7ddc9b 2003-11-23 devnull }
60 76193d7c 2003-09-30 devnull
61 76193d7c 2003-09-30 devnull /* leave */
62 76193d7c 2003-09-30 devnull exit(0);
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull
65 76193d7c 2003-09-30 devnull Channel*
66 76193d7c 2003-09-30 devnull threadwaitchan(void)
67 76193d7c 2003-09-30 devnull {
68 76193d7c 2003-09-30 devnull if(_threadwaitchan==nil)
69 76193d7c 2003-09-30 devnull _threadwaitchan = chancreate(sizeof(Waitmsg*), 16);
70 76193d7c 2003-09-30 devnull return _threadwaitchan;
71 76193d7c 2003-09-30 devnull }