Annotation of embedaddon/mpd/src/msg.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * msg.c
                      4:  *
                      5:  * Written by Archie Cobbs <archie@freebsd.org>
                      6:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
                      7:  * See ``COPYRIGHT.whistle''
                      8:  */
                      9: 
                     10: #include "ppp.h"
                     11: #include "msg.h"
                     12: 
                     13: /*
                     14:  * DEFINITIONS
                     15:  */
                     16: 
                     17: /* Which pipe file descriptor is which */
                     18: 
                     19:   #define PIPE_READ            0
                     20:   #define PIPE_WRITE           1
                     21: 
                     22:   struct mpmsg
                     23:   {
                     24:     int                type;
                     25:     void       (*func)(int type, void *arg);
                     26:     void       *arg;
                     27:     const char *dbg;
                     28:   };
                     29:   typedef struct mpmsg *Msg;
                     30: 
                     31:   #define      MSG_QUEUE_LEN   8192
                     32:   #define      MSG_QUEUE_MASK  0x1FFF
                     33: 
                     34:   struct mpmsg msgqueue[MSG_QUEUE_LEN];
                     35:   int          msgqueueh = 0;
                     36:   int          msgqueuet = 0;
                     37:   #define      QUEUELEN()      ((msgqueueh >= msgqueuet)?      \
                     38:        (msgqueueh - msgqueuet):(msgqueueh + MSG_QUEUE_LEN - msgqueuet))
                     39: 
                     40:   int           msgpipe[2];
                     41:   int          msgpipesent = 0;
                     42:   EventRef     msgevent;
                     43: 
                     44: /*
                     45:  * INTERNAL FUNCTIONS
                     46:  */
                     47: 
                     48:   static void  MsgEvent(int type, void *cookie);
                     49: 
                     50: /*
                     51:  * MsgRegister()
                     52:  */
                     53: 
                     54: void
                     55: MsgRegister2(MsgHandler *m, void (*func)(int type, void *arg), const char *dbg)
                     56: {
                     57:     if ((msgpipe[0]==0) || (msgpipe[1]==0)) {
                     58:        if (pipe(msgpipe) < 0) {
                     59:            Perror("%s: Can't create message pipe", 
                     60:                __FUNCTION__);
                     61:            DoExit(EX_ERRDEAD);
                     62:        }
                     63:        fcntl(msgpipe[PIPE_READ], F_SETFD, 1);
                     64:        fcntl(msgpipe[PIPE_WRITE], F_SETFD, 1);
                     65: 
                     66:        if (fcntl(msgpipe[PIPE_READ], F_SETFL, O_NONBLOCK) < 0)
                     67:            Perror("%s: fcntl", __FUNCTION__);
                     68:        if (fcntl(msgpipe[PIPE_WRITE], F_SETFL, O_NONBLOCK) < 0)
                     69:            Perror("%s: fcntl", __FUNCTION__);
                     70: 
                     71:        if (EventRegister(&msgevent, EVENT_READ,
                     72:                msgpipe[PIPE_READ], EVENT_RECURRING, MsgEvent, NULL) < 0) {
                     73:            Perror("%s: Can't register event", __FUNCTION__);
                     74:            DoExit(EX_ERRDEAD);
                     75:         }
                     76:     }
                     77: 
                     78:     m->func = func;
                     79:     m->dbg = dbg;
                     80: }
                     81: 
                     82: /*
                     83:  * MsgUnRegister()
                     84:  */
                     85: 
                     86: void
                     87: MsgUnRegister(MsgHandler *m)
                     88: {
                     89:     m->func = NULL;
                     90:     m->dbg = NULL;
                     91: }
                     92: 
                     93: /*
                     94:  * MsgEvent()
                     95:  */
                     96: 
                     97: static void
                     98: MsgEvent(int type, void *cookie)
                     99: {
                    100:     char       buf[16];
                    101:     /* flush signaling pipe */
                    102:     msgpipesent = 0;
                    103:     while (read(msgpipe[PIPE_READ], buf, sizeof(buf)) == sizeof(buf));
                    104: 
                    105:     while (msgqueuet != msgqueueh) {
                    106:        Log(LG_EVENTS, ("EVENT: Message %d to %s received",
                    107:            msgqueue[msgqueuet].type, msgqueue[msgqueuet].dbg));
                    108:        (*(msgqueue[msgqueuet].func))(msgqueue[msgqueuet].type, msgqueue[msgqueuet].arg);
                    109:        Log(LG_EVENTS, ("EVENT: Message %d to %s processed",
                    110:            msgqueue[msgqueuet].type, msgqueue[msgqueuet].dbg));
                    111: 
                    112:        msgqueuet = (msgqueuet + 1) & MSG_QUEUE_MASK;
                    113:        SETOVERLOAD(QUEUELEN());
                    114:     }
                    115: }
                    116: 
                    117: /*
                    118:  * MsgSend()
                    119:  */
                    120: 
                    121: void
                    122: MsgSend(MsgHandler *m, int type, void *arg)
                    123: {
                    124:     assert(m);
                    125:     assert(m->func);
                    126: 
                    127:     msgqueue[msgqueueh].type = type;
                    128:     msgqueue[msgqueueh].func = m->func;
                    129:     msgqueue[msgqueueh].arg = arg;
                    130:     msgqueue[msgqueueh].dbg = m->dbg;
                    131: 
                    132:     msgqueueh = (msgqueueh + 1) & MSG_QUEUE_MASK;
                    133:     if (msgqueuet == msgqueueh) {
                    134:         Log(LG_ERR, ("%s: Fatal message queue overflow!", __FUNCTION__));
                    135:         DoExit(EX_ERRDEAD);
                    136:     }
                    137: 
                    138:     SETOVERLOAD(QUEUELEN());
                    139: 
                    140:     if (!msgpipesent) {
                    141:        char    buf[1] = { 0x2a };
                    142:        if (write(msgpipe[PIPE_WRITE], buf, 1) > 0)
                    143:            msgpipesent = 1;
                    144:     }
                    145:     Log(LG_EVENTS, ("EVENT: Message %d to %s sent", type, m->dbg));
                    146: }
                    147: 
                    148: /*
                    149:  * MsgName()
                    150:  */
                    151: 
                    152: const char *
                    153: MsgName(int msg)
                    154: {
                    155:   switch (msg)
                    156:   {
                    157:     case MSG_OPEN:
                    158:       return("OPEN");
                    159:     case MSG_CLOSE:
                    160:       return("CLOSE");
                    161:     case MSG_UP:
                    162:       return("UP");
                    163:     case MSG_DOWN:
                    164:       return("DOWN");
                    165:     case MSG_SHUTDOWN:
                    166:       return("SHUTDOWN");
                    167:     default:
                    168:       return("???");
                    169:   }
                    170: }
                    171: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>