diff options
| author | root <root> | 2008-09-21 00:23:45 +0000 | 
|---|---|---|
| committer | root <root> | 2008-09-21 00:23:45 +0000 | 
| commit | f47493fa352d9c0ae7e10490c89f380195a283fc (patch) | |
| tree | 81e80e5efb33fb7d589384c5fc4a851044e367b3 | |
| parent | 2593e3d47d7cfef64910fef19d29428fc13c2c92 (diff) | |
*** empty log message ***
| -rw-r--r-- | Changes | 4 | ||||
| -rw-r--r-- | eio.c | 45 | ||||
| -rw-r--r-- | eio.h | 11 | 
3 files changed, 54 insertions, 6 deletions
| @@ -1,5 +1,9 @@  Revision history for libeio +TODO: maybe add mincore support? available on at leats darwin, solaris, linux, freebsd +  1.0 +	- added msync, mtouch support (untested). +        - fixed custom support.  	- "outbundled" from IO::AIO. @@ -952,6 +952,35 @@ eio__scandir (eio_req *req, etp_worker *self)    req->result = res;  } +#if !(_POSIX_MAPPED_FILES && _POSIX_SYNCHRONIZED_IO) +# define msync(a,b,c) ENOSYS +#endif + +int +eio__mtouch (void *mem, size_t len, int flags) +{ +  intptr_t addr = (intptr_t)mem; +  intptr_t end = addr + len; +#ifdef PAGESIZE +  const intptr_t page = PAGESIZE; +#else +  static intptr_t page; + +  if (!page) +    page = sysconf (_SC_PAGESIZE); +#endif + +  addr &= ~(page - 1); /* assume page size is always a power of two */ + +  if (addr < end) +    if (flags) /* modify */ +      do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len); +    else +      do { *((volatile sig_atomic_t *)addr)     ; } while ((addr += page) < len); + +  return 0; +} +  /*****************************************************************************/  #define ALLOC(len)				\ @@ -1126,6 +1155,8 @@ static void eio_execute (etp_worker *self, eio_req *req)        case EIO_SYNC:      req->result = 0; sync (); break;        case EIO_FSYNC:     req->result = fsync     (req->int1); break;        case EIO_FDATASYNC: req->result = fdatasync (req->int1); break; +      case EIO_MSYNC:     req->result = msync (req->ptr2, req->size, req->int1); break; +      case EIO_MTOUCH:    req->result = eio__mtouch (req->ptr2, req->size, req->int1); break;        case EIO_READDIR:   eio__scandir (req, self); break; @@ -1174,7 +1205,7 @@ static void eio_execute (etp_worker *self, eio_req *req)          break;        case EIO_CUSTOM: -        req->feed (req); +        ((void (*)(eio_req *))req->feed) (req);          break;        default: @@ -1207,6 +1238,16 @@ eio_req *eio_fsync (int fd, int pri, eio_cb cb, void *data)    REQ (EIO_FSYNC); req->int1 = fd; SEND;  } +eio_req *eio_msync (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data) +{ +  REQ (EIO_MSYNC); req->ptr2 = addr; req->size = length; req->int1 = flags; SEND; +} + +eio_req *eio_mtouch (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data) +{ +  REQ (EIO_MTOUCH); req->ptr2 = addr; req->size = length; req->int1 = flags; SEND; +} +  eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data)  {    REQ (EIO_FDATASYNC); req->int1 = fd; SEND; @@ -1371,7 +1412,7 @@ eio_req *eio_rename (const char *path, const char *new_path, int pri, eio_cb cb,  eio_req *eio_custom (eio_cb execute, int pri, eio_cb cb, void *data)  { -  REQ (EIO_CUSTOM); req->feed = execute; SEND; +  REQ (EIO_CUSTOM); req->feed = (void (*)(eio_req *))execute; SEND;  }  #endif @@ -60,6 +60,7 @@ typedef int (*eio_cb)(eio_req *req);  #endif  enum { +  EIO_CUSTOM,    EIO_OPEN, EIO_CLOSE, EIO_DUP2,    EIO_READ, EIO_WRITE,    EIO_READAHEAD, EIO_SENDFILE, @@ -68,12 +69,12 @@ enum {    EIO_UTIME, EIO_FUTIME,    EIO_CHMOD, EIO_FCHMOD,    EIO_CHOWN, EIO_FCHOWN, -  EIO_SYNC, EIO_FSYNC, EIO_FDATASYNC, +  EIO_SYNC, EIO_FSYNC, EIO_FDATASYNC, EIO_MSYNC, EIO_MTOUCH,    EIO_UNLINK, EIO_RMDIR, EIO_MKDIR, EIO_RENAME,    EIO_MKNOD, EIO_READDIR,    EIO_LINK, EIO_SYMLINK, EIO_READLINK,    EIO_GROUP, EIO_NOP, -  EIO_BUSY, EIO_CUSTOM +  EIO_BUSY,  };  typedef double eio_tstamp; /* feel free to use double in your code directly */ @@ -86,14 +87,14 @@ struct eio_req    ssize_t result;  /* result of syscall, e.g. result = read (... */    off_t offs;      /* read, write, truncate, readahead: file offset */ -  size_t size;     /* read, write, readahead, sendfile: length */ +  size_t size;     /* read, write, readahead, sendfile, msync: length */    void *ptr1;      /* all applicable requests: pathname, old name */    void *ptr2;      /* all applicable requests: new name or memory buffer */    eio_tstamp nv1;  /* utime, futime: atime; busy: sleep time */    eio_tstamp nv2;  /* utime, futime: mtime */    int type;        /* EIO_xxx constant ETP */ -  int int1;        /* all applicable requests: file descriptor; sendfile: output fd; open: flags */ +  int int1;        /* all applicable requests: file descriptor; sendfile: output fd; open, msync: flags */    long int2;       /* chown, fchown: uid; sendfile: input fd; open, chmod, mkdir, mknod: file mode */    long int3;       /* chown, fchown: gid; mknod: dev_t */    int errorno;     /* errno value on syscall return */ @@ -160,6 +161,8 @@ eio_req *eio_busy      (eio_tstamp delay, int pri, eio_cb cb, void *data); /* ti  eio_req *eio_sync      (int pri, eio_cb cb, void *data);  eio_req *eio_fsync     (int fd, int pri, eio_cb cb, void *data);  eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data); +eio_req *eio_msync     (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data); +eio_req *eio_mtouch    (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data);  eio_req *eio_close     (int fd, int pri, eio_cb cb, void *data);  eio_req *eio_readahead (int fd, off_t offset, size_t length, int pri, eio_cb cb, void *data);  eio_req *eio_read      (int fd, void *buf, size_t length, off_t offset, int pri, eio_cb cb, void *data); | 
