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