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

Reply via email to