… | |
… | |
75 | |
75 | |
76 | #define EIO_STRUCT_STAT Stat_t |
76 | #define EIO_STRUCT_STAT Stat_t |
77 | |
77 | |
78 | /* use NV for 32 bit perls as it allows larger offsets */ |
78 | /* use NV for 32 bit perls as it allows larger offsets */ |
79 | #if IVSIZE >= 8 |
79 | #if IVSIZE >= 8 |
|
|
80 | # define VAL64 IV |
80 | # define SvVAL64 SvIV |
81 | # define SvVAL64 SvIV |
|
|
82 | # define newSVval64 newSViv |
81 | #else |
83 | #else |
|
|
84 | # define VAL64 NV |
82 | # define SvVAL64 SvNV |
85 | # define SvVAL64 SvNV |
|
|
86 | # define newSVval64 newSVnv |
83 | #endif |
87 | #endif |
84 | |
88 | |
85 | /*****************************************************************************/ |
89 | /*****************************************************************************/ |
86 | |
90 | |
87 | #if __GNUC__ >= 3 |
91 | #if __GNUC__ >= 3 |
… | |
… | |
95 | |
99 | |
96 | /*****************************************************************************/ |
100 | /*****************************************************************************/ |
97 | |
101 | |
98 | static HV *stash; |
102 | static HV *stash; |
99 | typedef SV SV8; /* byte-sv, used for argument-checking */ |
103 | typedef SV SV8; /* byte-sv, used for argument-checking */ |
|
|
104 | typedef int aio_rfd; /* read file desriptor */ |
|
|
105 | typedef int aio_wfd; /* write file descriptor */ |
100 | |
106 | |
101 | #define AIO_REQ_KLASS "IO::AIO::REQ" |
107 | #define AIO_REQ_KLASS "IO::AIO::REQ" |
102 | #define AIO_GRP_KLASS "IO::AIO::GRP" |
108 | #define AIO_GRP_KLASS "IO::AIO::GRP" |
103 | |
109 | |
104 | #define EIO_REQ_MEMBERS \ |
110 | #define EIO_REQ_MEMBERS \ |
… | |
… | |
108 | SV *self; |
114 | SV *self; |
109 | |
115 | |
110 | #define EIO_NO_WRAPPERS 1 |
116 | #define EIO_NO_WRAPPERS 1 |
111 | |
117 | |
112 | #include "libeio/eio.h" |
118 | #include "libeio/eio.h" |
|
|
119 | |
|
|
120 | #ifndef POSIX_FADV_NORMAL |
|
|
121 | # define POSIX_FADV_NORMAL 0 |
|
|
122 | #endif |
|
|
123 | |
|
|
124 | #ifndef POSIX_FADV_SEQUENTIAL |
|
|
125 | # define POSIX_FADV_SEQUENTIAL 0 |
|
|
126 | #endif |
|
|
127 | |
|
|
128 | #ifndef POSIX_FADV_RANDOM |
|
|
129 | # define POSIX_FADV_RANDOM 0 |
|
|
130 | #endif |
|
|
131 | |
|
|
132 | #ifndef POSIX_FADV_NOREUSE |
|
|
133 | # define POSIX_FADV_NOREUSE 0 |
|
|
134 | #endif |
|
|
135 | |
|
|
136 | #ifndef POSIX_FADV_WILLNEED |
|
|
137 | # define POSIX_FADV_WILLNEED 0 |
|
|
138 | #endif |
|
|
139 | |
|
|
140 | #ifndef POSIX_FADV_DONTNEED |
|
|
141 | # define POSIX_FADV_DONTNEED 0 |
|
|
142 | #endif |
113 | |
143 | |
114 | static int req_invoke (eio_req *req); |
144 | static int req_invoke (eio_req *req); |
115 | #define EIO_FINISH(req) req_invoke (req) |
145 | #define EIO_FINISH(req) req_invoke (req) |
116 | static void req_destroy (eio_req *grp); |
146 | static void req_destroy (eio_req *grp); |
117 | #define EIO_DESTROY(req) req_destroy (req) |
147 | #define EIO_DESTROY(req) req_destroy (req) |
… | |
… | |
570 | const_iv (O_CREAT , O_CREAT) |
600 | const_iv (O_CREAT , O_CREAT) |
571 | const_iv (O_TRUNC , O_TRUNC) |
601 | const_iv (O_TRUNC , O_TRUNC) |
572 | #ifndef _WIN32 |
602 | #ifndef _WIN32 |
573 | const_iv (S_IFIFO , S_IFIFO) |
603 | const_iv (S_IFIFO , S_IFIFO) |
574 | #endif |
604 | #endif |
|
|
605 | const_iv (FADV_NORMAL , POSIX_FADV_NORMAL) |
|
|
606 | const_iv (FADV_SEQUENTIAL, POSIX_FADV_SEQUENTIAL) |
|
|
607 | const_iv (FADV_RANDOM , POSIX_FADV_RANDOM) |
|
|
608 | const_iv (FADV_NOREUSE , POSIX_FADV_NOREUSE) |
|
|
609 | const_iv (FADV_WILLNEED , POSIX_FADV_WILLNEED) |
|
|
610 | const_iv (FADV_DONTNEED , POSIX_FADV_DONTNEED) |
|
|
611 | |
575 | const_eio (SYNC_FILE_RANGE_WAIT_BEFORE) |
612 | const_eio (SYNC_FILE_RANGE_WAIT_BEFORE) |
576 | const_eio (SYNC_FILE_RANGE_WRITE) |
613 | const_eio (SYNC_FILE_RANGE_WRITE) |
577 | const_eio (SYNC_FILE_RANGE_WAIT_AFTER) |
614 | const_eio (SYNC_FILE_RANGE_WAIT_AFTER) |
578 | |
615 | |
579 | const_eio (READDIR_DENTS) |
616 | const_eio (READDIR_DENTS) |
… | |
… | |
675 | |
712 | |
676 | REQ_SEND (req); |
713 | REQ_SEND (req); |
677 | } |
714 | } |
678 | |
715 | |
679 | void |
716 | void |
680 | aio_sync_file_range (SV *fh, SV *offset, SV *nbytes, IV flags, SV *callback=&PL_sv_undef) |
717 | aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef) |
681 | PROTOTYPE: $$$$;$ |
718 | PROTOTYPE: $$$$;$ |
682 | PPCODE: |
719 | PPCODE: |
683 | { |
720 | { |
684 | int fd = extract_fd (fh, 0); |
721 | int fd = extract_fd (fh, 0); |
685 | dREQ; |
722 | dREQ; |
686 | |
723 | |
687 | req->type = EIO_SYNC_FILE_RANGE; |
724 | req->type = EIO_SYNC_FILE_RANGE; |
688 | req->sv1 = newSVsv (fh); |
725 | req->sv1 = newSVsv (fh); |
689 | req->int1 = fd; |
726 | req->int1 = fd; |
690 | req->offs = SvVAL64 (offset); |
727 | req->offs = offset; |
691 | req->size = SvVAL64 (nbytes); |
728 | req->size = nbytes; |
692 | req->int2 = flags; |
729 | req->int2 = flags; |
693 | |
730 | |
694 | REQ_SEND (req); |
731 | REQ_SEND (req); |
695 | } |
732 | } |
696 | |
733 | |
… | |
… | |
791 | |
828 | |
792 | REQ_SEND; |
829 | REQ_SEND; |
793 | } |
830 | } |
794 | |
831 | |
795 | void |
832 | void |
796 | aio_sendfile (SV *out_fh, SV *in_fh, SV *in_offset, UV length, SV *callback=&PL_sv_undef) |
833 | aio_sendfile (SV *out_fh, SV *in_fh, off_t in_offset, size_t length, SV *callback=&PL_sv_undef) |
797 | PROTOTYPE: $$$$;$ |
834 | PROTOTYPE: $$$$;$ |
798 | PPCODE: |
835 | PPCODE: |
799 | { |
836 | { |
800 | int ifd = extract_fd (in_fh , 0); |
837 | int ifd = extract_fd (in_fh , 0); |
801 | int ofd = extract_fd (out_fh, 0); |
838 | int ofd = extract_fd (out_fh, 0); |
… | |
… | |
804 | req->type = EIO_SENDFILE; |
841 | req->type = EIO_SENDFILE; |
805 | req->sv1 = newSVsv (out_fh); |
842 | req->sv1 = newSVsv (out_fh); |
806 | req->int1 = ofd; |
843 | req->int1 = ofd; |
807 | req->sv2 = newSVsv (in_fh); |
844 | req->sv2 = newSVsv (in_fh); |
808 | req->int2 = ifd; |
845 | req->int2 = ifd; |
809 | req->offs = SvVAL64 (in_offset); |
846 | req->offs = in_offset; |
810 | req->size = length; |
847 | req->size = length; |
811 | |
848 | |
812 | REQ_SEND; |
849 | REQ_SEND; |
813 | } |
850 | } |
814 | |
851 | |
815 | void |
852 | void |
816 | aio_readahead (SV *fh, SV *offset, IV length, SV *callback=&PL_sv_undef) |
853 | aio_readahead (SV *fh, off_t offset, size_t length, SV *callback=&PL_sv_undef) |
817 | PROTOTYPE: $$$;$ |
854 | PROTOTYPE: $$$;$ |
818 | PPCODE: |
855 | PPCODE: |
819 | { |
856 | { |
820 | int fd = extract_fd (fh, 0); |
857 | int fd = extract_fd (fh, 0); |
821 | dREQ; |
858 | dREQ; |
822 | |
859 | |
823 | req->type = EIO_READAHEAD; |
860 | req->type = EIO_READAHEAD; |
824 | req->sv1 = newSVsv (fh); |
861 | req->sv1 = newSVsv (fh); |
825 | req->int1 = fd; |
862 | req->int1 = fd; |
826 | req->offs = SvVAL64 (offset); |
863 | req->offs = offset; |
827 | req->size = length; |
864 | req->size = length; |
828 | |
865 | |
829 | REQ_SEND; |
866 | REQ_SEND; |
830 | } |
867 | } |
831 | |
868 | |
… | |
… | |
1151 | CODE: |
1188 | CODE: |
1152 | RETVAL = eio_nthreads (); |
1189 | RETVAL = eio_nthreads (); |
1153 | OUTPUT: |
1190 | OUTPUT: |
1154 | RETVAL |
1191 | RETVAL |
1155 | |
1192 | |
|
|
1193 | int |
|
|
1194 | fadvise (aio_rfd fh, off_t offset, off_t length, IV advice) |
|
|
1195 | PROTOTYPE: $$$$ |
|
|
1196 | CODE: |
|
|
1197 | { |
|
|
1198 | #if _XOPEN_SOURCE >= 600 |
|
|
1199 | RETVAL = posix_fadvise (fh, offset, length, advice); |
|
|
1200 | #else |
|
|
1201 | RETVAL = errno = ENOSYS; |
|
|
1202 | #endif |
|
|
1203 | } |
|
|
1204 | OUTPUT: |
|
|
1205 | RETVAL |
|
|
1206 | |
|
|
1207 | ssize_t |
|
|
1208 | sendfile (aio_wfd ofh, aio_rfd ifh, off_t offset, size_t count) |
|
|
1209 | PROTOTYPE: $$$$ |
|
|
1210 | CODE: |
|
|
1211 | eio_sendfile_sync (ofh, ifh, offset, count); |
|
|
1212 | |
1156 | void _on_next_submit (SV *cb) |
1213 | void _on_next_submit (SV *cb) |
1157 | CODE: |
1214 | CODE: |
1158 | SvREFCNT_dec (on_next_submit); |
1215 | SvREFCNT_dec (on_next_submit); |
1159 | on_next_submit = SvOK (cb) ? newSVsv (cb) : 0; |
1216 | on_next_submit = SvOK (cb) ? newSVsv (cb) : 0; |
1160 | |
1217 | |