xref: /plan9/sys/src/libc/port/atnotify.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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