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 static void tinterrupt(Proc*, Thread*);
5 76193d7c 2003-09-30 devnull
6 76193d7c 2003-09-30 devnull static void
7 76193d7c 2003-09-30 devnull threadxxxgrp(int grp, int dokill)
8 76193d7c 2003-09-30 devnull {
9 76193d7c 2003-09-30 devnull Proc *p;
10 76193d7c 2003-09-30 devnull Thread *t;
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull lock(&_threadpq.lock);
13 76193d7c 2003-09-30 devnull for(p=_threadpq.head; p; p=p->next){
14 76193d7c 2003-09-30 devnull lock(&p->lock);
15 76193d7c 2003-09-30 devnull for(t=p->threads.head; t; t=t->nextt)
16 76193d7c 2003-09-30 devnull if(t->grp == grp){
17 76193d7c 2003-09-30 devnull if(dokill)
18 76193d7c 2003-09-30 devnull t->moribund = 1;
19 76193d7c 2003-09-30 devnull tinterrupt(p, t);
20 76193d7c 2003-09-30 devnull }
21 76193d7c 2003-09-30 devnull unlock(&p->lock);
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
24 76193d7c 2003-09-30 devnull _threadbreakrendez();
25 76193d7c 2003-09-30 devnull }
26 76193d7c 2003-09-30 devnull
27 76193d7c 2003-09-30 devnull static void
28 76193d7c 2003-09-30 devnull threadxxx(int id, int dokill)
29 76193d7c 2003-09-30 devnull {
30 76193d7c 2003-09-30 devnull Proc *p;
31 76193d7c 2003-09-30 devnull Thread *t;
32 76193d7c 2003-09-30 devnull
33 76193d7c 2003-09-30 devnull lock(&_threadpq.lock);
34 76193d7c 2003-09-30 devnull for(p=_threadpq.head; p; p=p->next){
35 76193d7c 2003-09-30 devnull lock(&p->lock);
36 76193d7c 2003-09-30 devnull for(t=p->threads.head; t; t=t->nextt)
37 76193d7c 2003-09-30 devnull if(t->id == id){
38 76193d7c 2003-09-30 devnull if(dokill)
39 76193d7c 2003-09-30 devnull t->moribund = 1;
40 76193d7c 2003-09-30 devnull tinterrupt(p, t);
41 76193d7c 2003-09-30 devnull unlock(&p->lock);
42 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
43 76193d7c 2003-09-30 devnull _threadbreakrendez();
44 76193d7c 2003-09-30 devnull return;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull unlock(&p->lock);
47 76193d7c 2003-09-30 devnull }
48 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
49 76193d7c 2003-09-30 devnull _threaddebug(DBGNOTE, "Can't find thread to kill");
50 76193d7c 2003-09-30 devnull return;
51 76193d7c 2003-09-30 devnull }
52 76193d7c 2003-09-30 devnull
53 76193d7c 2003-09-30 devnull void
54 76193d7c 2003-09-30 devnull threadkillgrp(int grp)
55 76193d7c 2003-09-30 devnull {
56 76193d7c 2003-09-30 devnull threadxxxgrp(grp, 1);
57 76193d7c 2003-09-30 devnull }
58 76193d7c 2003-09-30 devnull
59 76193d7c 2003-09-30 devnull void
60 76193d7c 2003-09-30 devnull threadkill(int id)
61 76193d7c 2003-09-30 devnull {
62 76193d7c 2003-09-30 devnull threadxxx(id, 1);
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull
65 76193d7c 2003-09-30 devnull void
66 76193d7c 2003-09-30 devnull threadintgrp(int grp)
67 76193d7c 2003-09-30 devnull {
68 76193d7c 2003-09-30 devnull threadxxxgrp(grp, 0);
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull
71 76193d7c 2003-09-30 devnull void
72 76193d7c 2003-09-30 devnull threadint(int id)
73 76193d7c 2003-09-30 devnull {
74 76193d7c 2003-09-30 devnull threadxxx(id, 0);
75 76193d7c 2003-09-30 devnull }
76 76193d7c 2003-09-30 devnull
77 76193d7c 2003-09-30 devnull static void
78 76193d7c 2003-09-30 devnull tinterrupt(Proc *p, Thread *t)
79 76193d7c 2003-09-30 devnull {
80 76193d7c 2003-09-30 devnull switch(t->state){
81 76193d7c 2003-09-30 devnull case Running:
82 76193d7c 2003-09-30 devnull kill(p->pid, SIGINT);
83 76193d7c 2003-09-30 devnull // postnote(PNPROC, p->pid, "threadint");
84 76193d7c 2003-09-30 devnull break;
85 76193d7c 2003-09-30 devnull case Rendezvous:
86 76193d7c 2003-09-30 devnull _threadflagrendez(t);
87 76193d7c 2003-09-30 devnull break;
88 76193d7c 2003-09-30 devnull }
89 76193d7c 2003-09-30 devnull }