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.135 by root, Sun Apr 19 13:06:15 2009 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
684 } 698 }
685 699
686 if (len < 0) 700 if (len < 0)
687 croak ("length must not be negative"); 701 croak ("length must not be negative");
688 702
689 fd = PerlIO_fileno (ix == EIO_READ ? IoIFP (sv_2io (fh)) 703 fd = extract_fd (fh, ix == EIO_WRITE);
690 : IoOFP (sv_2io (fh)));
691
692 if (fd < 0)
693 croak ("illegal fh argument, either not an OS file or read/write mode mismatch");
694 704
695 { 705 {
696 dREQ; 706 dREQ;
697 707
698 req->type = ix; 708 req->type = ix;
732void 742void
733aio_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)
734 PROTOTYPE: $$$$;$ 744 PROTOTYPE: $$$$;$
735 PPCODE: 745 PPCODE:
736{ 746{
747 int ifd = extract_fd (in_fh , 0);
748 int ofd = extract_fd (out_fh, 0);
737 dREQ; 749 dREQ;
738 750
739 req->type = EIO_SENDFILE; 751 req->type = EIO_SENDFILE;
740 req->sv1 = newSVsv (out_fh); 752 req->sv1 = newSVsv (out_fh);
741 req->int1 = PerlIO_fileno (IoIFP (sv_2io (out_fh))); 753 req->int1 = ofd;
742 req->sv2 = newSVsv (in_fh); 754 req->sv2 = newSVsv (in_fh);
743 req->int2 = PerlIO_fileno (IoIFP (sv_2io (in_fh))); 755 req->int2 = ifd;
744 req->offs = SvVAL64 (in_offset); 756 req->offs = SvVAL64 (in_offset);
745 req->size = length; 757 req->size = length;
746 758
747 REQ_SEND; 759 REQ_SEND;
748} 760}
750void 762void
751aio_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)
752 PROTOTYPE: $$$;$ 764 PROTOTYPE: $$$;$
753 PPCODE: 765 PPCODE:
754{ 766{
767 int fd = extract_fd (fh, 0);
755 dREQ; 768 dREQ;
756 769
757 req->type = EIO_READAHEAD; 770 req->type = EIO_READAHEAD;
758 req->sv1 = newSVsv (fh); 771 req->sv1 = newSVsv (fh);
759 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 772 req->int1 = fd;
760 req->offs = SvVAL64 (offset); 773 req->offs = SvVAL64 (offset);
761 req->size = length; 774 req->size = length;
762 775
763 REQ_SEND; 776 REQ_SEND;
764} 777}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines