diff options
| author | root <root> | 2011-06-05 20:25:00 +0000 | 
|---|---|---|
| committer | root <root> | 2011-06-05 20:25:00 +0000 | 
| commit | 655aee59fd0808a47cf5a0bb544c16abd8924791 (patch) | |
| tree | d398a3c9fe72f901c3593fb3dd97327a7e958862 | |
| parent | 653e0063cb266d51505942ab3642db3401aa7806 (diff) | |
make mtouch cancellable
| -rw-r--r-- | eio.c | 12 | 
1 files changed, 8 insertions, 4 deletions
@@ -1525,8 +1525,12 @@ eio__msync (void *mem, size_t len, int flags)  #endif  int -eio__mtouch (void *mem, size_t len, int flags) +eio__mtouch (eio_req *req)  { +  void *mem  = req->ptr2; +  size_t len = req->size; +  int flags  = req->int1; +    eio_page_align (&mem, &len);    { @@ -1536,9 +1540,9 @@ eio__mtouch (void *mem, size_t len, int flags)      if (addr < end)        if (flags & EIO_MT_MODIFY) /* modify */ -        do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len); +        do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len && !EIO_CANCELLED (req));        else -        do { *((volatile sig_atomic_t *)addr)     ; } while ((addr += page) < len); +        do { *((volatile sig_atomic_t *)addr)     ; } while ((addr += page) < len && !EIO_CANCELLED (req));    }    return 0; @@ -1722,7 +1726,7 @@ static void eio_execute (etp_worker *self, eio_req *req)        case EIO_FSYNC:     req->result = fsync     (req->int1); break;        case EIO_FDATASYNC: req->result = fdatasync (req->int1); break;        case EIO_MSYNC:     req->result = eio__msync (req->ptr2, req->size, req->int1); break; -      case EIO_MTOUCH:    req->result = eio__mtouch (req->ptr2, req->size, req->int1); break; +      case EIO_MTOUCH:    req->result = eio__mtouch (req); break;        case EIO_MLOCK:     req->result = eio__mlock (req->ptr2, req->size); break;        case EIO_MLOCKALL:  req->result = eio__mlockall (req->int1); break;        case EIO_SYNC_FILE_RANGE: req->result = eio__sync_file_range (req->int1, req->offs, req->size, req->int2); break;  | 
