… | |
… | |
11 | #include <stddef.h> |
11 | #include <stddef.h> |
12 | #include <stdlib.h> |
12 | #include <stdlib.h> |
13 | #include <errno.h> |
13 | #include <errno.h> |
14 | #include <sys/types.h> |
14 | #include <sys/types.h> |
15 | #include <sys/stat.h> |
15 | #include <sys/stat.h> |
16 | #include <sys/statvfs.h> |
|
|
17 | #include <limits.h> |
16 | #include <limits.h> |
18 | #include <fcntl.h> |
17 | #include <fcntl.h> |
19 | #include <sched.h> |
18 | #include <sched.h> |
20 | |
19 | |
21 | #if _POSIX_MEMLOCK || _POSIX_MEMLOCK_RANGE || _POSIX_MAPPED_FILES |
20 | #if _POSIX_MEMLOCK || _POSIX_MEMLOCK_RANGE || _POSIX_MAPPED_FILES |
… | |
… | |
47 | # undef unlink |
46 | # undef unlink |
48 | # undef rmdir |
47 | # undef rmdir |
49 | # undef rename |
48 | # undef rename |
50 | # undef lseek |
49 | # undef lseek |
51 | |
50 | |
52 | # define chown(a,b,c) (errno = ENOSYS, -1) |
|
|
53 | # define fchown(a,b,c) (errno = ENOSYS, -1) |
|
|
54 | # define fchmod(a,b) (errno = ENOSYS, -1) |
|
|
55 | # define symlink(a,b) (errno = ENOSYS, -1) |
|
|
56 | # define readlink(a,b,c) (errno = ENOSYS, -1) |
|
|
57 | # define mknod(a,b,c) (errno = ENOSYS, -1) |
|
|
58 | # define truncate(a,b) (errno = ENOSYS, -1) |
|
|
59 | # define ftruncate(fd,o) chsize ((fd), (o)) |
|
|
60 | # define fsync(fd) _commit (fd) |
|
|
61 | # define opendir(fd) (errno = ENOSYS, 0) |
51 | # define opendir(fd) (errno = ENOSYS, 0) |
62 | # define readdir(fd) (errno = ENOSYS, -1) |
52 | # define readdir(fd) (errno = ENOSYS, -1) |
63 | # define closedir(fd) (errno = ENOSYS, -1) |
53 | # define closedir(fd) (errno = ENOSYS, -1) |
64 | # define mkdir(a,b) mkdir (a) |
|
|
65 | |
54 | |
66 | #else |
55 | #else |
67 | |
56 | |
68 | # include <sys/time.h> |
57 | # include <sys/time.h> |
69 | # include <sys/select.h> |
58 | # include <sys/select.h> |
… | |
… | |
585 | case EIO_NOP: |
574 | case EIO_NOP: |
586 | case EIO_BUSY: |
575 | case EIO_BUSY: |
587 | break; |
576 | break; |
588 | |
577 | |
589 | case EIO_READLINK: |
578 | case EIO_READLINK: |
|
|
579 | case EIO_REALPATH: |
590 | if (req->result > 0) |
580 | if (req->result > 0) |
591 | PUSHs (sv_2mortal (newSVpvn (req->ptr2, req->result))); |
581 | PUSHs (sv_2mortal (newSVpvn (req->ptr2, req->result))); |
592 | break; |
582 | break; |
593 | |
583 | |
594 | case EIO_STAT: |
584 | case EIO_STAT: |
… | |
… | |
666 | grp->sv2 = 0; |
656 | grp->sv2 = 0; |
667 | |
657 | |
668 | eio_grp_cancel (grp); |
658 | eio_grp_cancel (grp); |
669 | } |
659 | } |
670 | |
660 | |
671 | static void |
|
|
672 | create_respipe (void) |
661 | static void create_respipe (void) |
673 | { |
662 | { |
674 | if (s_epipe_renew (&respipe)) |
663 | if (s_epipe_renew (&respipe)) |
675 | croak ("IO::AIO: unable to initialize result pipe"); |
664 | croak ("IO::AIO: unable to initialize result pipe"); |
676 | } |
665 | } |
677 | |
666 | |
… | |
… | |
731 | # define MAP_FIXED 0 |
720 | # define MAP_FIXED 0 |
732 | #endif |
721 | #endif |
733 | |
722 | |
734 | #define MMAP_MAGIC PERL_MAGIC_ext |
723 | #define MMAP_MAGIC PERL_MAGIC_ext |
735 | |
724 | |
736 | static int |
|
|
737 | mmap_free (pTHX_ SV *sv, MAGIC *mg) |
725 | static int mmap_free (pTHX_ SV *sv, MAGIC *mg) |
738 | { |
726 | { |
739 | int old_errno = errno; |
727 | int old_errno = errno; |
740 | munmap (mg->mg_ptr, (size_t)mg->mg_obj); |
728 | munmap (mg->mg_ptr, (size_t)mg->mg_obj); |
741 | errno = old_errno; |
729 | errno = old_errno; |
742 | |
730 | |
… | |
… | |
758 | 0, 0, 0, 0, mmap_free |
746 | 0, 0, 0, 0, mmap_free |
759 | }; |
747 | }; |
760 | |
748 | |
761 | /*****************************************************************************/ |
749 | /*****************************************************************************/ |
762 | |
750 | |
763 | static SV * |
|
|
764 | get_cb (SV *cb_sv) |
751 | static SV * get_cb (SV *cb_sv) |
765 | { |
752 | { |
766 | SvGETMAGIC (cb_sv); |
753 | SvGETMAGIC (cb_sv); |
767 | return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0; |
754 | return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0; |
768 | } |
755 | } |
769 | |
756 | |
… | |
… | |
893 | |
880 | |
894 | const_eio (SYNC_FILE_RANGE_WAIT_BEFORE) |
881 | const_eio (SYNC_FILE_RANGE_WAIT_BEFORE) |
895 | const_eio (SYNC_FILE_RANGE_WRITE) |
882 | const_eio (SYNC_FILE_RANGE_WRITE) |
896 | const_eio (SYNC_FILE_RANGE_WAIT_AFTER) |
883 | const_eio (SYNC_FILE_RANGE_WAIT_AFTER) |
897 | |
884 | |
|
|
885 | const_eio (FALLOC_FL_KEEP_SIZE) |
|
|
886 | |
898 | const_eio (READDIR_DENTS) |
887 | const_eio (READDIR_DENTS) |
899 | const_eio (READDIR_DIRS_FIRST) |
888 | const_eio (READDIR_DIRS_FIRST) |
900 | const_eio (READDIR_STAT_ORDER) |
889 | const_eio (READDIR_STAT_ORDER) |
901 | const_eio (READDIR_FOUND_UNKNOWN) |
890 | const_eio (READDIR_FOUND_UNKNOWN) |
902 | |
891 | |
… | |
… | |
1014 | req->sv1 = newSVsv (fh); |
1003 | req->sv1 = newSVsv (fh); |
1015 | req->int1 = fd; |
1004 | req->int1 = fd; |
1016 | req->offs = offset; |
1005 | req->offs = offset; |
1017 | req->size = nbytes; |
1006 | req->size = nbytes; |
1018 | req->int2 = flags; |
1007 | req->int2 = flags; |
|
|
1008 | |
|
|
1009 | REQ_SEND (req); |
|
|
1010 | } |
|
|
1011 | |
|
|
1012 | void |
|
|
1013 | aio_fallocate (SV *fh, int mode, off_t offset, size_t len, SV *callback=&PL_sv_undef) |
|
|
1014 | PPCODE: |
|
|
1015 | { |
|
|
1016 | int fd = s_fileno_croak (fh, 0); |
|
|
1017 | dREQ; |
|
|
1018 | |
|
|
1019 | req->type = EIO_FALLOCATE; |
|
|
1020 | req->sv1 = newSVsv (fh); |
|
|
1021 | req->int1 = fd; |
|
|
1022 | req->int2 = mode; |
|
|
1023 | req->offs = offset; |
|
|
1024 | req->size = len; |
1019 | |
1025 | |
1020 | REQ_SEND (req); |
1026 | REQ_SEND (req); |
1021 | } |
1027 | } |
1022 | |
1028 | |
1023 | void |
1029 | void |
… | |
… | |
1101 | } |
1107 | } |
1102 | } |
1108 | } |
1103 | |
1109 | |
1104 | void |
1110 | void |
1105 | aio_readlink (SV8 *path, SV *callback=&PL_sv_undef) |
1111 | aio_readlink (SV8 *path, SV *callback=&PL_sv_undef) |
|
|
1112 | ALIAS: |
|
|
1113 | aio_readlink = EIO_READLINK |
|
|
1114 | aio_realpath = EIO_REALPATH |
1106 | PPCODE: |
1115 | PPCODE: |
1107 | { |
1116 | { |
1108 | SV *data; |
1117 | SV *data; |
1109 | dREQ; |
1118 | dREQ; |
1110 | |
1119 | |
1111 | req->type = EIO_READLINK; |
1120 | req->type = ix; |
1112 | req->sv1 = newSVsv (path); |
1121 | req->sv1 = newSVsv (path); |
1113 | req->ptr1 = SvPVbyte_nolen (req->sv1); |
1122 | req->ptr1 = SvPVbyte_nolen (req->sv1); |
1114 | |
1123 | |
1115 | REQ_SEND; |
1124 | REQ_SEND; |
1116 | } |
1125 | } |