RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 21-Jun-2017 09:19:42 Branch: rpm-5_4 Handle: 2017062107194200 Modified files: (Branch: rpm-5_4) rpm/rpmio rpmeio.c rpmeio.h teio.c Log: - rpmeio: run time selection of pipe/libev dispatching. Summary: Revision Changes Path 1.1.2.8 +54 -68 rpm/rpmio/rpmeio.c 1.1.2.7 +3 -0 rpm/rpmio/rpmeio.h 1.1.2.13 +1 -1 rpm/rpmio/teio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/rpmeio.c ============================================================================ $ cvs diff -u -r1.1.2.7 -r1.1.2.8 rpmeio.c --- rpm/rpmio/rpmeio.c 21 Jun 2017 06:40:28 -0000 1.1.2.7 +++ rpm/rpmio/rpmeio.c 21 Jun 2017 07:19:42 -0000 1.1.2.8 @@ -178,29 +178,23 @@ /*==============================================================*/ -#undef USE_PIPE - struct rpmevl_s { -#if defined(USE_PIPE) + unsigned flags; int pipefdno[2]; #define pipein evl->pipefdno[0] #define pipeout evl->pipefdno[1] -#else struct ev_loop *loop; rpmev idle_ev; rpmev async_ev; -#endif rpmzLog zlog; /*!< high precision timestamp'd log */ }; static struct rpmevl_s _evl; static rpmevl rpmevlGet(void) { -#if defined(USE_PIPE) - return &_evl; -#else - return (rpmevl) ev_userdata(EV_DEFAULT); -#endif + if (_evl.flags & RPMEVL_PIPE) + return &_evl; + return (rpmevl) ev_userdata(EV_DEFAULT); } /* idle watcher callback, only used when eio_poll */ @@ -220,15 +214,12 @@ static void ready (EV_P_ ev_async *w, int revents) { -#if !defined(USE_PIPE) rpmevl evl = (rpmevl) ev_userdata(loop); rpmzLog zlog = evl->zlog; ZSPEW("--> %s(%p, %p, %d)", __FUNCTION__, loop, w, revents); - if (eio_poll() == -1) { + if (eio_poll() == -1) evl->idle_ev = rpmevNew(RPMEV_TYPE_IDLE, NULL); - } -#endif /* USE_PIPE */ } /* wake up the event loop */ @@ -238,15 +229,15 @@ rpmevl evl = rpmevlGet(); rpmzLog zlog = evl->zlog; -#if defined(USE_PIPE) - char dummy = '\0'; - ssize_t nw = write(pipeout, &dummy, sizeof(dummy)); + if (evl->flags & RPMEVL_PIPE) { + char dummy = '\0'; + ssize_t nw = write(pipeout, &dummy, sizeof(dummy)); ZSPEW("<-- %s(%d) nw %zd", "write", pipeout, nw); -#else - ev_async * w = &evl->async_ev->evw.async; - ev_async_send(evl->loop, w); + } else { + ev_async * w = &evl->async_ev->evw.async; + ev_async_send(evl->loop, w); ZSPEW("<-- %s()", __FUNCTION__); -#endif + } } static @@ -255,13 +246,12 @@ rpmevl evl = rpmevlGet(); rpmzLog zlog = evl->zlog; -#if defined(USE_PIPE) - char dummy = '\0'; - ssize_t nr = read(pipein, &dummy, sizeof(dummy)); -ZSPEW("<-- %s(%d) nr %zd nthreads:%u nreqs:%u nready:%u npending:%u", " read", pipein, nr, eio_nthreads(), eio_nreqs(), eio_nready(), eio_npending()); -#else + if (evl->flags & RPMEVL_PIPE) { + char dummy = '\0'; + ssize_t nr = read(pipein, &dummy, sizeof(dummy)); +ZSPEW("<-- %s(%d) nr %zd", " read", pipein, nr); + } ZSPEW("<-- %s() nthreads:%u nreqs:%u nready:%u npending:%u", __FUNCTION__, eio_nthreads(), eio_nreqs(), eio_nready(), eio_npending()); -#endif /* USE_PIPE */ } #ifdef TODO @@ -293,33 +283,36 @@ rpmevl rpmeioStart(unsigned flags) { int rc; + rpmevl evl = NULL; -#if defined(USE_PIPE) - rpmevl evl = &_evl; - - evl->pipefdno[0] = -1; - evl->pipefdno[1] = -1; - rc = pipe(evl->pipefdno); - - if (!rc) - rc = eio_init(want_poll, done_poll); + if (flags & RPMEVL_PIPE) { + evl = &_evl; + evl->pipefdno[0] = -1; + evl->pipefdno[1] = -1; + evl->loop = NULL; + evl->idle_ev = NULL; + evl->async_ev = NULL; + + rc = pipe(evl->pipefdno); + if (!rc) + rc = eio_init(want_poll, done_poll); SPEW("<-- %s() evl %p pipe [%d,%d]", __FUNCTION__, evl, evl->pipefdno[0], evl->pipefdno[1]); + } else { + evl = xcalloc(1, sizeof(*evl)); + evl->pipefdno[0] = -1; + evl->pipefdno[1] = -1; + + evl->loop = ev_default_loop(EVFLAG_AUTO); + ev_set_userdata(evl->loop, evl); + evl->async_ev = rpmevNew(RPMEV_TYPE_ASYNC, ready); -#else /* USE_PIPE */ - rpmevl evl = xcalloc(1, sizeof(*evl)); - - evl->loop = ev_default_loop(EVFLAG_AUTO); - ev_set_userdata(evl->loop, evl); - - evl->async_ev = rpmevNew(RPMEV_TYPE_ASYNC, ready); - - rc = eio_init (want_poll, done_poll); + rc = eio_init (want_poll, done_poll); SPEW("<-- %s() evl %p loop %p", __FUNCTION__, evl, evl->loop); + } -#endif /* USE_PIPE */ - + evl->flags = flags; evl->zlog = (_rpmeio_debug || _rpmio_debug) ? rpmzLogNew(NULL) : NULL; return evl; @@ -332,25 +325,20 @@ ZSPEW("==> %s()", __FUNCTION__); -#if defined(USE_PIPE) - struct pollfd pfd; pfd.fd = pipein; pfd.events = POLLIN; while (eio_nreqs() > 0) { - int xx = poll(&pfd, 1, -1); - (void)xx; - npolls = eio_poll(); - } -#else - - while (eio_nreqs() > 0) { ZSPEW("*** %s() nthreads:%u nreqs:%u nready:%u npending:%u", __FUNCTION__, eio_nthreads(), eio_nreqs(), eio_nready(), eio_npending()); - ev_run(evl->loop, EVRUN_ONCE); - npolls++; + if (evl->flags & RPMEVL_PIPE) { + (void) poll(&pfd, 1, -1); + npolls = eio_poll(); + } else { + ev_run(evl->loop, EVRUN_ONCE); + npolls++; + } } -#endif /* USE_PIPE */ ZSPEW("<== %s() npolls %d", __FUNCTION__, npolls); } @@ -360,15 +348,13 @@ while (eio_nreqs() > 0) rpmeioLoop(evl); -#if defined(USE_PIPE) -#else - if (evl->idle_ev) - evl->idle_ev = rpmevFree(evl->idle_ev); - if (evl->async_ev) - evl->async_ev = rpmevFree(evl->async_ev); - - ev_loop_destroy(evl->loop); -#endif /* !USE_PIPE */ + if (!(evl->flags & RPMEVL_PIPE)) { + if (evl->idle_ev) + evl->idle_ev = rpmevFree(evl->idle_ev); + if (evl->async_ev) + evl->async_ev = rpmevFree(evl->async_ev); + ev_loop_destroy(evl->loop); + } fprintf(stderr, "***************************************\n"); if (evl->zlog) @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmeio.h ============================================================================ $ cvs diff -u -r1.1.2.6 -r1.1.2.7 rpmeio.h --- rpm/rpmio/rpmeio.h 21 Jun 2017 06:40:28 -0000 1.1.2.6 +++ rpm/rpmio/rpmeio.h 21 Jun 2017 07:19:42 -0000 1.1.2.7 @@ -8,6 +8,7 @@ extern int _rpmeio_debug; typedef struct rpmeio_s * rpmeio; + typedef struct rpmevl_s * rpmevl; /** @@ -98,6 +99,8 @@ extern void rpmeioDumpREQ(const char *msg, eio_req * req, FILE *fp); rpmevl rpmeioStart(unsigned flags); +#define RPMEVL_PIPE 0x1 + void rpmeioLoop(rpmevl evl); void rpmeioDrain(rpmevl evl); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/teio.c ============================================================================ $ cvs diff -u -r1.1.2.12 -r1.1.2.13 teio.c --- rpm/rpmio/teio.c 21 Jun 2017 06:40:28 -0000 1.1.2.12 +++ rpm/rpmio/teio.c 21 Jun 2017 07:19:42 -0000 1.1.2.13 @@ -158,7 +158,7 @@ static int doEIO(ARGV_t av, int ac) { int rc = 0; - unsigned flags = 0; + unsigned flags = 0; /* RPMEVL_PIPE */ rpmevl evl = rpmeioStart(flags); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org