| #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; |
| } |