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.152 by root, Tue Jul 14 00:32:27 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
530} 533}
531 534
532static SV * 535static SV *
533get_cb (SV *cb_sv) 536get_cb (SV *cb_sv)
534{ 537{
535 HV *st; 538 SvGETMAGIC (cb_sv);
536 GV *gvp; 539 return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0;
537 CV *cv;
538
539 if (!SvOK (cb_sv))
540 return 0;
541
542 cv = sv_2cv (cb_sv, &st, &gvp, 0);
543
544 if (!cv)
545 croak ("IO::AIO callback must be undef or a CODE reference");
546
547 return (SV *)cv;
548} 540}
549 541
550#define dREQ \ 542#define dREQ \
551 SV *cb_cv; \ 543 SV *cb_cv; \
552 aio_req req; \ 544 aio_req req; \
568 SPAGAIN; \ 560 SPAGAIN; \
569 \ 561 \
570 if (GIMME_V != G_VOID) \ 562 if (GIMME_V != G_VOID) \
571 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 563 XPUSHs (req_sv (req, AIO_REQ_KLASS));
572 564
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
584MODULE = IO::AIO PACKAGE = IO::AIO 565MODULE = IO::AIO PACKAGE = IO::AIO
585 566
586PROTOTYPES: ENABLE 567PROTOTYPES: ENABLE
587 568
588BOOT: 569BOOT:
701 ALIAS: 682 ALIAS:
702 aio_fsync = EIO_FSYNC 683 aio_fsync = EIO_FSYNC
703 aio_fdatasync = EIO_FDATASYNC 684 aio_fdatasync = EIO_FDATASYNC
704 PPCODE: 685 PPCODE:
705{ 686{
706 int fd = extract_fd (fh, 0); 687 int fd = s_fileno_croak (fh, 0);
707 dREQ; 688 dREQ;
708 689
709 req->type = ix; 690 req->type = ix;
710 req->sv1 = newSVsv (fh); 691 req->sv1 = newSVsv (fh);
711 req->int1 = fd; 692 req->int1 = fd;
716void 697void
717aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef) 698aio_sync_file_range (SV *fh, off_t offset, size_t nbytes, UV flags, SV *callback=&PL_sv_undef)
718 PROTOTYPE: $$$$;$ 699 PROTOTYPE: $$$$;$
719 PPCODE: 700 PPCODE:
720{ 701{
721 int fd = extract_fd (fh, 0); 702 int fd = s_fileno_croak (fh, 0);
722 dREQ; 703 dREQ;
723 704
724 req->type = EIO_SYNC_FILE_RANGE; 705 req->type = EIO_SYNC_FILE_RANGE;
725 req->sv1 = newSVsv (fh); 706 req->sv1 = newSVsv (fh);
726 req->int1 = fd; 707 req->int1 = fd;
735aio_close (SV *fh, SV *callback=&PL_sv_undef) 716aio_close (SV *fh, SV *callback=&PL_sv_undef)
736 PROTOTYPE: $;$ 717 PROTOTYPE: $;$
737 PPCODE: 718 PPCODE:
738{ 719{
739 static int close_pipe = -1; /* dummy fd to close fds via dup2 */ 720 static int close_pipe = -1; /* dummy fd to close fds via dup2 */
740 int fd = extract_fd (fh, 0); 721 int fd = s_fileno_croak (fh, 0);
741 dREQ; 722 dREQ;
742 723
743 if (close_pipe < 0) 724 if (close_pipe < 0)
744 { 725 {
745 int pipefd [2]; 726 int pipefd [2];
767 aio_write = EIO_WRITE 748 aio_write = EIO_WRITE
768 PROTOTYPE: $$$$$;$ 749 PROTOTYPE: $$$$$;$
769 PPCODE: 750 PPCODE:
770{ 751{
771 STRLEN svlen; 752 STRLEN svlen;
772 int fd = extract_fd (fh, ix == EIO_WRITE); 753 int fd = s_fileno_croak (fh, ix == EIO_WRITE);
773 char *svptr = SvPVbyte (data, svlen); 754 char *svptr = SvPVbyte (data, svlen);
774 UV len = SvUV (length); 755 UV len = SvUV (length);
775 756
776 if (dataoffset < 0) 757 if (dataoffset < 0)
777 dataoffset += svlen; 758 dataoffset += svlen;
832void 813void
833aio_sendfile (SV *out_fh, SV *in_fh, off_t in_offset, size_t length, SV *callback=&PL_sv_undef) 814aio_sendfile (SV *out_fh, SV *in_fh, off_t in_offset, size_t length, SV *callback=&PL_sv_undef)
834 PROTOTYPE: $$$$;$ 815 PROTOTYPE: $$$$;$
835 PPCODE: 816 PPCODE:
836{ 817{
837 int ifd = extract_fd (in_fh , 0); 818 int ifd = s_fileno_croak (in_fh , 0);
838 int ofd = extract_fd (out_fh, 0); 819 int ofd = s_fileno_croak (out_fh, 1);
839 dREQ; 820 dREQ;
840 821
841 req->type = EIO_SENDFILE; 822 req->type = EIO_SENDFILE;
842 req->sv1 = newSVsv (out_fh); 823 req->sv1 = newSVsv (out_fh);
843 req->int1 = ofd; 824 req->int1 = ofd;
852void 833void
853aio_readahead (SV *fh, off_t offset, size_t length, SV *callback=&PL_sv_undef) 834aio_readahead (SV *fh, off_t offset, size_t length, SV *callback=&PL_sv_undef)
854 PROTOTYPE: $$$;$ 835 PROTOTYPE: $$$;$
855 PPCODE: 836 PPCODE:
856{ 837{
857 int fd = extract_fd (fh, 0); 838 int fd = s_fileno_croak (fh, 0);
858 dREQ; 839 dREQ;
859 840
860 req->type = EIO_READAHEAD; 841 req->type = EIO_READAHEAD;
861 req->sv1 = newSVsv (fh); 842 req->sv1 = newSVsv (fh);
862 req->int1 = fd; 843 req->int1 = fd;
1192 1173
1193int 1174int
1194fadvise (aio_rfd fh, off_t offset, off_t length, IV advice) 1175fadvise (aio_rfd fh, off_t offset, off_t length, IV advice)
1195 PROTOTYPE: $$$$ 1176 PROTOTYPE: $$$$
1196 CODE: 1177 CODE:
1197{
1198 #if _XOPEN_SOURCE >= 600 1178#if _XOPEN_SOURCE >= 600 && !NO_FADVISE
1199 RETVAL = posix_fadvise (fh, offset, length, advice); 1179 RETVAL = posix_fadvise (fh, offset, length, advice);
1200 #else 1180#else
1201 RETVAL = errno = ENOSYS; 1181 RETVAL = errno = ENOSYS;
1202 #endif 1182#endif
1203}
1204 OUTPUT: 1183 OUTPUT:
1205 RETVAL 1184 RETVAL
1206 1185
1207ssize_t 1186ssize_t
1208sendfile (aio_wfd ofh, aio_rfd ifh, off_t offset, size_t count) 1187sendfile (aio_wfd ofh, aio_rfd ifh, off_t offset, size_t count)
1231 if (GIMME_V != G_VOID) 1210 if (GIMME_V != G_VOID)
1232 XPUSHs (req->callback ? sv_2mortal (newRV_inc (req->callback)) : &PL_sv_undef); 1211 XPUSHs (req->callback ? sv_2mortal (newRV_inc (req->callback)) : &PL_sv_undef);
1233 1212
1234 if (items > 1) 1213 if (items > 1)
1235 { 1214 {
1236 SV *cb_cv = get_cb (callback); 1215 SV *cb_cv =get_cb (callback);
1237 1216
1238 SvREFCNT_dec (req->callback); 1217 SvREFCNT_dec (req->callback);
1239 req->callback = SvREFCNT_inc (cb_cv); 1218 req->callback = SvREFCNT_inc (cb_cv);
1240 } 1219 }
1241} 1220}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines