Blame


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