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.150 by root, Wed Jul 1 08:11:24 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>
531} 533}
532 534
533static SV * 535static SV *
534get_cb (SV *cb_sv) 536get_cb (SV *cb_sv)
535{ 537{
536 HV *st; 538 SvGETMAGIC (cb_sv);
537 GV *gvp; 539 return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0;
538 CV *cv;
539
540 if (!SvOK (cb_sv))
541 return 0;
542
543 cv = sv_2cv (cb_sv, &st, &gvp, 0);
544
545 if (!cv)
546 croak ("IO::AIO callback must be undef or a CODE reference");
547
548 return (SV *)cv;
549} 540}
550 541
551#define dREQ \ 542#define dREQ \
552 SV *cb_cv; \ 543 SV *cb_cv; \
553 aio_req req; \ 544 aio_req req; \
569 SPAGAIN; \ 560 SPAGAIN; \
570 \ 561 \
571 if (GIMME_V != G_VOID) \ 562 if (GIMME_V != G_VOID) \
572 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 563 XPUSHs (req_sv (req, AIO_REQ_KLASS));
573 564
574static int
575extract_fd (SV *fh, int wr)
576{
577 int fd = PerlIO_fileno (wr ? IoOFP (sv_2io (fh)) : IoIFP (sv_2io (fh)));
578
579 if (fd < 0)
580 croak ("illegal fh argument, either not an OS file or read/write mode mismatch");
581
582 return fd;
583}
584
585MODULE = IO::AIO PACKAGE = IO::AIO 565MODULE = IO::AIO PACKAGE = IO::AIO
586 566
587PROTOTYPES: ENABLE 567PROTOTYPES: ENABLE
588 568
589BOOT: 569BOOT:
702 ALIAS: 682 ALIAS:
703 aio_fsync = EIO_FSYNC 683 aio_fsync = EIO_FSYNC
704 aio_fdatasync = EIO_FDATASYNC 684 aio_fdatasync = EIO_FDATASYNC
705 PPCODE: 685 PPCODE:
706{ 686{
707 int fd = extract_fd (fh, 0); 687 int fd = s_fileno_croak (fh, 0);
708 dREQ; 688 dREQ;
709 689
710 req->type = ix; 690 req->type = ix;
711 req->sv1 = newSVsv (fh); 691 req->sv1 = newSVsv (fh);
712 req->int1 = fd; 692 req->int1 = fd;
717void 697void
718aio_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)
719 PROTOTYPE: $$$$;$ 699 PROTOTYPE: $$$$;$
720 PPCODE: 700 PPCODE:
721{ 701{
722 int fd = extract_fd (fh, 0); 702 int fd = s_fileno_croak (fh, 0);
723 dREQ; 703 dREQ;
724 704
725 req->type = EIO_SYNC_FILE_RANGE; 705 req->type = EIO_SYNC_FILE_RANGE;
726 req->sv1 = newSVsv (fh); 706 req->sv1 = newSVsv (fh);
727 req->int1 = fd; 707 req->int1 = fd;
736aio_close (SV *fh, SV *callback=&PL_sv_undef) 716aio_close (SV *fh, SV *callback=&PL_sv_undef)
737 PROTOTYPE: $;$ 717 PROTOTYPE: $;$
738 PPCODE: 718 PPCODE:
739{ 719{
740 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 */
741 int fd = extract_fd (fh, 0); 721 int fd = s_fileno_croak (fh, 0);
742 dREQ; 722 dREQ;
743 723
744 if (close_pipe < 0) 724 if (close_pipe < 0)
745 { 725 {
746 int pipefd [2]; 726 int pipefd [2];
768 aio_write = EIO_WRITE 748 aio_write = EIO_WRITE
769 PROTOTYPE: $$$$$;$ 749 PROTOTYPE: $$$$$;$
770 PPCODE: 750 PPCODE:
771{ 751{
772 STRLEN svlen; 752 STRLEN svlen;
773 int fd = extract_fd (fh, ix == EIO_WRITE); 753 int fd = s_fileno_croak (fh, ix == EIO_WRITE);
774 char *svptr = SvPVbyte (data, svlen); 754 char *svptr = SvPVbyte (data, svlen);
775 UV len = SvUV (length); 755 UV len = SvUV (length);
776 756
777 if (dataoffset < 0) 757 if (dataoffset < 0)
778 dataoffset += svlen; 758 dataoffset += svlen;
833void 813void
834aio_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)
835 PROTOTYPE: $$$$;$ 815 PROTOTYPE: $$$$;$
836 PPCODE: 816 PPCODE:
837{ 817{
838 int ifd = extract_fd (in_fh , 0); 818 int ifd = s_fileno_croak (in_fh , 0);
839 int ofd = extract_fd (out_fh, 0); 819 int ofd = s_fileno_croak (out_fh, 1);
840 dREQ; 820 dREQ;
841 821
842 req->type = EIO_SENDFILE; 822 req->type = EIO_SENDFILE;
843 req->sv1 = newSVsv (out_fh); 823 req->sv1 = newSVsv (out_fh);
844 req->int1 = ofd; 824 req->int1 = ofd;
853void 833void
854aio_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)
855 PROTOTYPE: $$$;$ 835 PROTOTYPE: $$$;$
856 PPCODE: 836 PPCODE:
857{ 837{
858 int fd = extract_fd (fh, 0); 838 int fd = s_fileno_croak (fh, 0);
859 dREQ; 839 dREQ;
860 840
861 req->type = EIO_READAHEAD; 841 req->type = EIO_READAHEAD;
862 req->sv1 = newSVsv (fh); 842 req->sv1 = newSVsv (fh);
863 req->int1 = fd; 843 req->int1 = fd;
1230 if (GIMME_V != G_VOID) 1210 if (GIMME_V != G_VOID)
1231 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);
1232 1212
1233 if (items > 1) 1213 if (items > 1)
1234 { 1214 {
1235 SV *cb_cv = get_cb (callback); 1215 SV *cb_cv =get_cb (callback);
1236 1216
1237 SvREFCNT_dec (req->callback); 1217 SvREFCNT_dec (req->callback);
1238 req->callback = SvREFCNT_inc (cb_cv); 1218 req->callback = SvREFCNT_inc (cb_cv);
1239 } 1219 }
1240} 1220}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines