#include <u.h> | |
#include <signal.h> | |
#include "threadimpl.h" | |
static void tinterrupt(Proc*, Thread*); | |
static void | |
threadxxxgrp(int grp, int dokill) | |
{ | |
Proc *p; | |
Thread *t; | |
lock(&_threadpq.lock); | |
for(p=_threadpq.head; p; p=p->next){ | |
lock(&p->lock); | |
for(t=p->threads.head; t; t=t->nextt) | |
if(t->grp == grp){ | |
if(dokill) | |
t->moribund = 1; | |
tinterrupt(p, t); | |
} | |
unlock(&p->lock); | |
} | |
unlock(&_threadpq.lock); | |
_threadbreakrendez(); | |
} | |
static void | |
threadxxx(int id, int dokill) | |
{ | |
Proc *p; | |
Thread *t; | |
lock(&_threadpq.lock); | |
for(p=_threadpq.head; p; p=p->next){ | |
lock(&p->lock); | |
for(t=p->threads.head; t; t=t->nextt) | |
if(t->id == id){ | |
if(dokill) | |
t->moribund = 1; | |
tinterrupt(p, t); | |
unlock(&p->lock); | |
unlock(&_threadpq.lock); | |
_threadbreakrendez(); | |
return; | |
} | |
unlock(&p->lock); | |
} | |
unlock(&_threadpq.lock); | |
_threaddebug(DBGNOTE, "Can't find thread to kill"); | |
return; | |
} | |
void | |
threadkillgrp(int grp) | |
{ | |
threadxxxgrp(grp, 1); | |
} | |
void | |
threadkill(int id) | |
{ | |
threadxxx(id, 1); | |
} | |
void | |
threadintgrp(int grp) | |
{ | |
threadxxxgrp(grp, 0); | |
} | |
void | |
threadint(int id) | |
{ | |
threadxxx(id, 0); | |
} | |
static void | |
tinterrupt(Proc *p, Thread *t) | |
{ | |
switch(t->state){ | |
case Running: | |
kill(p->pid, SIGINT); | |
// postnote(PNPROC, p->pid, "threadint"); | |
break; | |
case Rendezvous: | |
_threadflagrendez(t); | |
break; | |
} | |
} |