aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/kill.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libthread/kill.c')
-rw-r--r--src/libthread/kill.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/libthread/kill.c b/src/libthread/kill.c
new file mode 100644
index 00000000..a9392ead
--- /dev/null
+++ b/src/libthread/kill.c
@@ -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;
+ }
+}