RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   12-Jun-2017 07:16:48
  Branch: rpm-5_4                          Handle: 2017061205164800

  Modified files:           (Branch: rpm-5_4)
    rpm/rpmio               rpmev.h tmq.c

  Log:
    - WIP.

  Summary:
    Revision    Changes     Path
    1.1.2.2     +3  -7      rpm/rpmio/rpmev.h
    1.1.2.19    +125 -93    rpm/rpmio/tmq.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmev.h
  ============================================================================
  $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmev.h
  --- rpm/rpmio/rpmev.h 12 Jun 2017 03:06:21 -0000      1.1.2.1
  +++ rpm/rpmio/rpmev.h 12 Jun 2017 05:16:48 -0000      1.1.2.2
  @@ -50,13 +50,9 @@
   struct rpmev_s {
       struct rpmioItem_s _item;        /*!< usage mutex and pool identifier. */
   
  -    rpmevType evtype;
       union ev_any_watcher evw;
  -#ifdef       NOTYET
  -    void (*evcb) (void *_w, int revents);
  -#else
  -    void *evcb;
  -#endif
  +#define      __evcb  evw.w.cb
  +    rpmevType evtype;
   };
   
   #endif       /* _RPMEV_INTERNAL */
  @@ -92,7 +88,7 @@
    * Create a ev wrapper.
    * @return           ev wrapper
    */
  -rpmev rpmevNew(rpmevType evtype, void * evcb);
  +rpmev rpmevNew(rpmevType evtype, void * _evcb, ...);
   
   #ifdef __cplusplus
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/tmq.c
  ============================================================================
  $ cvs diff -u -r1.1.2.18 -r1.1.2.19 tmq.c
  --- rpm/rpmio/tmq.c   12 Jun 2017 03:06:21 -0000      1.1.2.18
  +++ rpm/rpmio/tmq.c   12 Jun 2017 05:16:48 -0000      1.1.2.19
  @@ -1215,56 +1215,21 @@
   /* every watcher type has its own typedef'd struct */
   /* with the name ev_TYPE */
   
  -/* all watcher callbacks have a similar signature */
  -
  -#define      NS(_X)    rpmev##_X
  -#define      NScb(_X_) rpmev##_X_##_cb
  -
  -#define      rpmevCBproto(_T, _N_) \
  -    void NScb(_N_) (EV_P_ ev_##_T *w, int revents)
  -
  -static
  -void rpmevDump(const char *msg, rpmev ev, FILE *fp)
  -{
  -    if (fp == NULL)  fp = stderr;
  -    if (msg) fprintf(stderr, "========================= %s(%p)\n", msg, ev);
  -    if (ev) {
  -#define PRINT(_fmt, _foo) \
  -    {   fprintf(fp, "%25s: %"#_fmt"\n", #_foo, ev->_foo); }
  -     PRINT(d, evw.w.active);
  -     PRINT(d, evw.w.pending);
  -     PRINT(p, evw.w.data);
  -     PRINT(p, evw.w.cb);
  -#undef       PRINT
  -
  -    }
  -}
  -
   #define      RPMEV_MAX_ALLOC 64
   static rpmev evs[RPMEV_MAX_ALLOC];
   static int nevs = 0;
   
  -rpmev rpmevNew(rpmevType evtype, void *evcb)
  -{
  -    rpmev ev = NULL;
  -    if (nevs < RPMEV_MAX_ALLOC) {
  -     ev = xcalloc(1, sizeof(*ev));   /* XXX xmalloc */
  -     ev_watcher * w = &ev->evw.w;
  -     ev_init(w, evcb);
  -     ev->evtype = evtype;
  -     ev->evcb = evcb;                /* XXX snarf from ev->evw.w. */
  -     evs[nevs++] = ev;
  -    }
  -SPEW("<-- %s(%d,%p) ev %p\n", __FUNCTION__, evtype, evcb, ev);
  -    return ev;
  -}
  +/* all watcher callbacks have a similar signature */
   
   /* --- */
  -static rpmevCBproto(child, Child) {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +static
  +void rpmevChild_cb(EV_P_ void * _w, int revents)
  +{
  +    ev_child * w = (ev_child *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_CHILD);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
  -    SPEW("--> %s(%p, %s) pid %u status %u\n", __FUNCTION__, w, rstr, 
w->rpid, w->rstatus);
  +    SPEW("--> %s(%p, %s) pid %u status %u (0x%x)\n", __FUNCTION__, w, rstr, 
w->rpid, __WEXITSTATUS(w->rstatus), w->rstatus);
       rstr = _free(rstr);
     }
       ev_child_stop (EV_A_ w);
  @@ -1285,7 +1250,7 @@
        exit(rc);
       } else {
        if (nevs < RPMEV_MAX_ALLOC) {
  -         rpmev ev = rpmevNew(RPMEV_TYPE_CHILD, NScb(Child));
  +         rpmev ev = rpmevNew(RPMEV_TYPE_CHILD, NULL);
            ev_child * w = &ev->evw.child;
            w->pid = 0;
            w->flags = 0;       /** XXX 0=terminate, 1=stop/continue */
  @@ -1298,10 +1263,11 @@
   }
   
   /* --- */
  -static void  NScb(Stdin)(EV_P_ ev_io *w, int revents)
  +static void rpmevIo_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_io * w = (ev_io *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_IO);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s) fd %d events 0x%x\n", __FUNCTION__, w, rstr, w->fd, 
w->events);
       rstr = _free(rstr);
  @@ -1314,10 +1280,11 @@
       ev_unloop(EV_A_ EVUNLOOP_ALL);
   }
   /* --- */
  -static void  NScb(Timeout)(EV_P_ ev_timer *w, int revents)
  +static void rpmevTimer_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_timer * w = (ev_timer *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_TIMER);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s) repeat %f\n", __FUNCTION__, w, rstr, w->repeat);
       rstr = _free(rstr);
  @@ -1331,10 +1298,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(periodic, Periodic)
  +static void rpmevPeriodic_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_periodic * w = (ev_periodic *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_PERIODIC);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s) offset %f interval %f reschedule_cb %p\n", 
