ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.xs
(Generate patch)

Comparing IO-AIO/AIO.xs (file contents):
Revision 1.148 by root, Wed Jun 17 01:14:48 2009 UTC vs.
Revision 1.151 by root, Tue Jul 14 00:13:36 2009 UTC

3#include <errno.h> 3#include <errno.h>
4 4
5#include "EXTERN.h" 5#include "EXTERN.h"
6#include "perl.h" 6#include "perl.h"
7#include "XSUB.h" 7#include "XSUB.h"
8
9#include "schmorp.h"
8 10
9#include <stddef.h> 11#include <stddef.h>
10#include <stdlib.h> 12#include <stdlib.h>
11#include <errno.h> 13#include <errno.h>
12#include <sys/types.h> 14#include <sys/types.h>
117 119
118#include "libeio/eio.h" 120#include "libeio/eio.h"
119 121
120#ifndef POSIX_FADV_NORMAL 122#ifndef POSIX_FADV_NORMAL
121# define POSIX_FADV_NORMAL 0 123# define POSIX_FADV_NORMAL 0
124# define NO_FADVISE 1
122#endif 125#endif
123 126
124#ifndef POSIX_FADV_SEQUENTIAL 127#ifndef POSIX_FADV_SEQUENTIAL
125# define POSIX_FADV_SEQUENTIAL 0 128# define POSIX_FADV_SEQUENTIAL 0
126#endif 129#endif
567 req_submit (req); \ 570 req_submit (req); \
568 SPAGAIN; \ 571 SPAGAIN; \
569 \ 572 \
570 if (GIMME_V != G_VOID) \ 573 if (GIMME_V != G_VOID) \
571 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 574 XPUSHs (req_sv (req, AIO_REQ_KLASS));
572
573static int
574extract_fd (SV *fh, int wr)
575{
576 int fd = PerlIO_fileno (wr ? IoOFP (sv_2io (fh)) : IoIFP (sv_2io (fh)));
577
578 if (fd < 0)
579 croak ("illegal fh argument, either not an OS file or read/write mode mismatch");
580
581 return fd;
582}
583 575
584MODULE = IO::AIO PACKAGE = IO::AIO 576MODULE = IO::AIO PACKAGE = IO::AIO
585 577
586PROTOTYPES: ENABLE 578PROTOTYPES: ENABLE
587 579
701 ALIAS: 693 ALIAS:
702 aio_fsync = EIO_FSYNC 694 aio_fsync = EIO_FSYNC
703 aio_fdatasync = EIO_FDATASYNC 695 aio_fdatasync = EIO_FDATASYNC
704 PPCODE: 696 PPCODE:
705{ 697{
706 int fd = extract_fd (fh, 0); 698 int fd = s_fileno_croak (fh, 0);
707 dREQ; 699 dREQ;
708 700
709 req->type = ix; 701 req->type = ix;
710 req->sv1 = newSVsv (fh); 702 req->sv1 = newSVsv (fh);
711 req->int1 = fd; 703 req->int1 = fd;
716void 708void
717aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef) 709aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef)
718 PROTOTYPE: $$$$;$ 710 PROTOTYPE: $$$$;$
719 PPCODE: 711 PPCODE:
720{ 712{
721 int fd = extract_fd (fh, 0); 713 int fd = s_fileno_croak (fh, 0);
722 dREQ; 714 dREQ;
723 715
724 req->type = EIO_SYNC_FILE_RANGE; 716 req->type = EIO_SYNC_FILE_RANGE;
725 req->sv1 = newSVsv (fh); 717 req->sv1 = newSVsv (fh);
726 req->int1 = fd; 718 req->int1 = fd;
735aio_close (SV *fh, SV *callback=&PL_sv_undef) 727aio_close (SV *fh, SV *callback=&PL_sv_undef)
736 PROTOTYPE: $;$ 728 PROTOTYPE: $;$
737 PPCODE: 729 PPCODE:
738{ 730{
739 static int close_pipe = -1; /* dummy fd to close fds via dup2 */ 731 static int close_pipe = -1; /* dummy fd to close fds via dup2 */
740 int fd = extract_fd (fh, 0); 732 int fd = s_fileno_croak (fh, 0);
741 dREQ; 733 dREQ;
742 734
743 if (close_pipe < 0) 735 if (close_pipe < 0)
744 { 736 {
745 int pipefd [2]; 737 int pipefd [2];
767 aio_write = EIO_WRITE 759 aio_write = EIO_WRITE
768 PROTOTYPE: $$$$$;$ 760 PROTOTYPE: $$$$$;$
769 PPCODE: 761 PPCODE:
770{ 762{
771 STRLEN svlen; 763 STRLEN svlen;
772 int fd = extract_fd (fh, ix == EIO_WRITE); 764 int fd = s_fileno_croak (fh, ix == EIO_WRITE);
773 char *svptr = SvPVbyte (data, svlen); 765 char *svptr = SvPVbyte (data, svlen);
774 UV len = SvUV (length); 766 UV len = SvUV (length);
775 767
776 if (dataoffset < 0) 768 if (dataoffset < 0)
777 dataoffset += svlen; 769 dataoffset += svlen;
832void 824void
833aio_sendfile (SV *out_fh, SV *in_fh, off_t in_offset, size_t length, SV *callback=&PL_sv_undef) 825aio_sendfile (SV *out_fh, SV *in_fh, off_t in_offset, size_t length, SV *callback=&PL_sv_undef)
834 PROTOTYPE: $$$$;$ 826 PROTOTYPE: $$$$;$
835 PPCODE: 827 PPCODE:
836{ 828{
837 int ifd = extract_fd (in_fh , 0); 829 int ifd = s_fileno_croak (in_fh , 0);
838 int ofd = extract_fd (out_fh, 0); 830 int ofd = s_fileno_croak (out_fh, 1);
839 dREQ; 831 dREQ;
840 832
841 req->type = EIO_SENDFILE; 833 req->type = EIO_SENDFILE;
842 req->sv1 = newSVsv (out_fh); 834 req->sv1 = newSVsv (out_fh);
843 req->int1 = ofd; 835 req->int1 = ofd;
852void 844void
853aio_readahead (SV *fh, off_t offset, size_t length, SV *callback=&PL_sv_undef) 845aio_readahead (SV *fh, off_t offset, size_t length, SV *callback=&PL_sv_undef)
854 PROTOTYPE: $$$;$ 846 PROTOTYPE: $$$;$
855 PPCODE: 847 PPCODE:
856{ 848{
857 int fd = extract_fd (fh, 0); 849 int fd = s_fileno_croak (fh, 0);
858 dREQ; 850 dREQ;
859 851
860 req->type = EIO_READAHEAD; 852 req->type = EIO_READAHEAD;
861 req->sv1 = newSVsv (fh); 853 req->sv1 = newSVsv (fh);
862 req->int1 = fd; 854 req->int1 = fd;
1192 1184
1193int 1185int
1194fadvise (aio_rfd fh, off_t offset, off_t length, IV advice) 1186fadvise (aio_rfd fh, off_t offset, off_t length, IV advice)
1195 PROTOTYPE: $$$$ 1187 PROTOTYPE: $$$$
1196 CODE: 1188 CODE:
1197{
1198 #if _XOPEN_SOURCE >= 600 1189#if _XOPEN_SOURCE >= 600 && !NO_FADVISE
1199 RETVAL = posix_fadvise (fh, offset, length, advice); 1190 RETVAL = posix_fadvise (fh, offset, length, advice);
1200 #else 1191#else
1201 RETVAL = errno = ENOSYS; 1192 RETVAL = errno = ENOSYS;
1202 #endif 1193#endif
1203}
1204 OUTPUT: 1194 OUTPUT:
1205 RETVAL 1195 RETVAL
1206 1196
1207ssize_t 1197ssize_t
1208sendfile (aio_wfd ofh, aio_rfd ifh, off_t offset, size_t count) 1198sendfile (aio_wfd ofh, aio_rfd ifh, off_t offset, size_t count)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines