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: 15-Jun-2017 09:16:18 Branch: rpm-5_4 Handle: 2017061507161800 Added files: (Branch: rpm-5_4) rpm/rpmio teio.c Modified files: (Branch: rpm-5_4) rpm/rpmio Makefile.am librpmio.vers rpmeio.c rpmeio.h tmq.c Log: - WIP: refactor RV+EIO into its own nest program. Summary: Revision Changes Path 1.293.2.92 +8 -5 rpm/rpmio/Makefile.am 2.199.2.92 +3 -1 rpm/rpmio/librpmio.vers 1.1.2.2 +514 -8 rpm/rpmio/rpmeio.c 1.1.2.2 +3 -0 rpm/rpmio/rpmeio.h 1.1.2.1 +308 -0 rpm/rpmio/teio.c 1.1.2.23 +1 -433 rpm/rpmio/tmq.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmio/Makefile.am ============================================================================ $ cvs diff -u -r1.293.2.91 -r1.293.2.92 Makefile.am --- rpm/rpmio/Makefile.am 13 Jun 2017 22:25:23 -0000 1.293.2.91 +++ rpm/rpmio/Makefile.am 15 Jun 2017 07:16:18 -0000 1.293.2.92 @@ -18,10 +18,10 @@ getdate.y html-parse.c html-parse.h libsqlio.c \ rpmcpio.c rpmcpio.h rpmgenbasedir.c rpmgenpkglist.c rpmgensrclist.c \ rpmjsio.msg rpmtar.c rpmtar.h \ - tdir.c tfts.c tget.c tgfs.c tgit.c tglob.c thkp.c thtml.c tinv.c \ - tkey.c tmire.c tmq.c tmqtt.c todbc.c tput.c tpython.c trpmio.c tsexp.c \ - tsvn.c tsw.c lookup3.c duktape.c tjsmn.c tjson.c yajl.c testit.sh \ - xxhash.h xxhash.c \ + tdir.c teio.c tfts.c tget.c tgfs.c tgit.c tglob.c thkp.c thtml.c \ + tinv.c tkey.c tmire.c tmq.c tmqtt.c todbc.c tput.c tpython.c trpmio.c \ + tsexp.c tsvn.c tsw.c lookup3.c duktape.c tjsmn.c tjson.c yajl.c \ + testit.sh xxhash.h xxhash.c \ microjson.c mongoc-counters.defs EXTRA_PROGRAMS = rpmcpio rpmdpkg rpmtar rpmz @@ -31,7 +31,7 @@ EXTRA_PROGRAMS += bsdiff bspatch fanotify pcrsed rpmborg rpmcurl \ rpmgenbasedir rpmgenpkglist rpmgensrclist rpmgpg \ rpmpbzip2 rpmpigz rpmzstd \ - tasn tbf tcap tder tdir tfts tget tglob thkp tmagic tmire \ + tasn tbf tcap tder tdir teio tfts tget tglob thkp tmagic tmire \ tmount todbc toid tperl tpython tput trpmio tsexp tsvn tsw ttcl \ dumpasn1 lookup3 trel twitter github tmicrojson @@ -597,6 +597,9 @@ tdir_SOURCES = tdir.c tdir_LDADD = $(RPMIO_LDADD_COMMON) +teio_SOURCES = teio.c +teio_LDADD = $(RPMIO_LDADD_COMMON) + tfts_SOURCES = tfts.c tfts_LDADD = $(RPMIO_LDADD_COMMON) @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/librpmio.vers ============================================================================ $ cvs diff -u -r2.199.2.91 -r2.199.2.92 librpmio.vers --- rpm/rpmio/librpmio.vers 13 Jun 2017 22:25:23 -0000 2.199.2.91 +++ rpm/rpmio/librpmio.vers 15 Jun 2017 07:16:18 -0000 2.199.2.92 @@ -474,14 +474,16 @@ rpmMCExpand; rpmMCExpandNumeric; _rpmeio_debug; + rpmeioCancel; rpmeioDumpREQ; + rpmeioLoop; rpmeioNew; rpmeioReqType; rpmeioPipe; rpmeioPollWant; rpmeioPollDone; rpmeioStart; - rpmeioLoop; + rpmeioSubmit; rpmeioCB; rpmeioCB_readdir; rpmeioCB_stat; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmeio.c ============================================================================ $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmeio.c --- rpm/rpmio/rpmeio.c 13 Jun 2017 22:25:23 -0000 1.1.2.1 +++ rpm/rpmio/rpmeio.c 15 Jun 2017 07:16:18 -0000 1.1.2.2 @@ -13,6 +13,8 @@ if (_rpmeio_debug || _rpmio_debug) \ fprintf(stderr, _fmt, __VA_ARGS__) +#define REQ_ERRNO(req) ((req)->errorno) + /*==============================================================*/ const char * rpmeioReqType(int reqtype) { @@ -110,7 +112,7 @@ PRINT(d, errorno); #else if (req->errorno) - fprintf(fp, "%25s: %d %s\n", "errorno", req->errorno, strerror(req->errorno)); + fprintf(fp, "%25s: %d %s\n", "errorno", REQ_ERRNO(req), strerror(REQ_ERRNO(req))); #endif #ifdef DYING @@ -145,6 +147,48 @@ } /*==============================================================*/ +#ifdef REF +static struct ev_loop *loop; +static ev_idle repeat_watcher; +static ev_async ready_watcher; + +/* 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) + ev_idle_stop (EV_A_ w); +} + +/* eio has some results, process them */ +static void +ready (EV_P_ ev_async *w, int revents) +{ + if (eio_poll () == -1) + ev_idle_start (EV_A_ &repeat_watcher); +} + +/* 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) @@ -161,6 +205,32 @@ SPEW("<-- %s() nr %zd\n)\n", __FUNCTION__, nr); } +#ifdef TODO + + eio_set_max_poll_time(eio_tstamp nseconds); + eio_set_max_poll_reqs(unsigned int nreqs); + eio_set_min_parallel(unsigned int nthreads); + eio_set_max_parallel(unsigned int nthreads); + eio_set_max_idle(unsigned int nthreads); + eio_set_idle_timeout (unsigned int seconds); + +unsigned nreqs = eio_nreqs(); +unsigned nready = eio_nready(); +unsigned nthreads = eio_nthreads(); +unsigned npending = eio_npending(); + +#define EIO_STACKSIZE 4096 /* default? */ + +eio _req *grp = eio_grp(eio_cb cb, void *data); + eio_grp_feed(eio_req *grp, void (*feed)(eio_req *req), int limit); + eio_grp_limit(eio_req *grp, int limit); + eio_grp_add(eio_req *grp, eio_req *req); + eio_grp_cancel(eio_req *grp); + + eio_ssize_t eio_sendfile_sync (int ofd, int ifd, off_t offset, size_t count); + +#endif /* TODO */ + int rpmeioStart(void) { int rc = pipe(rpmeioPipe); @@ -189,23 +259,38 @@ SPEW("<== %s() polled %d\n", __FUNCTION__, polled); } +void rpmeioSubmot(eio_req * req) +{ +SPEW("--> %s(%p)\n", __FUNCTION__, req); + eio_submit(req); +} + +void rpmeioCancel(eio_req * req) +{ +SPEW("--> %s(%p)\n", __FUNCTION__, req); + eio_cancel(req); +} + +/*==============================================================*/ int rpmeioCB(eio_req * req) { -rpmeioDumpREQ(__FUNCTION__, req, NULL); SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), EIO_RESULT(req)); +rpmeioDumpREQ(__FUNCTION__, req, NULL); - if (req->result < 0) - abort(); + if (EIO_RESULT(req) < 0) { + errno = REQ_ERRNO(req); + perror(REQ_TYPE(req)); + } return 0; } int rpmeioCB_readdir(eio_req * req) { -rpmeioDumpREQ(__FUNCTION__, req, NULL); char *buf = (char *) EIO_BUF(req); SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), EIO_RESULT(req)); +rpmeioDumpREQ(__FUNCTION__, req, NULL); if (EIO_RESULT(req) < 0) return 0; @@ -220,10 +305,10 @@ int rpmeioCB_stat(eio_req * req) { -rpmeioDumpREQ(__FUNCTION__, req, NULL); struct stat *buf = EIO_STAT_BUF(req); SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), EIO_RESULT(req)); +rpmeioDumpREQ(__FUNCTION__, req, NULL); if (req->type == EIO_FSTAT) { SPEW("\tfstat = %ld\n", EIO_RESULT(req)); } else { @@ -239,12 +324,12 @@ int rpmeioCB_read(eio_req * req) { -rpmeioDumpREQ(__FUNCTION__, req, NULL); unsigned char *buf = (unsigned char *) EIO_BUF(req); SPEW("--> %s(%s|%p) res %ld (%02x%02x%02x%02x %02x%02x%02x%02x)\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), EIO_RESULT(req), buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); +rpmeioDumpREQ(__FUNCTION__, req, NULL); return 0; } @@ -253,8 +338,8 @@ int rpmeioCB_open(eio_req * req) { -rpmeioDumpREQ(__FUNCTION__, req, NULL); SPEW("--> %s(%s|%p) res %ld\n", __FUNCTION__, REQ_TYPE(req), REQ_DATA(req), EIO_RESULT(req)); +rpmeioDumpREQ(__FUNCTION__, req, NULL); rpmeioLastFdno = EIO_RESULT(req); @@ -262,6 +347,427 @@ } /*==============================================================*/ +static eio_req * rpmeioReq(int reqtype, ...) +{ + eio_req * req = NULL; + + const char * path = NULL; + const char * npath = NULL; + void (*execute) (eio_req *req); + int fdno = -1; + int fdno2 = -1; + off_t offset = 0; + int whence = 0; + void *buf = NULL; + size_t length = 0; + eio_tstamp atime = 0.0; + eio_tstamp mtime = 0.0; + uid_t uid = -1; + gid_t gid = -1; + mode_t mode = 0; + void *addr = NULL; + int flags = 0; + eio_tstamp delay = 0.0; + dev_t dev = 0; + + int pri = 0; + eio_cb cb = rpmeioCB; + void * data = NULL; + + const char * fmt = NULL; +(void *)fmt; + va_list ap; + + if (reqtype >= EIO_REQ_TYPE_NUM) + goto exit; + + va_start(ap, reqtype); + + switch (reqtype) { + case EIO_CUSTOM: + execute = va_arg(ap, void (*) (eio_req *)); + cb = rpmeioCB; /* XXX */ + data = "custom"; + req = eio_custom(execute, pri, cb, data); + break; +#ifdef NOTYET + case EIO_WD_OPEN: + path = va_arg(ap, const char *); + cb = rpmeioCB; /* XXX */ + data = "wd_open"; + req = eio_wd_open(path, pri, cb, data); + break; + case EIO_WD_CLOSE: + cb = rpmeioCB; /* XXX */ + data = "wd_close"; + fmt = "%p | %d, %p, %p"; + req = eio_wd_close(wd, pri, cb, data); + break; +#endif /* NOTYET */ + case EIO_CLOSE: + fdno = va_arg(ap, int); + cb = rpmeioCB; + data = "close"; + fmt = "%d | %d, %p, %p"; + req = eio_close(fdno, pri, cb, data); + break; + case EIO_DUP2: + fdno = va_arg(ap, int); + fdno2 = va_arg(ap, int); + cb = rpmeioCB; + data = "dup2"; + fmt = "%d, %d | %d, %p, %p"; + req = eio_dup2(fdno, fdno2, pri, cb, data); + break; + case EIO_SEEK: + fdno = va_arg(ap, int); + offset = va_arg(ap, off_t); + whence = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "seek"; + fmt = "%d, %ld, %d | %d, %p, %p"; + req = eio_seek(fdno, offset, whence, pri, cb, data); + break; + case EIO_READ: + fdno = va_arg(ap, int); + buf = va_arg(ap, void *); + length = va_arg(ap, size_t); + offset = va_arg(ap, off_t); + cb = rpmeioCB_read; + data = "read"; + fmt = "%d, %p, %zu | %d, %p, %p"; + req = eio_read(fdno, buf, length, offset, pri, cb, data); + break; + case EIO_WRITE: + fdno = va_arg(ap, int); + buf = va_arg(ap, void *); + length = va_arg(ap, size_t); + offset = va_arg(ap, off_t); + cb = rpmeioCB; + data = "write"; + fmt = "%d, %p, %zu | %d, %p, %p"; + req = eio_write(fdno, buf, length, offset, pri, cb, data); + break; + case EIO_READAHEAD: + fdno = va_arg(ap, int); + offset = va_arg(ap, off_t); + length = va_arg(ap, size_t); + cb = rpmeioCB; + data = "readahead"; + fmt = "%d, %lld, %zu | %d, %p, %p"; + req = eio_readahead(fdno, offset, length, pri, cb, data); + break; + case EIO_SENDFILE: + fdno2 = va_arg(ap, int); + fdno = va_arg(ap, int); + offset = va_arg(ap, off_t); + length = va_arg(ap, size_t); + cb = rpmeioCB; + data = "sendfile"; + fmt = "%d, %d, %p, %zu | %d, %p, %p"; + req = eio_sendfile(fdno2, fdno, offset, length, pri, cb, data); + break; + case EIO_FSTAT: + fdno = va_arg(ap, int); + cb = rpmeioCB_stat; + data = "fstat"; + fmt = "%d | %d, %p, %p"; + req = eio_fstat(fdno, pri, cb, data); + break; + case EIO_FSTATVFS: + fdno = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "statvfs"; + fmt = "%d | %d, %p, %p"; + req = eio_fstatvfs(fdno, pri, cb, data); + break; + case EIO_FTRUNCATE: + fdno = va_arg(ap, int); + offset = va_arg(ap, off_t); + cb = rpmeioCB; + data = "ftruncate"; + fmt = "%d, %ld | %d, %p, %p"; + req = eio_ftruncate(fdno, offset, pri, cb, data); + break; + case EIO_FUTIME: + fdno = va_arg(ap, int); + atime = va_arg(ap, eio_tstamp); + mtime = va_arg(ap, eio_tstamp); + cb = rpmeioCB; + data = "futime"; + fmt = "%d, %f, %f | %d, %p, %p"; + req = eio_futime(fdno, atime, mtime, pri, cb, data); + break; + case EIO_FCHMOD: + fdno = va_arg(ap, int); + mode = va_arg(ap, mode_t); + cb = rpmeioCB; + data = "fchmod"; + fmt = "%d, %hd | %d, %p, %p"; + req = eio_fchmod(fdno, mode, pri, cb, data); + break; + case EIO_FCHOWN: + fdno = va_arg(ap, int); + uid = va_arg(ap, uid_t); + gid = va_arg(ap, gid_t); + cb = rpmeioCB; + data = "fchown"; + fmt = "%d, %d, %d | %d, %p, %p"; + req = eio_fchown(fdno, uid, gid, pri, cb, data); + break; + case EIO_SYNC: + cb = rpmeioCB; + data = "sync"; + fmt = "| %d, %p, %p"; + req = eio_sync(pri, cb, data); + break; + case EIO_FSYNC: + fdno = va_arg(ap, int); + cb = rpmeioCB; + data = "fsync"; + fmt = "%d | %d, %p, %p"; + req = eio_fsync(fdno, pri, cb, data); + break; + case EIO_FDATASYNC: + fdno = va_arg(ap, int); + cb = rpmeioCB; + data = "fdatasync"; + fmt = "%d | %d, %p, %p"; + req = eio_fdatasync(fdno, pri, cb, data); + break; + case EIO_SYNCFS: + fdno = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "syncfs"; + fmt = "%d | %d, %p, %p"; + req = eio_syncfs(fdno, pri, cb, data); + break; + case EIO_MSYNC: + addr = va_arg(ap, void *); + length = va_arg(ap, size_t); + flags = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "msync"; + fmt = "%p, %zu, %d | %d, %p, %p"; + req = eio_msync(addr, length, flags, pri, cb, data); + break; + case EIO_MTOUCH: + addr = va_arg(ap, void *); + length = va_arg(ap, size_t); + flags = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "mtouch"; + fmt = "%p, %zu, %d | %d, %p, %p"; + req = eio_mtouch(addr, length, flags, pri, cb, data); + break; + case EIO_SYNC_FILE_RANGE: + fdno = va_arg(ap, int); + offset = va_arg(ap, off_t); + length = va_arg(ap, size_t); + flags = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "sync_file_range"; + fmt = "%p, %lld, %lld, %u | %d, %p, %p"; + req = eio_sync_file_range(fdno, offset, length, flags, pri, cb, data); + break; + case EIO_FALLOCATE: + fdno = va_arg(ap, int); + mode = va_arg(ap, mode_t); + offset = va_arg(ap, off_t); + length = va_arg(ap, size_t); + cb = rpmeioCB; /* XXX */ + data = "fallocate"; + fmt = "%p, %d, %ld, %ld | %d, %p, %p"; + req = eio_fallocate (fdno, mode, offset, length, pri, cb, data); + break; + case EIO_MLOCK: + addr = va_arg(ap, void *); + length = va_arg(ap, size_t); + cb = rpmeioCB; /* XXX */ + data = "mlock"; + fmt = "%p, %zu | %d, %p, %p"; + req = eio_mlock(addr, length, pri, cb, data); + break; + case EIO_MLOCKALL: + fdno = va_arg(ap, int); + cb = rpmeioCB; /* XXX */ + data = "mlockall"; + fmt = "%d | %d, %p, %p"; + req = eio_mlockall(flags, pri, cb, data); + break; + case EIO_GROUP: + cb = rpmeioCB; /* XXX */ + data = "group"; + pri = EIO_PRI_MAX; /* XXX */ + fmt = "| %p, %p"; + req = eio_grp(cb, data); + break; + case EIO_NOP: + cb = rpmeioCB; + data = "nop"; + fmt = "| %d, %p, %p"; + req = eio_nop(pri,cb, data); + break; + case EIO_BUSY: + delay = va_arg(ap, eio_tstamp); + cb = rpmeioCB; + data = "busy"; + fmt = "%f | %d, %p, %p"; + req = eio_busy(delay, pri, cb, data); + break; + case EIO_REALPATH: + path = va_arg(ap, const char *); + cb = rpmeioCB; /* XXX */ + data = "realpath"; + fmt = "%s | %d, %p, %p"; + req = eio_realpath(path, pri, cb, data); + break; + case EIO_READDIR: + path = va_arg(ap, const char *); + flags = va_arg(ap, int); + cb = rpmeioCB_open; + data = "readdir"; + fmt = "%s, %d | %d, %p, %p"; + req = eio_readdir(path, flags, pri, cb, data); + break; + case EIO_OPEN: + path = va_arg(ap, const char *); + flags = va_arg(ap, int); + mode = va_arg(ap, mode_t); + cb = rpmeioCB_open; + data = "open"; + fmt = "%s, %d, %d | %d, %p, %p"; + req = eio_open(path, flags, mode, pri, cb, data); + break; + case EIO_STAT: + path = va_arg(ap, const char *); + cb = rpmeioCB_stat; + data = "stat"; + fmt = "%s | %d, %p, %p"; + req = eio_stat(path, pri, cb, data); + break; + case EIO_LSTAT: + path = va_arg(ap, const char *); + cb = rpmeioCB_stat; + data = "lstat"; + fmt = "%s | %d, %p, %p"; + req = eio_lstat(path, pri, cb, data); + break; + case EIO_STATVFS: + path = va_arg(ap, const char *); + cb = rpmeioCB; /* XXX */ + data = "statvfs"; + fmt = "%s | %d, %p, %p"; + req = eio_statvfs(path, pri, cb, data); + break; + case EIO_TRUNCATE: + path = va_arg(ap, const char *); + offset = va_arg(ap, off_t); + cb = rpmeioCB; + data = "truncate"; + fmt = "%s, %ld | %d, %p, %p"; + req = eio_truncate(path, offset, pri, cb, data); + break; + case EIO_UTIME: + path = va_arg(ap, const char *); + atime = va_arg(ap, eio_tstamp); + mtime = va_arg(ap, eio_tstamp); + cb = rpmeioCB; + data = "utime"; + fmt = "%s, %p, %p | %d, %p, %p"; + req = eio_utime(path, atime, mtime, pri, cb, data); + break; + case EIO_CHMOD: + path = va_arg(ap, const char *); + mode = va_arg(ap, mode_t); + cb = rpmeioCB; /* XXX */ + data = "chmod"; + fmt = "%s, %d | %d, %p, %p"; + req = eio_chmod(path, mode, pri, cb, data); + break; + case EIO_CHOWN: + path = va_arg(ap, const char *); + uid = va_arg(ap, uid_t); + gid = va_arg(ap, gid_t); + cb = rpmeioCB; + data = "chown"; + fmt = "%s, %d, %d | %d, %p, %p"; + req = eio_chown(path, uid, gid, pri, cb, data); + break; + case EIO_UNLINK: + cb = rpmeioCB; + path = va_arg(ap, const char *); + data = "unlink"; + fmt = "%s | %d, %p, %p"; + req = eio_unlink(path, pri, cb, data); + break; + case EIO_RMDIR: + path = va_arg(ap, const char *); + cb = rpmeioCB; + data = "rmdir"; + fmt = "%s | %d, %p, %p"; + req = eio_rmdir(path, pri, cb, data); + break; + case EIO_MKDIR: + path = va_arg(ap, const char *); + cb = rpmeioCB; + data = "mkdir"; + fmt = "%s, %d | %d, %p, %p"; + req = eio_mkdir(path, mode, pri, cb, data); + break; + case EIO_RENAME: + path = va_arg(ap, const char *); + npath = va_arg(ap, const char *); + cb = rpmeioCB; + data = "rename"; + fmt = "%s, %s | %d, %p, %p"; + req = eio_rename(path, npath, pri, cb, data); + break; + case EIO_MKNOD: + path = va_arg(ap, const char *); + mode = va_arg(ap, mode_t); + dev = va_arg(ap, dev_t); + cb = rpmeioCB; + data = "mknod"; + fmt = "%s, %d, %ld | %d, %p, %p"; + req = eio_mknod(path, mode, dev, pri, cb, data); + break; + case EIO_LINK: + path = va_arg(ap, const char *); + npath = va_arg(ap, const char *); + cb = rpmeioCB; + data = "link"; + fmt = "%s, %s | %d, %p, %p"; + req = eio_link(path, npath, pri, cb, data); + break; + case EIO_SYMLINK: + path = va_arg(ap, const char *); + npath = va_arg(ap, const char *); + cb = rpmeioCB; + data = "symlink"; + fmt = "%s, %s | %d, %p, %p"; + req = eio_symlink(path, npath, pri, cb, data); + break; + case EIO_READLINK: + path = va_arg(ap, const char *); + cb = rpmeioCB; + data = "readlink"; + fmt = "%s | %d, %p, %p"; + req = eio_readlink(path, pri, cb, data); + break; + default: +assert(0); + break; + } + + va_end(ap); + +exit: + return req; +} + + +/*==============================================================*/ eio_req *Eio_wd_open (const char *path, int pri, eio_cb cb, void *data) { eio_req * req = eio_wd_open(path, pri, cb, data); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmeio.h ============================================================================ $ cvs diff -u -r1.1.2.1 -r1.1.2.2 rpmeio.h --- rpm/rpmio/rpmeio.h 13 Jun 2017 22:25:23 -0000 1.1.2.1 +++ rpm/rpmio/rpmeio.h 15 Jun 2017 07:16:18 -0000 1.1.2.2 @@ -104,6 +104,9 @@ void rpmeioLoop(void); +void rpmeioCancel(eio_req * req); +void rpmeioCancel(eio_req * req); + int rpmeioCB(eio_req * req); int rpmeioCB_readdir(eio_req * req); int rpmeioCB_stat(eio_req * req); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/teio.c ============================================================================ $ cvs diff -u -r0 -r1.1.2.1 teio.c --- /dev/null 2017-06-15 09:15:35.000000000 +0200 +++ teio.c 2017-06-15 09:16:18.669474225 +0200 @@ -0,0 +1,308 @@ + +/** + * \file rpmio/tmq.c + */ + +#include "system.h" + +#include <rpmio_internal.h> +#include <rpmlog.h> +#include <rpmmacro.h> +#include <poptIO.h> +#include <argv.h> + +# define _RPMEIO_INTERNAL +# include <rpmeio.h> + +#if defined(HAVE_EV_H) +# include <ev.h> +#endif + +#define _RPMEV_INTERNAL +#include <rpmev.h> + +#include "debug.h" + +static int _debug = -1; + +#define SPEW(_fmt, ...) \ + if (_debug || _rpmeio_debug || _rpmio_debug) \ + fprintf(stderr, _fmt, ##__VA_ARGS__) + +#define Z(_rc) assert((_rc) == 0) + +/*==============================================================*/ +static int doEV(ARGV_t av, int ac) +{ + int rc = 0; + +SPEW(" version: %u.%u\n", ev_version_major(), ev_version_minor()); + +char *rstr = NULL; +unsigned mask = 0; +mask = ev_supported_backends(); +rstr = rpmioB2N(rpmioEVBACKENDTable, mask); +SPEW(" supported: %s\n", rstr); +rstr = _free(rstr); + +mask = ev_recommended_backends(); +rstr = rpmioB2N(rpmioEVBACKENDTable, mask); +SPEW("recommended: %s\n", rstr); +rstr = _free(rstr); + +mask = ev_embeddable_backends(); +rstr = rpmioB2N(rpmioEVBACKENDTable, mask); +SPEW(" embeddable: %s\n", rstr); +rstr = _free(rstr); + +SPEW(" time: %f\n", ev_time()); + + /* use the default event loop unless you have special needs */ + struct ev_loop *loop = ev_default_loop(EVFLAG_AUTO); + rpmev ev = NULL; + + /* initialise an io watcher, then start it */ + /* this one will watch for stdin to become readable */ + 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, 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, 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, SIGUSR1); +#ifdef DYING + { ev_signal * w = &ev->evw.signal; + w->signum = SIGUSR1; + ev_signal_start(loop, w); + } +#endif + +#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 + + 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->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, NULL); + ev = rpmevNew(RPMEV_TYPE_ASYNC, NULL); +#endif + + /* now wait for events to arrive */ + ev_run(loop, 0); + + /* unloop was called, so exit */ + + /* Deallocate all events. */ + while ((ev = rpmevqGetHead()) != NULL) + ev = rpmevFree(ev); + + ev_loop_destroy(loop); + + return rc; +} + +/*==============================================================*/ +static int doEIO(ARGV_t av, int ac) +{ + int rc = 0; + + rc = rpmeioStart(); + if (rc) + goto exit; + + do { + /* avoid relative paths yourself(!) */ + Eio_mkdir("eio-test-dir", 0777, 0, rpmeioCB, "mkdir"); + Eio_nop(0, rpmeioCB, "nop"); + rpmeioLoop(); + + Eio_stat("eio-test-dir", 0, rpmeioCB_stat, "stat"); + Eio_lstat("eio-test-dir", 0, rpmeioCB_stat, "stat"); + Eio_open("eio-test-dir/eio-test-file", O_RDWR | O_CREAT, 0777, 0, + rpmeioCB_open, "open"); + 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(); + + Eio_utime("eio-test-dir", 12345.678, 23456.789, 0, rpmeioCB, + "utime"); + Eio_futime(rpmeioLastFdno, 92345.678, 93456.789, 0, rpmeioCB, "futime"); + Eio_chown("eio-test-dir", getuid(), getgid(), 0, rpmeioCB, "chown"); + Eio_fchown(rpmeioLastFdno, getuid(), getgid(), 0, rpmeioCB, "fchown"); + Eio_fchmod(rpmeioLastFdno, 0723, 0, rpmeioCB, "fchmod"); + Eio_readdir("eio-test-dir", 0, 0, rpmeioCB_readdir, "readdir"); + 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(); + + Eio_read(rpmeioLastFdno, 0, 8, 0, EIO_PRI_DEFAULT, rpmeioCB_read, "read"); + Eio_readlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "readlink"); + rpmeioLoop(); + + Eio_dup2(1, 2, EIO_PRI_DEFAULT, rpmeioCB, "dup"); // dup stdout to stderr + Eio_chmod("eio-test-dir", 0765, 0, rpmeioCB, "chmod"); + Eio_ftruncate(rpmeioLastFdno, 9, 0, rpmeioCB, "ftruncate"); + Eio_fdatasync(rpmeioLastFdno, 0, rpmeioCB, "fdatasync"); + Eio_fsync(rpmeioLastFdno, 0, rpmeioCB, "fsync"); + Eio_sync(0, rpmeioCB, "sync"); + Eio_busy(0.5, 0, rpmeioCB, "busy"); + rpmeioLoop(); + + Eio_sendfile(1, rpmeioLastFdno, 4, 5, 0, rpmeioCB, "sendfile"); // write "test\n" to stdout + Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat"); + rpmeioLoop(); + + Eio_truncate("eio-test-dir/eio-test-file", 6, 0, rpmeioCB, + "truncate"); + Eio_readahead(rpmeioLastFdno, 0, 64, 0, rpmeioCB, "readahead"); + rpmeioLoop(); + + 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(); + + Eio_rename("eio-test-dir/eio-test-file", + "eio-test-dir/eio-test-file-renamed", 0, rpmeioCB, + "rename"); + rpmeioLoop(); + + 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(); + + Eio_rmdir("eio-test-dir", 0, rpmeioCB, "rmdir"); + rpmeioLoop(); + + } while (0); + + rc = 0; /* XXX */ + +exit: + return rc; +} + +/*==============================================================*/ +#if !defined(POPT_BIT_XOR) +#define POPT_BIT_XOR (POPT_ARG_VAL|POPT_ARGFLAG_XOR) +#endif + +static struct poptOption rpmmqOptionsTable[] = { + { "debug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_debug, 1, + NULL, NULL }, + +#ifdef DYING +#define _MSQBIT(_v) (RPMMSQ_FLAGS_##_v) + { "qname", 'Q', POPT_ARG_STRING, &qname, 0, + N_("Use message queue QNAME"), N_("QNAME") }, + { "posix", 'P', POPT_BIT_SET, &flags, _MSQBIT(POSIX), + N_("Use POSIX message queues"), NULL }, + { "sysv", 'S', POPT_BIT_SET, &flags, _MSQBIT(SYSV), + N_("Use SysV message queues"), NULL }, + + { "reset", 'R', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &flags, _MSQBIT(RESET), + N_("Remove queue before opening"), NULL }, + { "info", 'I', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &flags, _MSQBIT(INFO), + N_("Display queue info on close"), NULL }, + { "delete", 'D', POPT_BIT_SET|POPT_ARGFLAG_TOGGLE, &flags, _MSQBIT(DELETE), + N_("Remove queue after closing"), NULL }, + + { "count", 'c', POPT_ARG_INT, &count, 0, + N_("Send COUNT messages"), N_("COUNT") }, + { "priority", 'p', POPT_ARG_LONG, &priority, 0, + N_("Send message PRIORITY"), N_("PRIORITY") }, +#undef _MSQBIT +#endif /* DYING */ + + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioOpenFlagsTable, 0, + N_("Open(2) flags:"), NULL }, + + { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmioAllPoptTable, 0, + N_("Common options for all rpmio executables:"), NULL }, + + POPT_AUTOALIAS + POPT_AUTOHELP + POPT_TABLEEND +}; + +int +main(int argc, char *argv[]) +{ + poptContext con = rpmioInit(argc, argv, rpmmqOptionsTable); + ARGV_t av = poptGetArgs(con); + int ac = argvCount(av);; + int ec = 0; + +#ifdef DYING + _rpmmsqOFlags = rpmioOpenFlags; + if (qname == NULL) + qname = xstrdup("rpm"); +#endif + + switch (6) { + case 5: ec = doEV(av, ac); break; + case 6: ec = doEIO(av, ac); break; + } + +#ifdef DYING + qname = _free(qname); +#endif + con = rpmioFini(con); + + return ec; +} @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/tmq.c ============================================================================ $ cvs diff -u -r1.1.2.22 -r1.1.2.23 tmq.c --- rpm/rpmio/tmq.c 13 Jun 2017 22:25:23 -0000 1.1.2.22 +++ rpm/rpmio/tmq.c 15 Jun 2017 07:16:18 -0000 1.1.2.23 @@ -76,16 +76,6 @@ #include <rpmmsq.h> -# define _RPMEIO_INTERNAL -# include <rpmeio.h> - -#if defined(HAVE_EV_H) -# include <ev.h> -#endif - -#define _RPMEV_INTERNAL -#include <rpmev.h> - #include "debug.h" static int _debug = -1; @@ -1143,426 +1133,6 @@ } /*==============================================================*/ -static int doEV(ARGV_t av, int ac) -{ - int rc = 0; - -SPEW(" version: %u.%u\n", ev_version_major(), ev_version_minor()); - -char *rstr = NULL; -unsigned mask = 0; -mask = ev_supported_backends(); -rstr = rpmioB2N(rpmioEVBACKENDTable, mask); -SPEW(" supported: %s\n", rstr); -rstr = _free(rstr); - -mask = ev_recommended_backends(); -rstr = rpmioB2N(rpmioEVBACKENDTable, mask); -SPEW("recommended: %s\n", rstr); -rstr = _free(rstr); - -mask = ev_embeddable_backends(); -rstr = rpmioB2N(rpmioEVBACKENDTable, mask); -SPEW(" embeddable: %s\n", rstr); -rstr = _free(rstr); - -SPEW(" time: %f\n", ev_time()); - - /* use the default event loop unless you have special needs */ - struct ev_loop *loop = ev_default_loop(EVFLAG_AUTO); - rpmev ev = NULL; - - /* initialise an io watcher, then start it */ - /* this one will watch for stdin to become readable */ - 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, 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, 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, SIGUSR1); -#ifdef DYING - { ev_signal * w = &ev->evw.signal; - w->signum = SIGUSR1; - ev_signal_start(loop, w); - } -#endif - -#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 - - 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->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, NULL); - ev = rpmevNew(RPMEV_TYPE_ASYNC, NULL); -#endif - - /* now wait for events to arrive */ - ev_run(loop, 0); - - /* unloop was called, so exit */ - - /* Deallocate all events. */ - while ((ev = rpmevqGetHead()) != NULL) - ev = rpmevFree(ev); - - ev_loop_destroy(loop); - - return rc; -} - -/*==============================================================*/ -#ifdef NOTYET -static eio_req * rpmeioRequest(int reqtype, ...) -{ - eio_req * req = NULL; - const char * fmt = NULL; - va_list ap; - - if (reqtype >= EIO_REQ_TYPE_NUM) - goto exit; - - va_start(ap, reqtype); - - switch (reqtype) { - case EIO_CUSTOM: - req = eio_custom(execute, pri, cb, data); - break; - case EIO_WD_OPEN: - fmt = "%s | %d, %p, %p"; - req = eio_wd_open(path, pri, cb, data); - break; - case EIO_WD_CLOSE: - fmt = "%p | %d, %p, %p"; - req = eio_wd_close(wd, pri, cb, data); - break; - case EIO_CLOSE: - fmt = "%d | %d, %p, %p"; - req = eio_close(fd, pri, cb, data); - break; - case EIO_DUP2: - fmt = "%d, %d | %d, %p, %p"; - req = eio_dup2(fd, fd2, pri, cb, data); - break; - case EIO_SEEK: - fmt = "%d, %ld, %d | %d, %p, %p"; - req = eio_seek(fd, offset, whence, pri, cb, data); - break; - case EIO_READ: - fmt = "%d, %p, %zu | %d, %p, %p"; - req = eio_read(fd, buf, length, offset, pri, cb, data); - break; - case EIO_WRITE: - fmt = "%d, %p, %zu | %d, %p, %p"; - req = eio_write(fd, buf, length, offset, pri, cb, data); - break; - case EIO_READAHEAD: - fmt = "%d, %lld, %zu | %d, %p, %p"; - req = eio_readahead(fd, offset, length, pri, cb, data); - break; - case EIO_SENDFILE: - fmt = "%d, %d, %p, %zu | %d, %p, %p"; - req = eio_sendfile(out_fd, in_fd, in_offset, length, pri, cb, data); - break; - case EIO_FSTAT: - fmt = "%d | %d, %p, %p"; - req = eio_fstat(fd, pri, cb, data); - break; - case EIO_FSTATVFS: - fmt = "%d | %d, %p, %p"; - req = eio_fstatvfs(fd, pri, cb, data); - break; - case EIO_FTRUNCATE: - fmt = "%d, %ld | %d, %p, %p"; - req = eio_ftruncate(fd, offset, pri, cb, data); - break; - case EIO_FUTIME: - fmt = "%d, %f, %f | %d, %p, %p"; - req = eio_futime(fd, atime, mtime, pri, cb, data); - break; - case EIO_FCHMOD: - fmt = "%d, %hd | %d, %p, %p"; - req = eio_fchmod(fd, mode, pri, cb, data); - break; - case EIO_FCHOWN: - fmt = "%d, %d, %d | %d, %p, %p"; - req = eio_fchown(fd, uid, gid, pri, cb, data); - break; - case EIO_SYNC: - fmt = "| %d, %p, %p"; - req = eio_sync(pri, cb, data); - break; - case EIO_FSYNC: - fmt = "%d | %d, %p, %p"; - req = eio_fsync(fd, pri, cb, data); - break; - case EIO_FDATASYNC: - fmt = "%d | %d, %p, %p"; - req = eio_fdatasync(fd, pri, cb, data); - break; - case EIO_SYNCFS: - fmt = "%d | %d, %p, %p"; - req = eio_syncfs(fd, pri, cb, data); - break; - case EIO_MSYNC: - fmt = "%p, %zu, %d | %d, %p, %p"; - req = eio_msync(addr, length, flags, pri, cb, data); - break; - case EIO_MTOUCH: - fmt = "%p, %zu, %d | %d, %p, %p"; - req = eio_mtouch(addr, length, flags, pri, cb, data); - break; - case EIO_SYNC_FILE_RANGE: - fmt = "%p, %lld, %lld, %u | %d, %p, %p"; - req = eio_sync_file_range(fd, offset, nbytes, flags, pri, cb, data); - break; - case EIO_FALLOCATE: - fmt = "%p, %d, %ld, %ld | %d, %p, %p"; - req = eio_fallocate (fd, mode, offset, len, pri, cb, data); - break; - case EIO_MLOCK: - fmt = "%p, %zu | %d, %p, %p"; - req = eio_mlock(addr, length, pri, cb, data); - break; - case EIO_MLOCKALL: - fmt = "%d | %d, %p, %p"; - req = eio_mlockall(flags, pri, cb, data); - break; - case EIO_GROUP: - const int pri = EIO_PRI_MAX; /* XXX */ - fmt = "| %p, %p"; - req = eio_grp(eio_cb cb, void *data) - break; - case EIO_NOP: - fmt = "| %d, %p, %p"; - req = eio_nop(pri,cb, data); - break; - case EIO_BUSY: - fmt = "%f | %d, %p, %p"; - req = eio_busy(delay, pri, cb, data); - break; - case EIO_REALPATH: - fmt = "%s | %d, %p, %p"; - req = eio_realpath(path, pri, cb, data); - break; - case EIO_READDIR: - fmt = "%s, %d | %d, %p, %p"; - req = eio_readdir(path, flags, pri, cb, data); - break; - case EIO_OPEN: - fmt = "%s, %d, %d | %d, %p, %p"; - req = eio_open(path, flags, mode, pri, cb, data); - break; - case EIO_STAT: - fmt = "%s | %d, %p, %p"; - req = eio_stat(path, pri, cb, data); - break; - case EIO_LSTAT: - fmt = "%s | %d, %p, %p"; - req = eio_lstat(path, pri, cb, data); - break; - case EIO_STATVFS: - fmt = "%s | %d, %p, %p"; - req = eio_statvfs(path, pri, cb, data); - break; - case EIO_TRUNCATE: - fmt = "%s, %ld | %d, %p, %p"; - req = eio_truncate(path, offset, pri, cb, data); - break; - case EIO_UTIME: - fmt = "%s, %p, %p | %d, %p, %p"; - req = eio_utime(path, atime, mtime, pri, cb, data); - break; - case EIO_CHMOD: - fmt = "%s, %d | %d, %p, %p"; - req = eio_chmod(path, mode, pri, cb, data); - break; - case EIO_CHOWN: - fmt = "%s, %d, %d | %d, %p, %p"; - req = eio_chown(path, uid, gid, pri, cb, data); - break; - case EIO_UNLINK: - fmt = "%s | %d, %p, %p"; - req = eio_unlink(path, pri, cb, data); - break; - case EIO_RMDIR: - fmt = "%s | %d, %p, %p"; - req = eio_rmdir(path, pri, cb, data); - break; - case EIO_MKDIR: - fmt = "%s, %d | %d, %p, %p"; - req = eio_mkdir(path, mode, pri, cb, data); - break; - case EIO_RENAME: - fmt = "%s, %s | %d, %p, %p"; - req = eio_rename(path, new_path, pri, cb, data); - break; - case EIO_MKNOD: - fmt = "%s, %d, %ld | %d, %p, %p"; - req = eio_mknod(path, mode, dev, pri, cb, data); - break; - case EIO_LINK: - fmt = "%s, %s | %d, %p, %p"; - req = eio_link(path, new_path, pri, cb, data); - break; - case EIO_SYMLINK: - fmt = "%s, %s | %d, %p, %p"; - req = eio_symlink(path, new_path, pri, cb, data); - break; - case EIO_READLINK: - fmt = "%s | %d, %p, %p"; - req = eio_readlink(path, pri, cb, data); - break; - default: -assert(0); - break; - } - - va_end(ap); - -exit: - return req; -} -#endif /* NOTYET */ - -/*==============================================================*/ -static int doEIO(ARGV_t av, int ac) -{ - int rc = 0; - - rc = rpmeioStart(); - if (rc) - goto exit; - - do { - /* avoid relative paths yourself(!) */ - Eio_mkdir("eio-test-dir", 0777, 0, rpmeioCB, "mkdir"); - Eio_nop(0, rpmeioCB, "nop"); - rpmeioLoop(); - - Eio_stat("eio-test-dir", 0, rpmeioCB_stat, "stat"); - Eio_lstat("eio-test-dir", 0, rpmeioCB_stat, "stat"); - Eio_open("eio-test-dir/eio-test-file", O_RDWR | O_CREAT, 0777, 0, - rpmeioCB_open, "open"); - 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(); - - Eio_utime("eio-test-dir", 12345.678, 23456.789, 0, rpmeioCB, - "utime"); - Eio_futime(rpmeioLastFdno, 92345.678, 93456.789, 0, rpmeioCB, "futime"); - Eio_chown("eio-test-dir", getuid(), getgid(), 0, rpmeioCB, "chown"); - Eio_fchown(rpmeioLastFdno, getuid(), getgid(), 0, rpmeioCB, "fchown"); - Eio_fchmod(rpmeioLastFdno, 0723, 0, rpmeioCB, "fchmod"); - Eio_readdir("eio-test-dir", 0, 0, rpmeioCB_readdir, "readdir"); - 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(); - - Eio_read(rpmeioLastFdno, 0, 8, 0, EIO_PRI_DEFAULT, rpmeioCB_read, "read"); - Eio_readlink("eio-test-dir/eio-symlink", 0, rpmeioCB, "readlink"); - rpmeioLoop(); - - Eio_dup2(1, 2, EIO_PRI_DEFAULT, rpmeioCB, "dup"); // dup stdout to stderr - Eio_chmod("eio-test-dir", 0765, 0, rpmeioCB, "chmod"); - Eio_ftruncate(rpmeioLastFdno, 9, 0, rpmeioCB, "ftruncate"); - Eio_fdatasync(rpmeioLastFdno, 0, rpmeioCB, "fdatasync"); - Eio_fsync(rpmeioLastFdno, 0, rpmeioCB, "fsync"); - Eio_sync(0, rpmeioCB, "sync"); - Eio_busy(0.5, 0, rpmeioCB, "busy"); - rpmeioLoop(); - - Eio_sendfile(1, rpmeioLastFdno, 4, 5, 0, rpmeioCB, "sendfile"); // write "test\n" to stdout - Eio_fstat(rpmeioLastFdno, 0, rpmeioCB_stat, "stat"); - rpmeioLoop(); - - Eio_truncate("eio-test-dir/eio-test-file", 6, 0, rpmeioCB, - "truncate"); - Eio_readahead(rpmeioLastFdno, 0, 64, 0, rpmeioCB, "readahead"); - rpmeioLoop(); - - 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(); - - Eio_rename("eio-test-dir/eio-test-file", - "eio-test-dir/eio-test-file-renamed", 0, rpmeioCB, - "rename"); - rpmeioLoop(); - - 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(); - - Eio_rmdir("eio-test-dir", 0, rpmeioCB, "rmdir"); - rpmeioLoop(); - - } while (0); - - rc = 0; /* XXX */ - -exit: - return rc; -} - -/*==============================================================*/ #if !defined(POPT_BIT_XOR) #define POPT_BIT_XOR (POPT_ARG_VAL|POPT_ARGFLAG_XOR) #endif @@ -1615,13 +1185,11 @@ if (qname == NULL) qname = xstrdup("rpm"); - switch (6) { + switch (4) { 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]
