Blame


1 76193d7c 2003-09-30 devnull #include "threadimpl.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull int _threadnopasser;
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull #define NFN 33
6 76193d7c 2003-09-30 devnull #define ERRLEN 48
7 76193d7c 2003-09-30 devnull typedef struct Note Note;
8 76193d7c 2003-09-30 devnull struct Note
9 76193d7c 2003-09-30 devnull {
10 76193d7c 2003-09-30 devnull Lock inuse;
11 76193d7c 2003-09-30 devnull Proc *proc; /* recipient */
12 76193d7c 2003-09-30 devnull char s[ERRMAX]; /* arg2 */
13 76193d7c 2003-09-30 devnull };
14 76193d7c 2003-09-30 devnull
15 76193d7c 2003-09-30 devnull static Note notes[128];
16 76193d7c 2003-09-30 devnull static Note *enotes = notes+nelem(notes);
17 76193d7c 2003-09-30 devnull static int (*onnote[NFN])(void*, char*);
18 76193d7c 2003-09-30 devnull static int onnotepid[NFN];
19 76193d7c 2003-09-30 devnull static Lock onnotelock;
20 76193d7c 2003-09-30 devnull
21 76193d7c 2003-09-30 devnull int
22 76193d7c 2003-09-30 devnull threadnotify(int (*f)(void*, char*), int in)
23 76193d7c 2003-09-30 devnull {
24 76193d7c 2003-09-30 devnull int i, topid;
25 76193d7c 2003-09-30 devnull int (*from)(void*, char*), (*to)(void*, char*);
26 76193d7c 2003-09-30 devnull
27 76193d7c 2003-09-30 devnull if(in){
28 be22ae2d 2004-03-26 devnull from = 0;
29 76193d7c 2003-09-30 devnull to = f;
30 76193d7c 2003-09-30 devnull topid = _threadgetproc()->pid;
31 76193d7c 2003-09-30 devnull }else{
32 76193d7c 2003-09-30 devnull from = f;
33 be22ae2d 2004-03-26 devnull to = 0;
34 76193d7c 2003-09-30 devnull topid = 0;
35 76193d7c 2003-09-30 devnull }
36 76193d7c 2003-09-30 devnull lock(&onnotelock);
37 76193d7c 2003-09-30 devnull for(i=0; i<NFN; i++)
38 76193d7c 2003-09-30 devnull if(onnote[i]==from){
39 76193d7c 2003-09-30 devnull onnote[i] = to;
40 76193d7c 2003-09-30 devnull onnotepid[i] = topid;
41 76193d7c 2003-09-30 devnull break;
42 76193d7c 2003-09-30 devnull }
43 76193d7c 2003-09-30 devnull unlock(&onnotelock);
44 76193d7c 2003-09-30 devnull return i<NFN;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull static void
48 76193d7c 2003-09-30 devnull delayednotes(Proc *p, void *v)
49 76193d7c 2003-09-30 devnull {
50 76193d7c 2003-09-30 devnull int i;
51 76193d7c 2003-09-30 devnull Note *n;
52 76193d7c 2003-09-30 devnull int (*fn)(void*, char*);
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull if(!p->pending)
55 76193d7c 2003-09-30 devnull return;
56 76193d7c 2003-09-30 devnull
57 76193d7c 2003-09-30 devnull p->pending = 0;
58 76193d7c 2003-09-30 devnull for(n=notes; n<enotes; n++){
59 76193d7c 2003-09-30 devnull if(n->proc == p){
60 76193d7c 2003-09-30 devnull for(i=0; i<NFN; i++){
61 76193d7c 2003-09-30 devnull if(onnotepid[i]!=p->pid || (fn = onnote[i])==nil)
62 76193d7c 2003-09-30 devnull continue;
63 76193d7c 2003-09-30 devnull if((*fn)(v, n->s))
64 76193d7c 2003-09-30 devnull break;
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull if(i==NFN){
67 76193d7c 2003-09-30 devnull _threaddebug(DBGNOTE, "Unhandled note %s, proc %p\n", n->s, p);
68 2e965b33 2004-05-05 devnull fprint(2, "unhandled note %s, pid %d\n", n->s, p->pid);
69 76193d7c 2003-09-30 devnull if(v != nil)
70 76193d7c 2003-09-30 devnull noted(NDFLT);
71 76193d7c 2003-09-30 devnull else if(strncmp(n->s, "sys:", 4)==0)
72 76193d7c 2003-09-30 devnull abort();
73 76193d7c 2003-09-30 devnull threadexitsall(n->s);
74 76193d7c 2003-09-30 devnull }
75 76193d7c 2003-09-30 devnull n->proc = nil;
76 76193d7c 2003-09-30 devnull unlock(&n->inuse);
77 76193d7c 2003-09-30 devnull }
78 76193d7c 2003-09-30 devnull }
79 76193d7c 2003-09-30 devnull }
80 76193d7c 2003-09-30 devnull
81 76193d7c 2003-09-30 devnull void
82 76193d7c 2003-09-30 devnull _threadnote(void *v, char *s)
83 76193d7c 2003-09-30 devnull {
84 76193d7c 2003-09-30 devnull Proc *p;
85 76193d7c 2003-09-30 devnull Note *n;
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull _threaddebug(DBGNOTE, "Got note %s", s);
88 32f69c36 2003-12-11 devnull if(strncmp(s, "sys:", 4) == 0 && strcmp(s, "sys: write on closed pipe") != 0)
89 76193d7c 2003-09-30 devnull noted(NDFLT);
90 76193d7c 2003-09-30 devnull
91 76193d7c 2003-09-30 devnull // if(_threadexitsallstatus){
92 76193d7c 2003-09-30 devnull // _threaddebug(DBGNOTE, "Threadexitsallstatus = '%s'\n", _threadexitsallstatus);
93 76193d7c 2003-09-30 devnull // _exits(_threadexitsallstatus);
94 76193d7c 2003-09-30 devnull // }
95 76193d7c 2003-09-30 devnull
96 d51419bf 2004-02-09 devnull if(strcmp(s, "threadint")==0 || strcmp(s, "interrupt")==0)
97 76193d7c 2003-09-30 devnull noted(NCONT);
98 76193d7c 2003-09-30 devnull
99 76193d7c 2003-09-30 devnull p = _threadgetproc();
100 76193d7c 2003-09-30 devnull if(p == nil)
101 76193d7c 2003-09-30 devnull noted(NDFLT);
102 76193d7c 2003-09-30 devnull
103 76193d7c 2003-09-30 devnull for(n=notes; n<enotes; n++)
104 76193d7c 2003-09-30 devnull if(canlock(&n->inuse))
105 76193d7c 2003-09-30 devnull break;
106 76193d7c 2003-09-30 devnull if(n==enotes)
107 76193d7c 2003-09-30 devnull sysfatal("libthread: too many delayed notes");
108 76193d7c 2003-09-30 devnull utfecpy(n->s, n->s+ERRMAX, s);
109 76193d7c 2003-09-30 devnull n->proc = p;
110 76193d7c 2003-09-30 devnull p->pending = 1;
111 76193d7c 2003-09-30 devnull if(!p->splhi)
112 76193d7c 2003-09-30 devnull delayednotes(p, v);
113 76193d7c 2003-09-30 devnull noted(NCONT);
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull
116 76193d7c 2003-09-30 devnull int
117 76193d7c 2003-09-30 devnull _procsplhi(void)
118 76193d7c 2003-09-30 devnull {
119 76193d7c 2003-09-30 devnull int s;
120 76193d7c 2003-09-30 devnull Proc *p;
121 76193d7c 2003-09-30 devnull
122 76193d7c 2003-09-30 devnull p = _threadgetproc();
123 76193d7c 2003-09-30 devnull s = p->splhi;
124 76193d7c 2003-09-30 devnull p->splhi = 1;
125 76193d7c 2003-09-30 devnull return s;
126 76193d7c 2003-09-30 devnull }
127 76193d7c 2003-09-30 devnull
128 76193d7c 2003-09-30 devnull void
129 76193d7c 2003-09-30 devnull _procsplx(int s)
130 76193d7c 2003-09-30 devnull {
131 76193d7c 2003-09-30 devnull Proc *p;
132 76193d7c 2003-09-30 devnull
133 76193d7c 2003-09-30 devnull p = _threadgetproc();
134 76193d7c 2003-09-30 devnull p->splhi = s;
135 76193d7c 2003-09-30 devnull if(s)
136 76193d7c 2003-09-30 devnull return;
137 76193d7c 2003-09-30 devnull /*
138 76193d7c 2003-09-30 devnull if(p->pending)
139 76193d7c 2003-09-30 devnull delayednotes(p, nil);
140 76193d7c 2003-09-30 devnull */
141 76193d7c 2003-09-30 devnull }
142 76193d7c 2003-09-30 devnull