Initial revision

This commit is contained in:
rsc 2003-09-30 17:47:42 +00:00
parent ed7c8e8d02
commit 76193d7cb0
223 changed files with 32479 additions and 0 deletions

89
src/libthread/kill.c Normal file
View file

@ -0,0 +1,89 @@
#include "threadimpl.h"
#include <signal.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;
}
}