Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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