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:   13-Jun-2017 02:00:46
  Branch: rpm-5_4                          Handle: 2017061300004500

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

  Log:
    - rpmeio: stub in the demo.c program.
    - rpmev: add an rpev deallocation queue. more todo++.

  Summary:
    Revision    Changes     Path
    2.199.2.90  +3  -2      rpm/rpmio/librpmio.vers
    1.94.2.38   +2  -0      rpm/rpmio/poptIO.c
    1.1.2.4     +3  -3      rpm/rpmio/rpmev.h
    1.1.2.21    +224 -16    rpm/rpmio/tmq.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/librpmio.vers
  ============================================================================
  $ cvs diff -u -r2.199.2.89 -r2.199.2.90 librpmio.vers
  --- rpm/rpmio/librpmio.vers   12 Jun 2017 06:54:06 -0000      2.199.2.89
  +++ rpm/rpmio/librpmio.vers   13 Jun 2017 00:00:45 -0000      2.199.2.90
  @@ -476,8 +476,9 @@
       _rpmev_debug;
       rpmevDump;
       rpmevNew;
  -    evs;
  -    nevs;
  +    rpmevqGetHead;
  +    rpmevqPutTail;
  +    rpmevqPutHead;
       rpmioEVTable;
       rpmioEVFLAGTable;
       rpmioEVBACKENDTable;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/poptIO.c
  ============================================================================
  $ cvs diff -u -r1.94.2.37 -r1.94.2.38 poptIO.c
  --- rpm/rpmio/poptIO.c        12 Jun 2017 06:54:06 -0000      1.94.2.37
  +++ rpm/rpmio/poptIO.c        13 Jun 2017 00:00:45 -0000      1.94.2.38
  @@ -527,6 +527,7 @@
        rpmlog(lvl, "%s exit.\n", msg);
   }
   
  +#ifdef       DYING
   __attribute__((constructor(101)))
   static void rpmioCtor(void)
   {
  @@ -555,6 +556,7 @@
       fprintf(stderr, "--> %s at %s:%u\n", __FUNCTION__, __FILE__, __LINE__);
   #endif       /* NOTYET */
   }
  +#endif       /* DYING */
   
   /**
    */
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmev.h
  ============================================================================
  $ cvs diff -u -r1.1.2.3 -r1.1.2.4 rpmev.h
  --- rpm/rpmio/rpmev.h 12 Jun 2017 06:54:06 -0000      1.1.2.3
  +++ rpm/rpmio/rpmev.h 13 Jun 2017 00:00:45 -0000      1.1.2.4
  @@ -65,9 +65,9 @@
   extern unsigned rpmioEVBACKEND;
   extern struct poptOption rpmioEVBACKENDTable[];
   
  -#define RPMEV_MAX_ALLOC 64
  -extern rpmev evs[RPMEV_MAX_ALLOC];
  -extern int nevs;
  +rpmev rpmevqGetHead(void);
  +void rpmevqPutTail(rpmev ev);
  +void rpmevqPutHead(rpmev ev);
   
   #endif       /* _RPMEV_INTERNAL */
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmio/tmq.c
  ============================================================================
  $ cvs diff -u -r1.1.2.20 -r1.1.2.21 tmq.c
  --- rpm/rpmio/tmq.c   12 Jun 2017 06:54:06 -0000      1.1.2.20
  +++ rpm/rpmio/tmq.c   13 Jun 2017 00:00:45 -0000      1.1.2.21
  @@ -105,7 +105,7 @@
   
   #define SPEW(_fmt, ...) \
       if (_debug || _rpmmsq_debug || _rpmio_debug) \
  -     fprintf(stderr, _fmt, __VA_ARGS__)
  +     fprintf(stderr, _fmt, ##__VA_ARGS__)
   
   #define Z(_rc)       assert((_rc) == 0)
   
  @@ -1171,72 +1171,88 @@
   
       /* initialise an io watcher, then start it */
       /* this one will watch for stdin to become readable */
  -    ev = rpmevNew(RPMEV_TYPE_IO,     NULL);
  -rpmevDump(__FUNCTION__, ev, NULL);
  +    ev = rpmevNew(RPMEV_TYPE_IO,     NULL, STDIN_FILENO, EV_READ);
  +#ifdef       DYING
       {        ev_io * w = &ev->evw.io;
        w->fd = STDIN_FILENO;
        w->events = EV_READ;
        ev_io_start(loop, w);
       }
  +#endif
   
       /* initialise a timer watcher, then start it */
       /* simple non-repeating 5.5 second timeout */
  -    ev = rpmevNew(RPMEV_TYPE_TIMER,  NULL);
  +    ev = rpmevNew(RPMEV_TYPE_TIMER,  NULL, 0,0, 5.5);
  +#ifdef       DYING
       {        ev_timer * w = &ev->evw.timer;
  +     w->at = 0.0;
        w->repeat = 5.5;
        ev_timer_start(loop, w);
       }
  +#endif
   
  -    ev = rpmevNew(RPMEV_TYPE_PERIODIC,       NULL);
  +    ev = rpmevNew(RPMEV_TYPE_PERIODIC,       NULL, 0.0, 11.0, NULL );
  +#ifdef       DYING
       {        ev_periodic * w = &ev->evw.periodic;
        w->offset = 0.0;
        w->interval = 11.0;
        w->reschedule_cb = NULL;
        ev_periodic_start(loop, w);
       }
  +#endif
   
  -    ev = rpmevNew(RPMEV_TYPE_SIGNAL, NULL);
  +    ev = rpmevNew(RPMEV_TYPE_SIGNAL, NULL, SIGUSR1);
  +#ifdef       DYING
       {        ev_signal * w = &ev->evw.signal;
        w->signum = SIGUSR1;
        ev_signal_start(loop, w);
       }
  +#endif
   
  -    ev = rpmevNew(RPMEV_TYPE_CHILD,  NULL);
  +#ifdef       DYING
  +    ev = rpmevNew(RPMEV_TYPE_CHILD,  NULL, 0, 0);
       {        ev_child * w = &ev->evw.child;
        w->pid = 0;
        w->flags = 0;   /** XXX 0=terminate, 1=stop/continue */
       }
  +#endif
   
  -    ev = rpmevNew(RPMEV_TYPE_STAT,   NULL);
  +    const char * _path = "/X/src/wdj54/rpmio/tmq";
  +    ev = rpmevNew(RPMEV_TYPE_STAT,   NULL, _path, 0.0);
  +#ifdef       DYING
       {        ev_stat * w = &ev->evw.stat;
  +     w->path = _free(w->path);
  +     w->path = xstrdup(_path);
        w->interval = 0;        /* XXX 0=recommended ~5s, must be >0.1 */
  -     w->path = "/X/src/wdj54/rpmio/tmq";
  +     w->wd = -2;
        ev_stat_start(loop, w);
       }
  +#endif
   
       ev = rpmevNew(RPMEV_TYPE_IDLE,   NULL);
  +#ifdef       DYING
       {        ev_idle * w = &ev->evw.idle;
        ev_idle_start(loop, w);
       }
  +#endif
   
  +#ifdef       NOTYET
       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_EMBED,  NULL, NULL);
       ev = rpmevNew(RPMEV_TYPE_ASYNC,  NULL);
  +#endif
   
       /* now wait for events to arrive */
       ev_run(loop, 0);
   
       /* unloop was called, so exit */
   
  -    /* XXX free rpmev allocations. */
  -    for (int i = 0; i < nevs; i++) {
  -     rpmev ev = evs[i];
  -     evs[i] = NULL;
  +    /* Deallocate all events. */
  +    while ((ev = rpmevqGetHead()) != NULL)
        ev = rpmevFree(ev);
  -    }
   
       ev_loop_destroy(loop);
   
  @@ -1244,6 +1260,197 @@
   }
   
   /*==============================================================*/
  +#if defined(HAVE_EIO_H)
  +# include <eio.h>
  +#endif
  +
  +int respipe[2];
  +
  +void want_poll(void)
  +{
  +    char dummy;
  +    ssize_t nw = write(respipe[1], &dummy, 1);
  +SPEW("<-- %s() nw %zd\n)\n", __FUNCTION__, nw);
  +}
  +
  +void done_poll(void)
  +{
  +    char dummy;
  +    ssize_t nr = read(respipe[0], &dummy, 1);
  +SPEW("<-- %s() nr %zd\n)\n", __FUNCTION__, nr);
  +}
  +
  +void event_loop(void)
  +{
  +    // an event loop. yeah.
  +    struct pollfd pfd;
  +    pfd.fd = respipe[0];
  +    pfd.events = POLLIN;
  +
  +SPEW("--> %s()\n", __FUNCTION__);
  +    while (eio_nreqs()) {
  +     poll(&pfd, 1, -1);
  +     SPEW("    %s() = %d\n", __FUNCTION__, eio_poll());
  +    }
  +SPEW("<-- %s()\n", __FUNCTION__);
  +}
  +
  +#define      REQ_DATA(_req)  (req && req->data ? (char *)req->data : "???")
  +int res_cb(eio_req * req)
  +{
  +SPEW("--> %s(%d|%s) res %ld\n", __FUNCTION__, req->type, REQ_DATA(req), 
EIO_RESULT(req));
  +
  +    if (req->result < 0)
  +     abort();
  +
  +    return 0;
  +}
  +
  +int readdir_cb(eio_req * req)
  +{
  +    char *buf = (char *) EIO_BUF(req);
  +
  +SPEW("--> %s(%d|%s) res %ld\n", __FUNCTION__, req->type, REQ_DATA(req), 
EIO_RESULT(req));
  +
  +    if (EIO_RESULT(req) < 0)
  +     return 0;
  +
  +    while (EIO_RESULT(req)--) {
  +     SPEW("\treaddir = <%s>\n", buf);
  +     buf += strlen(buf) + 1;
  +    }
  +
  +    return 0;
  +}
  +
  +int stat_cb(eio_req * req)
  +{
  +    struct stat *buf = EIO_STAT_BUF(req);
  +
  +SPEW("--> %s(%d|%s) res %ld\n", __FUNCTION__, req->type, REQ_DATA(req), 
EIO_RESULT(req));
  +    if (req->type == EIO_FSTAT) {
  +     SPEW("\tfstat_cb = %ld\n", EIO_RESULT(req));
  +    } else {
  +     SPEW("\tstat_cb(%s) = %ld\n", EIO_PATH(req), EIO_RESULT(req));
  +    }
  +
  +    if (!EIO_RESULT(req))
  +     SPEW("\tstat size %ld perm 0%o\n", buf->st_size,
  +            buf->st_mode & 0777);
  +
  +    return 0;
  +}
  +
  +int read_cb(eio_req * req)
  +{
  +    unsigned char *buf = (unsigned char *) EIO_BUF(req);
  +
  +SPEW("--> %s(%d|%s) res %ld (%02x%02x%02x%02x %02x%02x%02x%02x)\n",
  +             __FUNCTION__, req->type, REQ_DATA(req), EIO_RESULT(req),
  +             buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
  +
  +    return 0;
  +}
  +
  +int last_fd;
  +
  +int open_cb(eio_req * req)
  +{
  +SPEW("--> %s(%d|%s) res %ld\n", __FUNCTION__, req->type, REQ_DATA(req), 
EIO_RESULT(req));
  +
  +    last_fd = EIO_RESULT(req);
  +
  +    return 0;
  +}
  +
  +/*==============================================================*/
  +static int doEIO(ARGV_t av, int ac)
  +{
  +    int rc = 0;
  +
  +SPEW("*** pipe()\n");
  +    if (pipe(respipe))
  +     abort();
  +
  +SPEW("*** eio_init()\n");
  +    if (eio_init(want_poll, done_poll))
  +     abort();
  +
  +    do {
  +     /* avoid relative paths yourself(!) */
  +     eio_mkdir("eio-test-dir", 0777, 0, res_cb, "mkdir");
  +     eio_nop(0, res_cb, "nop");
  +     event_loop();
  +
  +     eio_stat("eio-test-dir", 0, stat_cb, "stat");
  +     eio_lstat("eio-test-dir", 0, stat_cb, "stat");
  +     eio_open("eio-test-dir/eio-test-file", O_RDWR | O_CREAT, 0777, 0,
  +              open_cb, "open");
  +     eio_symlink("test", "eio-test-dir/eio-symlink", 0, res_cb,
  +                 "symlink");
  +     eio_mknod("eio-test-dir/eio-fifo", S_IFIFO, 0, 0, res_cb, "mknod");
  +     event_loop();
  +
  +     eio_utime("eio-test-dir", 12345.678, 23456.789, 0, res_cb,
  +               "utime");
  +     eio_futime(last_fd, 92345.678, 93456.789, 0, res_cb, "futime");
  +     eio_chown("eio-test-dir", getuid(), getgid(), 0, res_cb, "chown");
  +     eio_fchown(last_fd, getuid(), getgid(), 0, res_cb, "fchown");
  +     eio_fchmod(last_fd, 0723, 0, res_cb, "fchmod");
  +     eio_readdir("eio-test-dir", 0, 0, readdir_cb, "readdir");
  +     eio_readdir("/nonexistant", 0, 0, readdir_cb, "readdir");
  +     eio_fstat(last_fd, 0, stat_cb, "stat");
  +     eio_write(last_fd, "test\nfail\n", 10, 4, 0, res_cb, "write");
  +     event_loop();
  +
  +     eio_read(last_fd, 0, 8, 0, EIO_PRI_DEFAULT, read_cb, "read");
  +     eio_readlink("eio-test-dir/eio-symlink", 0, res_cb, "readlink");
  +     event_loop();
  +
  +     eio_dup2(1, 2, EIO_PRI_DEFAULT, res_cb, "dup"); // dup stdout to stderr
  +     eio_chmod("eio-test-dir", 0765, 0, res_cb, "chmod");
  +     eio_ftruncate(last_fd, 9, 0, res_cb, "ftruncate");
  +     eio_fdatasync(last_fd, 0, res_cb, "fdatasync");
  +     eio_fsync(last_fd, 0, res_cb, "fsync");
  +     eio_sync(0, res_cb, "sync");
  +     eio_busy(0.5, 0, res_cb, "busy");
  +     event_loop();
  +
  +     eio_sendfile(1, last_fd, 4, 5, 0, res_cb, "sendfile");  // write 
"test\n" to stdout
  +     eio_fstat(last_fd, 0, stat_cb, "stat");
  +     event_loop();
  +
  +     eio_truncate("eio-test-dir/eio-test-file", 6, 0, res_cb,
  +                  "truncate");
  +     eio_readahead(last_fd, 0, 64, 0, res_cb, "readahead");
  +     event_loop();
  +
  +     eio_close(last_fd, 0, res_cb, "close");
  +     eio_link("eio-test-dir/eio-test-file",
  +              "eio-test-dir/eio-test-file-2", 0, res_cb, "link");
  +     event_loop();
  +
  +     eio_rename("eio-test-dir/eio-test-file",
  +                "eio-test-dir/eio-test-file-renamed", 0, res_cb,
  +                "rename");
  +     event_loop();
  +
  +     eio_unlink("eio-test-dir/eio-fifo", 0, res_cb, "unlink");
  +     eio_unlink("eio-test-dir/eio-symlink", 0, res_cb, "unlink");
  +     eio_unlink("eio-test-dir/eio-test-file-2", 0, res_cb, "unlink");
  +     eio_unlink("eio-test-dir/eio-test-file-renamed", 0, res_cb,
  +                "unlink");
  +     event_loop();
  +
  +     eio_rmdir("eio-test-dir", 0, res_cb, "rmdir");
  +     event_loop();
  +
  +    } while (0);
  +
  +    return rc;
  +}
  +
  +/*==============================================================*/
   #if !defined(POPT_BIT_XOR)
   #define      POPT_BIT_XOR    (POPT_ARG_VAL|POPT_ARGFLAG_XOR)
   #endif
  @@ -1296,12 +1503,13 @@
       if (qname == NULL)
        qname = xstrdup("rpm");
   
  -    switch (5) {
  +    switch (6) {
       case 1:  ec = doSHM(av, ac);     break;
       case 2:  ec = doMSQ(av, ac);     break;
       case 3:  ec = doTIMER(av, ac);   break;
       case 4:  ec = doLAIO(av, ac);    break;
       case 5:  ec = doEV(av, ac);      break;
  +    case 6:  ec = doEIO(av, ac);     break;
       }
   
       qname = _free(qname);
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to