13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier
43e12c5d1SDavid du Colombier #define NFN 33
53e12c5d1SDavid du Colombier static int (*onnot[NFN])(void*, char*);
6*7dd7cddfSDavid du Colombier static Lock onnotlock;
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombier static
93e12c5d1SDavid du Colombier void
notifier(void * v,char * s)103e12c5d1SDavid du Colombier notifier(void *v, char *s)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier int i;
133e12c5d1SDavid du Colombier
143e12c5d1SDavid du Colombier for(i=0; i<NFN; i++)
153e12c5d1SDavid du Colombier if(onnot[i] && ((*onnot[i])(v, s))){
163e12c5d1SDavid du Colombier noted(NCONT);
173e12c5d1SDavid du Colombier return;
183e12c5d1SDavid du Colombier }
193e12c5d1SDavid du Colombier noted(NDFLT);
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier
223e12c5d1SDavid du Colombier int
atnotify(int (* f)(void *,char *),int in)233e12c5d1SDavid du Colombier atnotify(int (*f)(void*, char*), int in)
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier int i, n, ret;
263e12c5d1SDavid du Colombier static int init;
273e12c5d1SDavid du Colombier
283e12c5d1SDavid du Colombier if(!init){
293e12c5d1SDavid du Colombier notify(notifier);
303e12c5d1SDavid du Colombier init = 1; /* assign = */
313e12c5d1SDavid du Colombier }
323e12c5d1SDavid du Colombier ret = 0;
33*7dd7cddfSDavid du Colombier lock(&onnotlock);
343e12c5d1SDavid du Colombier if(in){
353e12c5d1SDavid du Colombier for(i=0; i<NFN; i++)
363e12c5d1SDavid du Colombier if(onnot[i] == 0) {
373e12c5d1SDavid du Colombier onnot[i] = f;
383e12c5d1SDavid du Colombier ret = 1;
393e12c5d1SDavid du Colombier break;
403e12c5d1SDavid du Colombier }
413e12c5d1SDavid du Colombier }else{
423e12c5d1SDavid du Colombier n = 0;
433e12c5d1SDavid du Colombier for(i=0; i<NFN; i++)
443e12c5d1SDavid du Colombier if(onnot[i]){
453e12c5d1SDavid du Colombier if(ret==0 && onnot[i]==f){
463e12c5d1SDavid du Colombier onnot[i] = 0;
473e12c5d1SDavid du Colombier ret = 1;
483e12c5d1SDavid du Colombier }else
493e12c5d1SDavid du Colombier n++;
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier if(n == 0){
523e12c5d1SDavid du Colombier init = 0;
533e12c5d1SDavid du Colombier notify(0);
543e12c5d1SDavid du Colombier }
553e12c5d1SDavid du Colombier }
56*7dd7cddfSDavid du Colombier unlock(&onnotlock);
573e12c5d1SDavid du Colombier return ret;
583e12c5d1SDavid du Colombier }
59