Blame


1 fd04aace 2003-11-23 devnull #include <u.h>
2 fd04aace 2003-11-23 devnull #include <libc.h>
3 fd04aace 2003-11-23 devnull
4 fd04aace 2003-11-23 devnull #define NFN 33
5 fd04aace 2003-11-23 devnull static int (*onnot[NFN])(void*, char*);
6 fd04aace 2003-11-23 devnull static Lock onnotlock;
7 fd04aace 2003-11-23 devnull
8 fd04aace 2003-11-23 devnull static
9 fd04aace 2003-11-23 devnull void
10 fd04aace 2003-11-23 devnull notifier(void *v, char *s)
11 fd04aace 2003-11-23 devnull {
12 fd04aace 2003-11-23 devnull int i;
13 fd04aace 2003-11-23 devnull
14 fd04aace 2003-11-23 devnull for(i=0; i<NFN; i++)
15 fd04aace 2003-11-23 devnull if(onnot[i] && ((*onnot[i])(v, s))){
16 fd04aace 2003-11-23 devnull noted(NCONT);
17 fd04aace 2003-11-23 devnull return;
18 fd04aace 2003-11-23 devnull }
19 fd04aace 2003-11-23 devnull noted(NDFLT);
20 fd04aace 2003-11-23 devnull }
21 fd04aace 2003-11-23 devnull
22 fd04aace 2003-11-23 devnull int
23 fd04aace 2003-11-23 devnull atnotify(int (*f)(void*, char*), int in)
24 fd04aace 2003-11-23 devnull {
25 fd04aace 2003-11-23 devnull int i, n, ret;
26 fd04aace 2003-11-23 devnull static int init;
27 fd04aace 2003-11-23 devnull
28 fd04aace 2003-11-23 devnull if(!init){
29 fd04aace 2003-11-23 devnull notify(notifier);
30 fd04aace 2003-11-23 devnull init = 1; /* assign = */
31 fd04aace 2003-11-23 devnull }
32 fd04aace 2003-11-23 devnull ret = 0;
33 fd04aace 2003-11-23 devnull lock(&onnotlock);
34 fd04aace 2003-11-23 devnull if(in){
35 fd04aace 2003-11-23 devnull for(i=0; i<NFN; i++)
36 fd04aace 2003-11-23 devnull if(onnot[i] == 0) {
37 fd04aace 2003-11-23 devnull onnot[i] = f;
38 fd04aace 2003-11-23 devnull ret = 1;
39 fd04aace 2003-11-23 devnull break;
40 fd04aace 2003-11-23 devnull }
41 fd04aace 2003-11-23 devnull }else{
42 fd04aace 2003-11-23 devnull n = 0;
43 fd04aace 2003-11-23 devnull for(i=0; i<NFN; i++)
44 fd04aace 2003-11-23 devnull if(onnot[i]){
45 fd04aace 2003-11-23 devnull if(ret==0 && onnot[i]==f){
46 fd04aace 2003-11-23 devnull onnot[i] = 0;
47 fd04aace 2003-11-23 devnull ret = 1;
48 fd04aace 2003-11-23 devnull }else
49 fd04aace 2003-11-23 devnull n++;
50 fd04aace 2003-11-23 devnull }
51 fd04aace 2003-11-23 devnull if(n == 0){
52 fd04aace 2003-11-23 devnull init = 0;
53 fd04aace 2003-11-23 devnull notify(0);
54 fd04aace 2003-11-23 devnull }
55 fd04aace 2003-11-23 devnull }
56 fd04aace 2003-11-23 devnull unlock(&onnotlock);
57 fd04aace 2003-11-23 devnull return ret;
58 fd04aace 2003-11-23 devnull }