ref: e94d21ee3a2d7d053899d490b115ba763d0a1bc2
dir: /sys/src/libc/port/atnotify.c/
#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; }