| atnotify.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
| git clone git://git.suckless.org/9base | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| atnotify.c (780B) | |
| --- | |
| 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 } |