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]
