… | |
… | |
8 | #include <errno.h> |
8 | #include <errno.h> |
9 | #include <sys/types.h> |
9 | #include <sys/types.h> |
10 | #include <sys/stat.h> |
10 | #include <sys/stat.h> |
11 | #include <limits.h> |
11 | #include <limits.h> |
12 | #include <fcntl.h> |
12 | #include <fcntl.h> |
13 | #include <sched.h> |
13 | #include <assert.h> |
14 | |
14 | |
15 | #ifndef EIO_FINISH |
15 | #ifndef EIO_FINISH |
16 | # define EIO_FINISH(req) ((req)->finish) && !EIO_CANCELLED (req) ? (req)->finish (req) : 0 |
16 | # define EIO_FINISH(req) ((req)->finish) && !EIO_CANCELLED (req) ? (req)->finish (req) : 0 |
17 | #endif |
17 | #endif |
18 | |
18 | |
… | |
… | |
325 | |
325 | |
326 | static void start_thread (void) |
326 | static void start_thread (void) |
327 | { |
327 | { |
328 | worker *wrk = calloc (1, sizeof (worker)); |
328 | worker *wrk = calloc (1, sizeof (worker)); |
329 | |
329 | |
330 | if (!wrk) |
330 | /*TODO*/ |
331 | croak ("unable to allocate worker thread data"); |
331 | assert (("unable to allocate worker thread data", !wrk)); |
332 | |
332 | |
333 | X_LOCK (wrklock); |
333 | X_LOCK (wrklock); |
334 | |
334 | |
335 | if (thread_create (&wrk->tid, eio_proc, (void *)wrk)) |
335 | if (thread_create (&wrk->tid, eio_proc, (void *)wrk)) |
336 | { |
336 | { |
… | |
… | |
768 | } |
768 | } |
769 | |
769 | |
770 | /*****************************************************************************/ |
770 | /*****************************************************************************/ |
771 | |
771 | |
772 | #define ALLOC(len) \ |
772 | #define ALLOC(len) \ |
773 | X_LOCK (wrklock); \ |
|
|
774 | req->flags |= EIO_FLAG_PTR2_FREE; \ |
|
|
775 | X_UNLOCK (wrklock); \ |
|
|
776 | req->ptr2 = malloc (len); \ |
|
|
777 | if (!req->ptr2) \ |
773 | if (!req->ptr2) \ |
778 | { \ |
774 | { \ |
|
|
775 | X_LOCK (wrklock); \ |
|
|
776 | req->flags |= EIO_FLAG_PTR2_FREE; \ |
|
|
777 | X_UNLOCK (wrklock); \ |
|
|
778 | req->ptr2 = malloc (len); \ |
|
|
779 | if (!req->ptr2) \ |
|
|
780 | { \ |
779 | errno = ENOMEM; \ |
781 | errno = ENOMEM; \ |
780 | req->result = -1; \ |
782 | req->result = -1; \ |
781 | break; \ |
783 | break; \ |
|
|
784 | } \ |
782 | } |
785 | } |
783 | |
786 | |
784 | X_THREAD_PROC (eio_proc) |
787 | X_THREAD_PROC (eio_proc) |
785 | { |
788 | { |
786 | eio_req *req; |
789 | eio_req *req; |
… | |
… | |
832 | errno = 0; /* strictly unnecessary */ |
835 | errno = 0; /* strictly unnecessary */ |
833 | |
836 | |
834 | if (!EIO_CANCELLED (req)) |
837 | if (!EIO_CANCELLED (req)) |
835 | switch (req->type) |
838 | switch (req->type) |
836 | { |
839 | { |
|
|
840 | case EIO_READ: ALLOC (req->size); |
837 | case EIO_READ: req->result = req->offs >= 0 |
841 | req->result = req->offs >= 0 |
838 | ? pread (req->int1, req->ptr2, req->size, req->offs) |
842 | ? pread (req->int1, req->ptr2, req->size, req->offs) |
839 | : read (req->int1, req->ptr2, req->size); break; |
843 | : read (req->int1, req->ptr2, req->size); break; |
840 | case EIO_WRITE: req->result = req->offs >= 0 |
844 | case EIO_WRITE: req->result = req->offs >= 0 |
841 | ? pwrite (req->int1, req->ptr2, req->size, req->offs) |
845 | ? pwrite (req->int1, req->ptr2, req->size, req->offs) |
842 | : write (req->int1, req->ptr2, req->size); break; |
846 | : write (req->int1, req->ptr2, req->size); break; |
… | |
… | |
866 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
870 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
867 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
871 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
868 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
872 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
869 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
873 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
870 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
874 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
|
|
875 | |
871 | case EIO_READLINK: ALLOC (NAME_MAX); |
876 | case EIO_READLINK: ALLOC (NAME_MAX); |
872 | req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; |
877 | req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; |
873 | |
878 | |
874 | case EIO_SYNC: req->result = 0; sync (); break; |
879 | case EIO_SYNC: req->result = 0; sync (); break; |
875 | case EIO_FSYNC: req->result = fsync (req->int1); break; |
880 | case EIO_FSYNC: req->result = fsync (req->int1); break; |