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.132 by root, Mon Oct 13 10:38:17 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:
516 newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT)); 527 newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT));
517 newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC)); 528 newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC));
518#ifndef _WIN32 529#ifndef _WIN32
519 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); 530 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO));
520#endif 531#endif
532 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO));
533 newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_BEFORE", newSViv (EIO_SYNC_FILE_RANGE_WAIT_BEFORE));
534 newCONSTSUB (stash, "SYNC_FILE_RANGE_WRITE" , newSViv (EIO_SYNC_FILE_RANGE_WRITE));
535 newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_AFTER" , newSViv (EIO_SYNC_FILE_RANGE_WAIT_AFTER));
521 536
522 create_respipe (); 537 create_respipe ();
523 538
524 if (eio_init (want_poll, done_poll) < 0) 539 if (eio_init (want_poll, done_poll) < 0)
525 croak ("IO::AIO: unable to initialise eio library"); 540 croak ("IO::AIO: unable to initialise eio library");
586 ALIAS: 601 ALIAS:
587 aio_fsync = EIO_FSYNC 602 aio_fsync = EIO_FSYNC
588 aio_fdatasync = EIO_FDATASYNC 603 aio_fdatasync = EIO_FDATASYNC
589 PPCODE: 604 PPCODE:
590{ 605{
606 int fd = extract_fd (fh, 0);
591 dREQ; 607 dREQ;
592 608
593 req->type = ix; 609 req->type = ix;
594 req->sv1 = newSVsv (fh); 610 req->sv1 = newSVsv (fh);
595 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 611 req->int1 = fd;
612
613 REQ_SEND (req);
614}
615
616void
617aio_sync_file_range (SV *fh, SV *offset, SV *nbytes, IV flags, SV *callback=&PL_sv_undef)
618 PROTOTYPE: $$$$;$
619 PPCODE:
620{
621 int fd = extract_fd (fh, 0);
622 dREQ;
623
624 req->type = EIO_SYNC_FILE_RANGE;
625 req->sv1 = newSVsv (fh);
626 req->int1 = fd;
627 req->offs = SvVAL64 (offset);
628 req->size = SvVAL64 (nbytes);
629 req->int2 = flags;
596 630
597 REQ_SEND (req); 631 REQ_SEND (req);
598} 632}
599 633
600void 634void
601aio_close (SV *fh, SV *callback=&PL_sv_undef) 635aio_close (SV *fh, SV *callback=&PL_sv_undef)
602 PROTOTYPE: $;$ 636 PROTOTYPE: $;$
603 PPCODE: 637 PPCODE:
604{ 638{
605 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);
606 dREQ; 641 dREQ;
607 642
608 if (close_pipe < 0) 643 if (close_pipe < 0)
609 { 644 {
610 int pipefd [2]; 645 int pipefd [2];
618 } 653 }
619 654
620 req->type = EIO_DUP2; 655 req->type = EIO_DUP2;
621 req->int1 = close_pipe; 656 req->int1 = close_pipe;
622 req->sv2 = newSVsv (fh); 657 req->sv2 = newSVsv (fh);
623 req->int2 = PerlIO_fileno (IoIFP (sv_2io (fh))); 658 req->int2 = fd;
624 659
625 REQ_SEND (req); 660 REQ_SEND (req);
626} 661}
627 662
628void 663void
634 PPCODE: 669 PPCODE:
635{ 670{
636 STRLEN svlen; 671 STRLEN svlen;
637 char *svptr = SvPVbyte (data, svlen); 672 char *svptr = SvPVbyte (data, svlen);
638 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));
639 678
640 SvUPGRADE (data, SVt_PV); 679 SvUPGRADE (data, SVt_PV);
641 SvPOK_on (data); 680 SvPOK_only (data);
642 681
643 if (dataoffset < 0) 682 if (dataoffset < 0)
644 dataoffset += svlen; 683 dataoffset += svlen;
645 684
646 if (dataoffset < 0 || dataoffset > svlen) 685 if (dataoffset < 0 || dataoffset > svlen)
659 } 698 }
660 699
661 if (len < 0) 700 if (len < 0)
662 croak ("length must not be negative"); 701 croak ("length must not be negative");
663 702
703 fd = extract_fd (fh, ix == EIO_WRITE);
704
664 { 705 {
665 dREQ; 706 dREQ;
666 707
667 req->type = ix; 708 req->type = ix;
668 req->sv1 = newSVsv (fh); 709 req->sv1 = newSVsv (fh);
669 req->int1 = PerlIO_fileno (ix == EIO_READ ? IoIFP (sv_2io (fh)) 710 req->int1 = fd;
670 : IoOFP (sv_2io (fh)));
671 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; 711 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1;
672 req->size = len; 712 req->size = len;
673 req->sv2 = SvREFCNT_inc (data); 713 req->sv2 = SvREFCNT_inc (data);
674 req->ptr2 = (char *)svptr + dataoffset; 714 req->ptr2 = (char *)svptr + dataoffset;
675 req->stroffset = dataoffset; 715 req->stroffset = dataoffset;
702void 742void
703aio_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)
704 PROTOTYPE: $$$$;$ 744 PROTOTYPE: $$$$;$
705 PPCODE: 745 PPCODE:
706{ 746{
747 int ifd = extract_fd (in_fh , 0);
748 int ofd = extract_fd (out_fh, 0);
707 dREQ; 749 dREQ;
708 750
709 req->type = EIO_SENDFILE; 751 req->type = EIO_SENDFILE;
710 req->sv1 = newSVsv (out_fh); 752 req->sv1 = newSVsv (out_fh);
711 req->int1 = PerlIO_fileno (IoIFP (sv_2io (out_fh))); 753 req->int1 = ofd;
712 req->sv2 = newSVsv (in_fh); 754 req->sv2 = newSVsv (in_fh);
713 req->int2 = PerlIO_fileno (IoIFP (sv_2io (in_fh))); 755 req->int2 = ifd;
714 req->offs = SvVAL64 (in_offset); 756 req->offs = SvVAL64 (in_offset);
715 req->size = length; 757 req->size = length;
716 758
717 REQ_SEND; 759 REQ_SEND;
718} 760}
720void 762void
721aio_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)
722 PROTOTYPE: $$$;$ 764 PROTOTYPE: $$$;$
723 PPCODE: 765 PPCODE:
724{ 766{
767 int fd = extract_fd (fh, 0);
725 dREQ; 768 dREQ;
726 769
727 req->type = EIO_READAHEAD; 770 req->type = EIO_READAHEAD;
728 req->sv1 = newSVsv (fh); 771 req->sv1 = newSVsv (fh);
729 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 772 req->int1 = fd;
730 req->offs = SvVAL64 (offset); 773 req->offs = SvVAL64 (offset);
731 req->size = length; 774 req->size = length;
732 775
733 REQ_SEND; 776 REQ_SEND;
734} 777}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines