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