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]