__FUNCTION__, w, rstr, w->offset, w->interval, w->reschedule_cb);
       rstr = _free(rstr);
  @@ -1343,10 +1311,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(signal, Signal)
  +static void rpmevSignal_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_signal * w = (ev_signal *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_SIGNAL);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s) signum %d\n", __FUNCTION__, w, rstr, w->signum);
       rstr = _free(rstr);
  @@ -1354,10 +1323,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(stat, Stat)
  +static void rpmevStat_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_stat * w = (ev_stat *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_STAT);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s) path %s wd %d\n", __FUNCTION__, w, rstr, w->path, 
w->wd);
       rstr = _free(rstr);
  @@ -1365,10 +1335,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(idle, Idle)
  +static void rpmevIdle_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_idle * w = (ev_idle *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_IDLE);
   #ifdef       NOISY
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
  @@ -1381,10 +1352,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(prepare, Prepare)
  +static void rpmevPrepare_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_prepare * w = (ev_prepare *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_PREPARE);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
       rstr = _free(rstr);
  @@ -1392,10 +1364,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(check, Check)
  +static void rpmevCheck_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_check * w = (ev_check *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_CHECK);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
       rstr = _free(rstr);
  @@ -1403,10 +1376,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(fork, Fork)
  +static void rpmevFork_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_fork * w = (ev_fork *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_FORK);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
       rstr = _free(rstr);
  @@ -1414,10 +1388,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(cleanup, Cleanup)
  +static void rpmevCleanup_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_cleanup * w = (ev_cleanup *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_CLEANUP);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
       rstr = _free(rstr);
  @@ -1425,10 +1400,11 @@
   }
   
   /* --- */
  -static rpmevCBproto(embed, Embed)
  +static void rpmevEmbed_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_embed * w = (ev_embed *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_EMBED);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
       rstr = _free(rstr);
  @@ -1436,16 +1412,72 @@
   }
   
   /* --- */
  -static rpmevCBproto(async, Async)
  +static void rpmevAsync_cb(EV_P_ void * _w, int revents)
   {
  -    rpmev ev = (rpmev) (((struct rpmioItem_s *)w) - 1);
  -    (void)ev;
  +    ev_async * w = (ev_async *) _w;
  +    rpmev ev = (rpmev) w->data;
  +assert(ev && ev->evtype == RPMEV_TYPE_ASYNC);
     { char *rstr = rpmioB2N(rpmioEVTable, revents);
       SPEW("--> %s(%p, %s)\n", __FUNCTION__, w, rstr);
       rstr = _free(rstr);
     }
   }
   
  +static
  +void rpmevDump(const char *msg, rpmev ev, FILE *fp)
  +{
  +    if (fp == NULL)  fp = stderr;
  +    if (msg) fprintf(stderr, "========================= %s(%p)\n", msg, ev);
  +    if (ev) {
  +#define PRINT(_fmt, _foo) \
  +    {   fprintf(fp, "%25s: %"#_fmt"\n", #_foo, ev->_foo); }
  +     PRINT(u, evtype);
  +     PRINT(d, evw.w.active);
  +     PRINT(d, evw.w.pending);
  +     PRINT(p, evw.w.data);
  +     PRINT(p, evw.w.cb);
  +#undef       PRINT
  +
  +    }
  +}
  +
  +rpmev rpmevNew(rpmevType evtype, void * _evcb, ...)
  +{
  +    rpmev ev = NULL;
  +    if (nevs < RPMEV_MAX_ALLOC) {
  +     ev = xcalloc(1, sizeof(*ev));   /* XXX xmalloc */
  +     ev_watcher * w = &ev->evw.w;
  +
  +     if (_evcb == NULL)
  +     switch (evtype) {
  +     default:
  +     case RPMEV_TYPE_UNKNOWN:
  +         break;
  +     case RPMEV_TYPE_IO:             _evcb = rpmevIo_cb;             break;
  +     case RPMEV_TYPE_TIMER:          _evcb = rpmevTimer_cb;          break;
  +     case RPMEV_TYPE_PERIODIC:       _evcb = rpmevPeriodic_cb;       break;
  +     case RPMEV_TYPE_SIGNAL:         _evcb = rpmevSignal_cb;         break;
  +     case RPMEV_TYPE_CHILD:          _evcb = rpmevChild_cb;          break;
  +     case RPMEV_TYPE_STAT:           _evcb = rpmevStat_cb;           break;
  +     case RPMEV_TYPE_IDLE:           _evcb = rpmevIdle_cb;           break;
  +     case RPMEV_TYPE_PREPARE:        _evcb = rpmevPrepare_cb;        break;
  +     case RPMEV_TYPE_CHECK:          _evcb = rpmevCheck_cb;          break;
  +     case RPMEV_TYPE_FORK:           _evcb = rpmevFork_cb;           break;
  +     case RPMEV_TYPE_CLEANUP:        _evcb = rpmevCleanup_cb;        break;
  +     case RPMEV_TYPE_EMBED:          _evcb = rpmevEmbed_cb;          break;
  +     case RPMEV_TYPE_ASYNC:          _evcb = rpmevAsync_cb;          break;
  +
  +     }
  +     ev_init(w, _evcb);
  +     w->data = ev;
  +     ev->evtype = evtype;
  +
  +     evs[nevs++] = ev;
  +    }
  +SPEW("<-- %s(%d,%p) ev %p\n", __FUNCTION__, evtype, _evcb, ev);
  +    return ev;
  +}
  +
   static int doEV(ARGV_t av, int ac)
   {
       int rc = 0;
  @@ -1477,7 +1509,7 @@
   
       /* initialise an io watcher, then start it */
       /* this one will watch for stdin to become readable */
  -    ev = rpmevNew(RPMEV_TYPE_IO,     NScb(Stdin));
  +    ev = rpmevNew(RPMEV_TYPE_IO,     NULL);
   rpmevDump(__FUNCTION__, ev, NULL);
       {        ev_io * w = &ev->evw.io;
        w->fd = STDIN_FILENO;
  @@ -1487,13 +1519,13 @@
   
       /* initialise a timer watcher, then start it */
       /* simple non-repeating 5.5 second timeout */
  -    ev = rpmevNew(RPMEV_TYPE_TIMER,  NScb(Timeout));
  +    ev = rpmevNew(RPMEV_TYPE_TIMER,  NULL);
       {        ev_timer * w = &ev->evw.timer;
        w->repeat = 5.5;
        ev_timer_start(loop, w);
       }
   
  -    ev = rpmevNew(RPMEV_TYPE_PERIODIC,       NScb(Periodic));
  +    ev = rpmevNew(RPMEV_TYPE_PERIODIC,       NULL);
       {        ev_periodic * w = &ev->evw.periodic;
        w->offset = 0.0;
        w->interval = 11.0;
  @@ -1501,36 +1533,36 @@
        ev_periodic_start(loop, w);
       }
   
  -    ev = rpmevNew(RPMEV_TYPE_SIGNAL, NScb(Signal));
  +    ev = rpmevNew(RPMEV_TYPE_SIGNAL, NULL);
       {        ev_signal * w = &ev->evw.signal;
        w->signum = SIGUSR1;
        ev_signal_start(loop, w);
       }
   
  -    ev = rpmevNew(RPMEV_TYPE_CHILD,  NScb(Child));
  +    ev = rpmevNew(RPMEV_TYPE_CHILD,  NULL);
       {        ev_child * w = &ev->evw.child;
        w->pid = 0;
        w->flags = 0;   /** XXX 0=terminate, 1=stop/continue */
       }
   
  -    ev = rpmevNew(RPMEV_TYPE_STAT,   NScb(Stat));
  +    ev = rpmevNew(RPMEV_TYPE_STAT,   NULL);
       {        ev_stat * w = &ev->evw.stat;
        w->interval = 0;        /* XXX 0=recommended ~5s, must be >0.1 */
        w->path = "/X/src/wdj54/rpmio/tmq";
        ev_stat_start(loop, w);
       }
   
  -    ev = rpmevNew(RPMEV_TYPE_IDLE,   NScb(Idle));
  +    ev = rpmevNew(RPMEV_TYPE_IDLE,   NULL);
       {        ev_idle * w = &ev->evw.idle;
        ev_idle_start(loop, w);
       }
   
  -    ev = rpmevNew(RPMEV_TYPE_PREPARE,        NScb(Prepare));
  -    ev = rpmevNew(RPMEV_TYPE_CHECK,  NScb(Check));
  -    ev = rpmevNew(RPMEV_TYPE_FORK,   NScb(Fork));
  -    ev = rpmevNew(RPMEV_TYPE_CLEANUP,        NScb(Cleanup));
  -    ev = rpmevNew(RPMEV_TYPE_EMBED,  NScb(Embed));
  -    ev = rpmevNew(RPMEV_TYPE_ASYNC,  NScb(Async));
  +    ev = rpmevNew(RPMEV_TYPE_PREPARE,        NULL);
  +    ev = rpmevNew(RPMEV_TYPE_CHECK,  NULL);
  +    ev = rpmevNew(RPMEV_TYPE_FORK,   NULL);
  +    ev = rpmevNew(RPMEV_TYPE_CLEANUP,        NULL);
  +    ev = rpmevNew(RPMEV_TYPE_EMBED,  NULL);
  +    ev = rpmevNew(RPMEV_TYPE_ASYNC,  NULL);
   
       /* now wait for events to arrive */
       ev_run(loop, 0);
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to