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.129 by root, Tue Sep 30 17:03:53 2008 UTC vs.
Revision 1.136 by root, Sun Apr 19 13:15:55 2009 UTC

111 111
112#include "libeio/eio.h" 112#include "libeio/eio.h"
113 113
114static int req_invoke (eio_req *req); 114static int req_invoke (eio_req *req);
115#define EIO_FINISH(req) req_invoke (req) 115#define EIO_FINISH(req) req_invoke (req)
116static void aio_grp_feed (eio_req *grp);
117#define EIO_FEED(req) aio_grp_feed (req)
118static void req_destroy (eio_req *grp); 116static void req_destroy (eio_req *grp);
119#define EIO_DESTROY(req) req_destroy (req) 117#define EIO_DESTROY(req) req_destroy (req)
120 118
121enum { 119enum {
122 FLAG_SV2_RO_OFF = 0x40, /* data was set readonly */ 120 FLAG_SV2_RO_OFF = 0x40, /* data was set readonly */
501 req_submit (req); \ 499 req_submit (req); \
502 SPAGAIN; \ 500 SPAGAIN; \
503 \ 501 \
504 if (GIMME_V != G_VOID) \ 502 if (GIMME_V != G_VOID) \
505 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 503 XPUSHs (req_sv (req, AIO_REQ_KLASS));
506 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
507MODULE = IO::AIO PACKAGE = IO::AIO 516MODULE = IO::AIO PACKAGE = IO::AIO
508 517
509PROTOTYPES: ENABLE 518PROTOTYPES: ENABLE
510 519
511BOOT: 520BOOT:
518 newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT)); 527 newCONSTSUB (stash, "O_CREAT", newSViv (O_CREAT));
519 newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC)); 528 newCONSTSUB (stash, "O_TRUNC", newSViv (O_TRUNC));
520#ifndef _WIN32 529#ifndef _WIN32
521 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); 530 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO));
522#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));
523 536
524 create_respipe (); 537 create_respipe ();
525 538
526 if (eio_init (want_poll, done_poll) < 0) 539 if (eio_init (want_poll, done_poll) < 0)
527 croak ("IO::AIO: unable to initialise eio library"); 540 croak ("IO::AIO: unable to initialise eio library");
588 ALIAS: 601 ALIAS:
589 aio_fsync = EIO_FSYNC 602 aio_fsync = EIO_FSYNC
590 aio_fdatasync = EIO_FDATASYNC 603 aio_fdatasync = EIO_FDATASYNC
591 PPCODE: 604 PPCODE:
592{ 605{
606 int fd = extract_fd (fh, 0);
593 dREQ; 607 dREQ;
594 608
595 req->type = ix; 609 req->type = ix;
596 req->sv1 = newSVsv (fh); 610 req->sv1 = newSVsv (fh);
597 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;
598 630
599 REQ_SEND (req); 631 REQ_SEND (req);
600} 632}
601 633
602void 634void
603aio_close (SV *fh, SV *callback=&PL_sv_undef) 635aio_close (SV *fh, SV *callback=&PL_sv_undef)
604 PROTOTYPE: $;$ 636 PROTOTYPE: $;$
605 PPCODE: 637 PPCODE:
606{ 638{
607 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);
608 dREQ; 641 dREQ;
609 642
610 if (close_pipe < 0) 643 if (close_pipe < 0)
611 { 644 {
612 int pipefd [2]; 645 int pipefd [2];
620 } 653 }
621 654
622 req->type = EIO_DUP2; 655 req->type = EIO_DUP2;
623 req->int1 = close_pipe; 656 req->int1 = close_pipe;
624 req->sv2 = newSVsv (fh); 657 req->sv2 = newSVsv (fh);
625 req->int2 = PerlIO_fileno (IoIFP (sv_2io (fh))); 658 req->int2 = fd;
626 659
627 REQ_SEND (req); 660 REQ_SEND (req);
628} 661}
629 662
630void 663void
636 PPCODE: 669 PPCODE:
637{ 670{
638 STRLEN svlen; 671 STRLEN svlen;
639 char *svptr = SvPVbyte (data, svlen); 672 char *svptr = SvPVbyte (data, svlen);
640 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));
641 678
642 SvUPGRADE (data, SVt_PV); 679 SvUPGRADE (data, SVt_PV);
643 SvPOK_on (data); 680 SvPOK_only (data);
644 681
645 if (dataoffset < 0) 682 if (dataoffset < 0)
646 dataoffset += svlen; 683 dataoffset += svlen;
647 684
648 if (dataoffset < 0 || dataoffset > svlen) 685 if (dataoffset < 0 || dataoffset > svlen)
661 } 698 }
662 699
663 if (len < 0) 700 if (len < 0)
664 croak ("length must not be negative"); 701 croak ("length must not be negative");
665 702
703 fd = extract_fd (fh, ix == EIO_WRITE);
704
666 { 705 {
667 dREQ; 706 dREQ;
668 707
669 req->type = ix; 708 req->type = ix;
670 req->sv1 = newSVsv (fh); 709 req->sv1 = newSVsv (fh);
671 req->int1 = PerlIO_fileno (ix == EIO_READ ? IoIFP (sv_2io (fh)) 710 req->int1 = fd;
672 : IoOFP (sv_2io (fh)));
673 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; 711 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1;
674 req->size = len; 712 req->size = len;
675 req->sv2 = SvREFCNT_inc (data); 713 req->sv2 = SvREFCNT_inc (data);
676 req->ptr2 = (char *)svptr + dataoffset; 714 req->ptr2 = (char *)svptr + dataoffset;
677 req->stroffset = dataoffset; 715 req->stroffset = dataoffset;
704void 742void
705aio_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)
706 PROTOTYPE: $$$$;$ 744 PROTOTYPE: $$$$;$
707 PPCODE: 745 PPCODE:
708{ 746{
747 int ifd = extract_fd (in_fh , 0);
748 int ofd = extract_fd (out_fh, 0);
709 dREQ; 749 dREQ;
710 750
711 req->type = EIO_SENDFILE; 751 req->type = EIO_SENDFILE;
712 req->sv1 = newSVsv (out_fh); 752 req->sv1 = newSVsv (out_fh);
713 req->int1 = PerlIO_fileno (IoIFP (sv_2io (out_fh))); 753 req->int1 = ofd;
714 req->sv2 = newSVsv (in_fh); 754 req->sv2 = newSVsv (in_fh);
715 req->int2 = PerlIO_fileno (IoIFP (sv_2io (in_fh))); 755 req->int2 = ifd;
716 req->offs = SvVAL64 (in_offset); 756 req->offs = SvVAL64 (in_offset);
717 req->size = length; 757 req->size = length;
718 758
719 REQ_SEND; 759 REQ_SEND;
720} 760}
722void 762void
723aio_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)
724 PROTOTYPE: $$$;$ 764 PROTOTYPE: $$$;$
725 PPCODE: 765 PPCODE:
726{ 766{
767 int fd = extract_fd (fh, 0);
727 dREQ; 768 dREQ;
728 769
729 req->type = EIO_READAHEAD; 770 req->type = EIO_READAHEAD;
730 req->sv1 = newSVsv (fh); 771 req->sv1 = newSVsv (fh);
731 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); 772 req->int1 = fd;
732 req->offs = SvVAL64 (offset); 773 req->offs = SvVAL64 (offset);
733 req->size = length; 774 req->size = length;
734 775
735 REQ_SEND; 776 REQ_SEND;
736} 777}
1133void 1174void
1134feed (aio_req grp, SV *callback=&PL_sv_undef) 1175feed (aio_req grp, SV *callback=&PL_sv_undef)
1135 CODE: 1176 CODE:
1136{ 1177{
1137 SvREFCNT_dec (grp->sv2); 1178 SvREFCNT_dec (grp->sv2);
1138 grp->sv2 = newSVsv (callback); 1179 grp->sv2 = newSVsv (callback);
1180 grp->feed = aio_grp_feed;
1139 1181
1140 if (grp->int2 <= 0) 1182 if (grp->int2 <= 0)
1141 grp->int2 = 2; 1183 grp->int2 = 2;
1142 1184
1143 eio_grp_limit (grp, grp->int2); 1185 eio_grp_limit (grp, grp->int2);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines