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