diff options
Diffstat (limited to 'src/lib9/atnotify.c')
-rw-r--r-- | src/lib9/atnotify.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/lib9/atnotify.c b/src/lib9/atnotify.c new file mode 100644 index 00000000..60e8ad0c --- /dev/null +++ b/src/lib9/atnotify.c @@ -0,0 +1,58 @@ +#include <u.h> +#include <libc.h> + +#define NFN 33 +static int (*onnot[NFN])(void*, char*); +static Lock onnotlock; + +static +void +notifier(void *v, char *s) +{ + int i; + + for(i=0; i<NFN; i++) + if(onnot[i] && ((*onnot[i])(v, s))){ + noted(NCONT); + return; + } + noted(NDFLT); +} + +int +atnotify(int (*f)(void*, char*), int in) +{ + int i, n, ret; + static int init; + + if(!init){ + notify(notifier); + init = 1; /* assign = */ + } + ret = 0; + lock(&onnotlock); + if(in){ + for(i=0; i<NFN; i++) + if(onnot[i] == 0) { + onnot[i] = f; + ret = 1; + break; + } + }else{ + n = 0; + for(i=0; i<NFN; i++) + if(onnot[i]){ + if(ret==0 && onnot[i]==f){ + onnot[i] = 0; + ret = 1; + }else + n++; + } + if(n == 0){ + init = 0; + notify(0); + } + } + unlock(&onnotlock); + return ret; +} |