1 76193d7c 2003-09-30 devnull #include "threadimpl.h"
2 76193d7c 2003-09-30 devnull #include <signal.h>
4 76193d7c 2003-09-30 devnull static void tinterrupt(Proc*, Thread*);
6 76193d7c 2003-09-30 devnull static void
7 76193d7c 2003-09-30 devnull threadxxxgrp(int grp, int dokill)
10 76193d7c 2003-09-30 devnull Thread *t;
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);
21 76193d7c 2003-09-30 devnull unlock(&p->lock);
23 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
24 76193d7c 2003-09-30 devnull _threadbreakrendez();
27 76193d7c 2003-09-30 devnull static void
28 76193d7c 2003-09-30 devnull threadxxx(int id, int dokill)
31 76193d7c 2003-09-30 devnull Thread *t;
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();
46 76193d7c 2003-09-30 devnull unlock(&p->lock);
48 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
49 76193d7c 2003-09-30 devnull _threaddebug(DBGNOTE, "Can't find thread to kill");
54 76193d7c 2003-09-30 devnull threadkillgrp(int grp)
56 76193d7c 2003-09-30 devnull threadxxxgrp(grp, 1);
60 76193d7c 2003-09-30 devnull threadkill(int id)
62 76193d7c 2003-09-30 devnull threadxxx(id, 1);
66 76193d7c 2003-09-30 devnull threadintgrp(int grp)
68 76193d7c 2003-09-30 devnull threadxxxgrp(grp, 0);
72 76193d7c 2003-09-30 devnull threadint(int id)
74 76193d7c 2003-09-30 devnull threadxxx(id, 0);
77 76193d7c 2003-09-30 devnull static void
78 76193d7c 2003-09-30 devnull tinterrupt(Proc *p, Thread *t)
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");
85 76193d7c 2003-09-30 devnull case Rendezvous:
86 76193d7c 2003-09-30 devnull _threadflagrendez(t);