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 05:34:47 Branch: rpm-5_4 Handle: 2017062103344601 Modified files: (Branch: rpm-5_4) rpm/rpmio librpmio.vers rpmeio.c rpmeio.h teio.c Log: - rpmeio: sketch in the libev <-> libeio loop handoff. more todo++. Summary: Revision Changes Path 2.199.2.96 +0 -3 rpm/rpmio/librpmio.vers 1.1.2.6 +95 -45 rpm/rpmio/rpmeio.c 1.1.2.5 +2 -6 rpm/rpmio/rpmeio.h 1.1.2.11 +20 -13 rpm/rpmio/teio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/librpmio.vers ============================================================================ $ cvs diff -u -r2.199.2.95 -r2.199.2.96 librpmio.vers --- rpm/rpmio/librpmio.vers 20 Jun 2017 02:57:33 -0000 2.199.2.95 +++ rpm/rpmio/librpmio.vers 21 Jun 2017 03:34:46 -0000 2.199.2.96 @@ -478,9 +478,6 @@ rpmeioLoop; rpmeioNew; rpmeioReqType; - rpmeioPipe; - rpmeioPollWant; - rpmeioPollDone; rpmeioStart; Eio_cancel; Eio_destroy; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmeio.c ============================================================================ $ cvs diff -u -r1.1.2.5 -r1.1.2.6 rpmeio.c --- rpm/rpmio/rpmeio.c 16 Jun 2017 12:30:30 -0000 1.1.2.5 +++ rpm/rpmio/rpmeio.c 21 Jun 2017 03:34:47 -0000 1.1.2.6 @@ -1,10 +1,18 @@ #include "system.h" +#if defined(HAVE_EV_H) +# include <ev.h> +#endif + #include <rpmio.h> +#include <poptIO.h> #define _RPMEIO_INTERNAL #include <rpmeio.h> +#define _RPMEV_INTERNAL +#include <rpmev.h> + #include "debug.h" int _rpmeio_debug = -1; @@ -160,17 +168,36 @@ } /*==============================================================*/ -#ifdef REF -static struct ev_loop *loop; + +#undef USE_PIPE + +#if !defined(USE_PIPE) static ev_idle repeat_watcher; static ev_async ready_watcher; +#endif + +typedef struct rpmevl_s *rpmevl; +struct rpmevl_s { +#if defined(USE_PIPE) + 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 +}; +static struct rpmevl_s _evl; +static rpmevl evl = &_evl; /* idle watcher callback, only used when eio_poll */ /* didn't handle all results in one call */ static void repeat (EV_P_ ev_idle *w, int revents) { - if (eio_poll () != -1) +SPEW("*** %s(%p, %p, %d)\n", __FUNCTION__, loop, w, revents); + if (eio_poll() != -1) ev_idle_stop (EV_A_ w); } @@ -178,44 +205,37 @@ static void ready (EV_P_ ev_async *w, int revents) { - if (eio_poll () == -1) +SPEW("*** %s(%p, %p, %d)\n", __FUNCTION__, loop, w, revents); +#if !defined(USE_PIPE) + if (eio_poll() == -1) ev_idle_start (EV_A_ &repeat_watcher); +#endif /* USE_PIPE */ } /* wake up the event loop */ -static void -want_poll (void) -{ - ev_async_send (loop, &ready_watcher) -} - -void -my_init_eio () -{ - loop = EV_DEFAULT; - - ev_idle_init (&repeat_watcher, repeat); - ev_async_init (&ready_watcher, ready); - ev_async_start (loop, &watcher); - - eio_init (want_poll, 0); -} -#endif /* REF */ - -int rpmeioPipe[2]; - -void rpmeioPollWant(void) +static +void want_poll (void) { - char dummy; - ssize_t nw = write(rpmeioPipe[1], &dummy, 1); -SPEW("<-- %s() nw %zd\n)\n", __FUNCTION__, nw); +#if defined(USE_PIPE) + char dummy = '\0'; + ssize_t nw = write(pipeout, &dummy, sizeof(dummy)); +SPEW("<-- %s(%d) nw %zd\n", "write", pipeout, nw); +#else + ev_async_send(evl->loop, &ready_watcher); +SPEW("*** %s() loop %p)\n", __FUNCTION__, evl->loop); +#endif } -void rpmeioPollDone(void) +static +void done_poll(void) { - char dummy; - ssize_t nr = read(rpmeioPipe[0], &dummy, 1); -SPEW("<-- %s() nr %zd\n)\n", __FUNCTION__, nr); +#if defined(USE_PIPE) + char dummy = '\0'; + ssize_t nr = read(pipein, &dummy, sizeof(dummy)); +SPEW("*** %s(%d) nr %zd nthreads:%u nreqs:%u nready:%u npending:%u\n", " read", pipein, nr, eio_nthreads(), eio_nreqs(), eio_nready(), eio_npending()); +#else +SPEW("*** %s() loop %p nthreads:%u nreqs:%u nready:%u npending:%u\n", __FUNCTION__, evl->loop, eio_nthreads(), eio_nreqs(), eio_nready(), eio_npending()); +#endif /* USE_PIPE */ } #ifdef TODO @@ -244,32 +264,62 @@ #endif /* TODO */ -int rpmeioStart(void) +int rpmeioStart(void * _evl) { - int rc = pipe(rpmeioPipe); + int rc; +#if defined(USE_PIPE) + evl->pipefdno[0] = -1; + evl->pipefdno[1] = -1; + rc = pipe(evl->pipefdno); if (!rc) - rc = eio_init(rpmeioPollWant, rpmeioPollDone); + rc = eio_init(want_poll, done_poll); + +SPEW("<-- %s(%p) rc %d pipe [%d,%d]\n", __FUNCTION__, _evl, rc, evl->pipefdno[0], evl->pipefdno[1]); + +#else /* USE_PIPE */ + + evl->loop = ev_default_loop(EVFLAG_AUTO); + + ev_idle_init (&repeat_watcher, repeat); + ev_async_init (&ready_watcher, ready); + ev_async_start (evl->loop, &ready_watcher); +ev_run(evl->loop, EVRUN_NOWAIT); + + rc = eio_init (want_poll, done_poll); + +SPEW("<-- %s(%p) rc %d loop %p\n", __FUNCTION__, _evl, rc, evl->loop); + +#endif /* USE_PIPE */ -SPEW("<-- %s() rc %d pipe [%d,%d]\n", __FUNCTION__, rc, rpmeioPipe[0], rpmeioPipe[1]); return rc; } -void rpmeioLoop(void) +void rpmeioLoop(void * _eioloop) { - int polled = 0; - int xx; + int npolls = 0; + +SPEW("==> %s()\n", __FUNCTION__); +#if defined(USE_PIPE) struct pollfd pfd; - pfd.fd = rpmeioPipe[0]; + pfd.fd = pipein; pfd.events = POLLIN; -SPEW("==> %s()\n", __FUNCTION__); while (eio_nreqs()) { - xx = poll(&pfd, 1, -1); - polled = eio_poll(); + int xx = poll(&pfd, 1, -1); + (void)xx; + npolls = eio_poll(); } -SPEW("<== %s() polled %d\n", __FUNCTION__, polled); +#else + while (eio_nreqs()) { +SPEW("*** %s() loop %p nthreads:%u nreqs:%u nready:%u npending:%u\n", __FUNCTION__, evl->loop, eio_nthreads(), eio_nreqs(), eio_nready(), eio_npending()); + ev_run(evl->loop, EVRUN_ONCE); + npolls++; + } +#endif /* USE_PIPE */ + +SPEW("<== %s() npolls %d\n", __FUNCTION__, npolls); } void Eio_cancel(eio_req * req) @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmeio.h ============================================================================ $ cvs diff -u -r1.1.2.4 -r1.1.2.5 rpmeio.h --- rpm/rpmio/rpmeio.h 16 Jun 2017 12:30:30 -0000 1.1.2.4 +++ rpm/rpmio/rpmeio.h 21 Jun 2017 03:34:47 -0000 1.1.2.5 @@ -95,12 +95,8 @@ extern void rpmeioDumpREQ(const char *msg, eio_req * req, FILE *fp); -extern int rpmeioPipe[2]; -void rpmeioPollWant(void); -void rpmeioPollDone(void); -int rpmeioStart(void); - -void rpmeioLoop(void); +int rpmeioStart(void * evl); +void rpmeioLoop(void * evl); void Eio_cancel(eio_req * req); void Eio_destroy(eio_req * req); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/teio.c ============================================================================ $ cvs diff -u -r1.1.2.10 -r1.1.2.11 teio.c --- rpm/rpmio/teio.c 20 Jun 2017 07:40:05 -0000 1.1.2.10 +++ rpm/rpmio/teio.c 21 Jun 2017 03:34:47 -0000 1.1.2.11 @@ -158,8 +158,9 @@ static int doEIO(ARGV_t av, int ac) { int rc = 0; + void * evl = NULL; - rc = rpmeioStart(); + rc = rpmeioStart(evl); if (rc) goto exit; @@ -167,7 +168,7 @@ /* avoid relative paths yourself(!) */ Eio_mkdir("eio-test-dir", 0777, 0, rpmeioCB, "mkdir"); Eio_nop(0, rpmeioCB, "nop"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_stat("eio-test-dir", 0, rpmeioCB_stat, "stat"); Eio_lstat("eio-test-dir", 0, rpmeioCB_stat, "stat"); @@ -176,7 +177,7 @@ Eio_symlink("test", "eio-test-dir/eio-symlink", 0, rpmeioCB, "symlink"); Eio_mknod("eio-test-dir/eio-fifo", S_IFIFO, 0, 0, rpmeioCB, "mknod"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_utime("eio-test-dir", 12345.678, 23456.789, 0, rpmeioCB, "utime"); @@ -188,11 +189,11 @@ Eio_readdir("/nonexistant", 0, 0, rpmeioCB_readdir, "readdir"); Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat"); Eio_write(rpmeioLastFdno, "test\nfail\n", 10, 4, 0, rpmeioCB, "write"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_read(rpmeioLastFdno, 0, 8, 0, EIO_PRI_DEFAULT, rpmeioCB_read, "read"); Eio_readlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "readlink"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_dup2(1, 2, EIO_PRI_DEFAULT, rpmeioCB, "dup"); // dup stdout to stderr Eio_chmod("eio-test-dir", 0765, 0, rpmeioCB, "chmod"); @@ -201,39 +202,45 @@ Eio_fsync(rpmeioLastFdno, 0, rpmeioCB, "fsync"); Eio_sync(0, rpmeioCB, "sync"); Eio_busy(0.5, 0, rpmeioCB, "busy"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_sendfile(1, rpmeioLastFdno, 4, 5, 0, rpmeioCB, "sendfile"); // write "test\n" to stdout Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_truncate("eio-test-dir/eio-test-file", 6, 0, rpmeioCB, "truncate"); Eio_readahead(rpmeioLastFdno, 0, 64, 0, rpmeioCB, "readahead"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_close(rpmeioLastFdno, 0, rpmeioCB, "close"); Eio_link("eio-test-dir/eio-test-file", "eio-test-dir/eio-test-file-2", 0, rpmeioCB, "link"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_rename("eio-test-dir/eio-test-file", "eio-test-dir/eio-test-file-renamed", 0, rpmeioCB, "rename"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_unlink("eio-test-dir/eio-fifo", 0, rpmeioCB, "unlink"); Eio_unlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "unlink"); Eio_unlink("eio-test-dir/eio-test-file-2", 0, rpmeioCB, "unlink"); Eio_unlink("eio-test-dir/eio-test-file-renamed", 0, rpmeioCB, "unlink"); - rpmeioLoop(); + rpmeioLoop(evl); Eio_rmdir("eio-test-dir", 0, rpmeioCB, "rmdir"); - rpmeioLoop(); + rpmeioLoop(evl); } while (0); + while (eio_nreqs() > 0) { +fprintf(stderr, "***************************************\n"); +rpmeioLoop(evl); sleep(1); + } +fprintf(stderr, "***************************************\n"); + rc = 0; /* XXX */ exit: @@ -578,7 +585,7 @@ qname = xstrdup("rpm"); #endif - switch (7) { + switch (6) { case 5: ec = doEV(av, ac); break; case 6: ec = doEIO(av, ac); break; case 7: ec = spewEIO(av, ac); break; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org