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.133 by root, Wed Oct 22 18:15:36 2008 UTC vs.
Revision 1.136 by root, Sun Apr 19 13:15:55 2009 UTC

499 req_submit (req); \ 499 req_submit (req); \
500 SPAGAIN; \ 500 SPAGAIN; \
501 \ 501 \
502 if (GIMME_V != G_VOID) \ 502 if (GIMME_V != G_VOID) \
503 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 503 XPUSHs (req_sv (req, AIO_REQ_KLASS));
504 504
505static int
506extract_fd (SV *fh, int wr)
507{
508 int fd = PerlIO_fileno (wr ? IoOFP (sv_2io (fh)) : IoIFP (sv_2io (fh)));
509
510 if (fd < 0)
511 croak ("illegal fh argument, either not an OS file or read/write mode mismatch");
512
513 return fd;
514}
515
505MODULE = IO::AIO PACKAGE = IO::AIO 516MODULE = IO::AIO PACKAGE = IO::AIO
506 517
507PROTOTYPES: ENABLE 518PROTOTYPES: ENABLE
508 519
509BOOT: 520BOOT:
590 ALIAS: 601 ALIAS:
591 aio_fsync = EIO_FSYNC 602 aio_fsync = EIO_FSYNC
592 aio_fdatasync = EIO_FDATASYNC 603 aio_fdatasync = EIO_FDATASYNC
593 PPCODE: 604 PPCODE:
594{ 605{
606 int fd = extract_fd (fh, 0);
595 dREQ; 607 dREQ;
596 608
597 req->type = ix; 609 req->type = ix;
598 req->sv1 = newSVsv (fh); 610 req->sv1 = newSVsv (fh);
599 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 611 req->int1 = fd;
600 612
601 REQ_SEND (req); 613 REQ_SEND (req);
602} 614}
603 615
604void 616void
605aio_sync_file_range (SV *fh, SV *offset, SV *nbytes, IV flags, SV *callback=&PL_sv_undef) 617aio_sync_file_range (SV *fh, SV *offset, SV *nbytes, IV flags, SV *callback=&PL_sv_undef)
606 PROTOTYPE: $$$$;$ 618 PROTOTYPE: $$$$;$
607 PPCODE: 619 PPCODE:
608{ 620{
621 int fd = extract_fd (fh, 0);
609 dREQ; 622 dREQ;
610 623
611 req->type = EIO_SYNC_FILE_RANGE; 624 req->type = EIO_SYNC_FILE_RANGE;
612 req->sv1 = newSVsv (fh); 625 req->sv1 = newSVsv (fh);
613 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 626 req->int1 = fd;
614 req->offs = SvVAL64 (offset); 627 req->offs = SvVAL64 (offset);
615 req->size = SvVAL64 (nbytes); 628 req->size = SvVAL64 (nbytes);
616 req->int2 = flags; 629 req->int2 = flags;
617 630
618 REQ_SEND (req); 631 REQ_SEND (req);
622aio_close (SV *fh, SV *callback=&PL_sv_undef) 635aio_close (SV *fh, SV *callback=&PL_sv_undef)
623 PROTOTYPE: $;$ 636 PROTOTYPE: $;$
624 PPCODE: 637 PPCODE:
625{ 638{
626 static int close_pipe = -1; /* dummy fd to close fds via dup2 */ 639 static int close_pipe = -1; /* dummy fd to close fds via dup2 */
640 int fd = extract_fd (fh, 0);
627 dREQ; 641 dREQ;
628 642
629 if (close_pipe < 0) 643 if (close_pipe < 0)
630 { 644 {
631 int pipefd [2]; 645 int pipefd [2];
639 } 653 }
640 654
641 req->type = EIO_DUP2; 655 req->type = EIO_DUP2;
642 req->int1 = close_pipe; 656 req->int1 = close_pipe;
643 req->sv2 = newSVsv (fh); 657 req->sv2 = newSVsv (fh);
644 req->int2 = PerlIO_fileno (IoIFP (sv_2io (fh))); 658 req->int2 = fd;
645 659
646 REQ_SEND (req); 660 REQ_SEND (req);
647} 661}
648 662
649void 663void
655 PPCODE: 669 PPCODE:
656{ 670{
657 STRLEN svlen; 671 STRLEN svlen;
658 char *svptr = SvPVbyte (data, svlen); 672 char *svptr = SvPVbyte (data, svlen);
659 UV len = SvUV (length); 673 UV len = SvUV (length);
674 int fd;
675
676 if (SvTYPE (data) > SVt_PVMG)
677 croak ("illegal data argument '%s', must be plain scalar string", SvPV_nolen (data));
660 678
661 SvUPGRADE (data, SVt_PV); 679 SvUPGRADE (data, SVt_PV);
662 SvPOK_on (data); 680 SvPOK_only (data);
663 681
664 if (dataoffset < 0) 682 if (dataoffset < 0)
665 dataoffset += svlen; 683 dataoffset += svlen;
666 684
667 if (dataoffset < 0 || dataoffset > svlen) 685 if (dataoffset < 0 || dataoffset > svlen)
680 } 698 }
681 699
682 if (len < 0) 700 if (len < 0)
683 croak ("length must not be negative"); 701 croak ("length must not be negative");
684 702
703 fd = extract_fd (fh, ix == EIO_WRITE);
704
685 { 705 {
686 dREQ; 706 dREQ;
687 707
688 req->type = ix; 708 req->type = ix;
689 req->sv1 = newSVsv (fh); 709 req->sv1 = newSVsv (fh);
690 req->int1 = PerlIO_fileno (ix == EIO_READ ? IoIFP (sv_2io (fh)) 710 req->int1 = fd;
691 : IoOFP (sv_2io (fh)));
692 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; 711 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1;
693 req->size = len; 712 req->size = len;
694 req->sv2 = SvREFCNT_inc (data); 713 req->sv2 = SvREFCNT_inc (data);
695 req->ptr2 = (char *)svptr + dataoffset; 714 req->ptr2 = (char *)svptr + dataoffset;
696 req->stroffset = dataoffset; 715 req->stroffset = dataoffset;
723void 742void
724aio_sendfile (SV *out_fh, SV *in_fh, SV *in_offset, UV length, SV *callback=&PL_sv_undef) 743aio_sendfile (SV *out_fh, SV *in_fh, SV *in_offset, UV length, SV *callback=&PL_sv_undef)
725 PROTOTYPE: $$$$;$ 744 PROTOTYPE: $$$$;$
726 PPCODE: 745 PPCODE:
727{ 746{
747 int ifd = extract_fd (in_fh , 0);
748 int ofd = extract_fd (out_fh, 0);
728 dREQ; 749 dREQ;
729 750
730 req->type = EIO_SENDFILE; 751 req->type = EIO_SENDFILE;
731 req->sv1 = newSVsv (out_fh); 752 req->sv1 = newSVsv (out_fh);
732 req->int1 = PerlIO_fileno (IoIFP (sv_2io (out_fh))); 753 req->int1 = ofd;
733 req->sv2 = newSVsv (in_fh); 754 req->sv2 = newSVsv (in_fh);
734 req->int2 = PerlIO_fileno (IoIFP (sv_2io (in_fh))); 755 req->int2 = ifd;
735 req->offs = SvVAL64 (in_offset); 756 req->offs = SvVAL64 (in_offset);
736 req->size = length; 757 req->size = length;
737 758
738 REQ_SEND; 759 REQ_SEND;
739} 760}
741void 762void
742aio_readahead (SV *fh, SV *offset, IV length, SV *callback=&PL_sv_undef) 763aio_readahead (SV *fh, SV *offset, IV length, SV *callback=&PL_sv_undef)
743 PROTOTYPE: $$$;$ 764 PROTOTYPE: $$$;$
744 PPCODE: 765 PPCODE:
745{ 766{
767 int fd = extract_fd (fh, 0);
746 dREQ; 768 dREQ;
747 769
748 req->type = EIO_READAHEAD; 770 req->type = EIO_READAHEAD;
749 req->sv1 = newSVsv (fh); 771 req->sv1 = newSVsv (fh);
750 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 772 req->int1 = fd;
751 req->offs = SvVAL64 (offset); 773 req->offs = SvVAL64 (offset);
752 req->size = length; 774 req->size = length;
753 775
754 REQ_SEND; 776 REQ_SEND;
755} 777}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines