Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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