… | |
… | |
371 | |
371 | |
372 | pthread_once (&doinit, etp_once_init); |
372 | pthread_once (&doinit, etp_once_init); |
373 | |
373 | |
374 | want_poll_cb = want_poll; |
374 | want_poll_cb = want_poll; |
375 | done_poll_cb = done_poll; |
375 | done_poll_cb = done_poll; |
|
|
376 | |
|
|
377 | return 0; |
376 | } |
378 | } |
377 | |
379 | |
378 | X_THREAD_PROC (etp_proc); |
380 | X_THREAD_PROC (etp_proc); |
379 | |
381 | |
380 | static void etp_start_thread (void) |
382 | static void etp_start_thread (void) |
… | |
… | |
775 | |
777 | |
776 | #if !HAVE_READAHEAD |
778 | #if !HAVE_READAHEAD |
777 | # define readahead(fd,offset,count) eio__readahead (fd, offset, count, self) |
779 | # define readahead(fd,offset,count) eio__readahead (fd, offset, count, self) |
778 | |
780 | |
779 | static ssize_t |
781 | static ssize_t |
780 | eio__readahead (int fd, off_t offset, size_t count, worker *self) |
782 | eio__readahead (int fd, off_t offset, size_t count, etp_worker *self) |
781 | { |
783 | { |
782 | size_t todo = count; |
784 | size_t todo = count; |
783 | dBUF; |
785 | dBUF; |
784 | |
786 | |
785 | while (todo > 0) |
787 | while (todo > 0) |
… | |
… | |
901 | int memlen = 4096; |
903 | int memlen = 4096; |
902 | int memofs = 0; |
904 | int memofs = 0; |
903 | int res = 0; |
905 | int res = 0; |
904 | |
906 | |
905 | X_LOCK (wrklock); |
907 | X_LOCK (wrklock); |
|
|
908 | /* the corresponding closedir is in ETP_WORKER_CLEAR */ |
906 | self->dirp = dirp = opendir (req->ptr1); |
909 | self->dirp = dirp = opendir (req->ptr1); |
907 | req->flags |= EIO_FLAG_PTR2_FREE; |
910 | req->flags |= EIO_FLAG_PTR2_FREE; |
908 | req->ptr2 = names = malloc (memlen); |
911 | req->ptr2 = names = malloc (memlen); |
909 | X_UNLOCK (wrklock); |
912 | X_UNLOCK (wrklock); |
910 | |
913 | |
… | |
… | |
1039 | |
1042 | |
1040 | /*****************************************************************************/ |
1043 | /*****************************************************************************/ |
1041 | |
1044 | |
1042 | int eio_init (void (*want_poll)(void), void (*done_poll)(void)) |
1045 | int eio_init (void (*want_poll)(void), void (*done_poll)(void)) |
1043 | { |
1046 | { |
1044 | etp_init (want_poll, done_poll); |
1047 | return etp_init (want_poll, done_poll); |
1045 | } |
1048 | } |
1046 | |
1049 | |
1047 | static void eio_api_destroy (eio_req *req) |
1050 | static void eio_api_destroy (eio_req *req) |
1048 | { |
1051 | { |
1049 | free (req); |
1052 | free (req); |
… | |
… | |
1111 | case EIO_RMDIR: req->result = rmdir (req->ptr1); break; |
1114 | case EIO_RMDIR: req->result = rmdir (req->ptr1); break; |
1112 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
1115 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
1113 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
1116 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
1114 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
1117 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
1115 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
1118 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
1116 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
1119 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->int3); break; |
1117 | |
1120 | |
1118 | case EIO_READLINK: ALLOC (NAME_MAX); |
1121 | case EIO_READLINK: ALLOC (NAME_MAX); |
1119 | req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; |
1122 | req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; |
1120 | |
1123 | |
1121 | case EIO_SYNC: req->result = 0; sync (); break; |
1124 | case EIO_SYNC: req->result = 0; sync (); break; |
… | |
… | |
1328 | return eio__1path (EIO_READDIR, path, pri, cb, data); |
1331 | return eio__1path (EIO_READDIR, path, pri, cb, data); |
1329 | } |
1332 | } |
1330 | |
1333 | |
1331 | eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data) |
1334 | eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data) |
1332 | { |
1335 | { |
1333 | REQ (EIO_MKNOD); PATH; req->int2 = (long)mode; req->int2 = (long)dev; SEND; |
1336 | REQ (EIO_MKNOD); PATH; req->int2 = (long)mode; req->int3 = (long)dev; SEND; |
1334 | } |
1337 | } |
1335 | |
1338 | |
1336 | static eio_req * |
1339 | static eio_req * |
1337 | eio__2path (int type, const char *path, const char *new_path, int pri, eio_cb cb, void *data) |
1340 | eio__2path (int type, const char *path, const char *new_path, int pri, eio_cb cb, void *data) |
1338 | { |
1341 | { |