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.118 by root, Sun May 11 00:01:03 2008 UTC vs.
Revision 1.121 by root, Tue May 13 18:50:27 2008 UTC

80typedef SV SV8; /* byte-sv, used for argument-checking */ 80typedef SV SV8; /* byte-sv, used for argument-checking */
81 81
82#define AIO_REQ_KLASS "IO::AIO::REQ" 82#define AIO_REQ_KLASS "IO::AIO::REQ"
83#define AIO_GRP_KLASS "IO::AIO::GRP" 83#define AIO_GRP_KLASS "IO::AIO::GRP"
84 84
85#define EIO_COMMON \ 85#define EIO_REQ_MEMBERS \
86 SV *callback; \ 86 SV *callback; \
87 SV *sv1, *sv2; \ 87 SV *sv1, *sv2; \
88 STRLEN stroffset; \ 88 STRLEN stroffset; \
89 SV *self 89 SV *self;
90 90
91#include "libeio/eio.h" 91#include "libeio/eio.h"
92 92
93static int req_invoke (eio_req *req); 93static int req_invoke (eio_req *req);
94#define EIO_FINISH(req) req_invoke (req) 94#define EIO_FINISH(req) req_invoke (req)
105 105
106typedef eio_req *aio_req; 106typedef eio_req *aio_req;
107typedef eio_req *aio_req_ornot; 107typedef eio_req *aio_req_ornot;
108 108
109static SV *on_next_submit; 109static SV *on_next_submit;
110static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; 110static int next_pri = EIO_PRI_DEFAULT;
111static int max_outstanding; 111static int max_outstanding;
112 112
113static int respipe_osf [2], respipe [2] = { -1, -1 }; 113static int respipe_osf [2], respipe [2] = { -1, -1 };
114 114
115static void req_destroy (aio_req req); 115static void req_destroy (aio_req req);
280 case EIO_BUSY: 280 case EIO_BUSY:
281 break; 281 break;
282 282
283 case EIO_READLINK: 283 case EIO_READLINK:
284 if (req->result > 0) 284 if (req->result > 0)
285 { 285 PUSHs (sv_2mortal (newSVpvn (req->ptr2, req->result)));
286 SvCUR_set (req->sv2, req->result);
287 *SvEND (req->sv2) = 0;
288 PUSHs (req->sv2);
289 }
290 break; 286 break;
291 287
292 case EIO_STAT: 288 case EIO_STAT:
293 case EIO_LSTAT: 289 case EIO_LSTAT:
294 case EIO_FSTAT: 290 case EIO_FSTAT:
447} 443}
448 444
449#define dREQ \ 445#define dREQ \
450 aio_req req; \ 446 aio_req req; \
451 int req_pri = next_pri; \ 447 int req_pri = next_pri; \
452 next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; \ 448 next_pri = EIO_PRI_DEFAULT; \
453 \ 449 \
454 if (SvOK (callback) && !SvROK (callback)) \ 450 if (SvOK (callback) && !SvROK (callback)) \
455 croak ("callback must be undef or of reference type"); \ 451 croak ("callback must be undef or of reference type"); \
456 \ 452 \
457 Newz (0, req, 1, eio_req); \ 453 Newz (0, req, 1, eio_req); \
664 PPCODE: 660 PPCODE:
665{ 661{
666 SV *data; 662 SV *data;
667 dREQ; 663 dREQ;
668 664
669 data = newSV (NAME_MAX);
670 SvPOK_on (data);
671
672 req->type = EIO_READLINK; 665 req->type = EIO_READLINK;
673 req->sv1 = newSVsv (path); 666 req->sv1 = newSVsv (path);
674 req->ptr1 = SvPVbyte_nolen (req->sv1); 667 req->ptr1 = SvPVbyte_nolen (req->sv1);
675 req->sv2 = data;
676 req->ptr2 = SvPVbyte_nolen (data);
677 668
678 REQ_SEND; 669 REQ_SEND;
679} 670}
680 671
681void 672void
719 aio_lstat = EIO_LSTAT 710 aio_lstat = EIO_LSTAT
720 PPCODE: 711 PPCODE:
721{ 712{
722 dREQ; 713 dREQ;
723 714
724 req->ptr2 = malloc (sizeof (EIO_STRUCT_STAT));
725 if (!req->ptr2)
726 {
727 req_destroy (req);
728 croak ("out of memory during aio_stat statdata allocation");
729 }
730
731 req->flags |= EIO_FLAG_PTR2_FREE;
732 req->sv1 = newSVsv (fh_or_path); 715 req->sv1 = newSVsv (fh_or_path);
733 716
734 if (SvPOK (fh_or_path)) 717 if (SvPOK (req->sv1))
735 { 718 {
736 req->type = ix; 719 req->type = ix;
737 req->ptr1 = SvPVbyte_nolen (req->sv1); 720 req->ptr1 = SvPVbyte_nolen (req->sv1);
738 } 721 }
739 else 722 else
753 736
754 req->nv1 = SvOK (atime) ? SvNV (atime) : -1.; 737 req->nv1 = SvOK (atime) ? SvNV (atime) : -1.;
755 req->nv2 = SvOK (mtime) ? SvNV (mtime) : -1.; 738 req->nv2 = SvOK (mtime) ? SvNV (mtime) : -1.;
756 req->sv1 = newSVsv (fh_or_path); 739 req->sv1 = newSVsv (fh_or_path);
757 740
758 if (SvPOK (fh_or_path)) 741 if (SvPOK (req->sv1))
759 { 742 {
760 req->type = EIO_UTIME; 743 req->type = EIO_UTIME;
761 req->ptr1 = SvPVbyte_nolen (req->sv1); 744 req->ptr1 = SvPVbyte_nolen (req->sv1);
762 } 745 }
763 else 746 else
776 dREQ; 759 dREQ;
777 760
778 req->sv1 = newSVsv (fh_or_path); 761 req->sv1 = newSVsv (fh_or_path);
779 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; 762 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1;
780 763
781 if (SvPOK (fh_or_path)) 764 if (SvPOK (req->sv1))
782 { 765 {
783 req->type = EIO_TRUNCATE; 766 req->type = EIO_TRUNCATE;
784 req->ptr1 = SvPVbyte_nolen (req->sv1); 767 req->ptr1 = SvPVbyte_nolen (req->sv1);
785 } 768 }
786 else 769 else
794 777
795void 778void
796aio_chmod (SV8 *fh_or_path, int mode, SV *callback=&PL_sv_undef) 779aio_chmod (SV8 *fh_or_path, int mode, SV *callback=&PL_sv_undef)
797 ALIAS: 780 ALIAS:
798 aio_chmod = EIO_CHMOD 781 aio_chmod = EIO_CHMOD
799 aio_fchmod = EIO_FCHMOD
800 aio_mkdir = EIO_MKDIR 782 aio_mkdir = EIO_MKDIR
801 PPCODE: 783 PPCODE:
802{ 784{
803 dREQ; 785 dREQ;
804 786
805 req->type = ix;
806 req->int2 = mode; 787 req->int2 = mode;
807 req->sv1 = newSVsv (fh_or_path); 788 req->sv1 = newSVsv (fh_or_path);
808 789
809 if (ix == EIO_FCHMOD) 790 if (SvPOK (req->sv1))
810 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path))); 791 {
792 req->type = ix;
793 req->ptr1 = SvPVbyte_nolen (req->sv1);
794 }
811 else 795 else
812 req->ptr1 = SvPVbyte_nolen (req->sv1); 796 {
797 req->type = EIO_FCHMOD;
798 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path)));
799 }
813 800
814 REQ_SEND; 801 REQ_SEND;
815} 802}
816 803
817void 804void
822 809
823 req->int2 = SvOK (uid) ? SvIV (uid) : -1; 810 req->int2 = SvOK (uid) ? SvIV (uid) : -1;
824 req->int3 = SvOK (gid) ? SvIV (gid) : -1; 811 req->int3 = SvOK (gid) ? SvIV (gid) : -1;
825 req->sv1 = newSVsv (fh_or_path); 812 req->sv1 = newSVsv (fh_or_path);
826 813
827 if (SvPOK (fh_or_path)) 814 if (SvPOK (req->sv1))
828 { 815 {
829 req->type = EIO_CHOWN; 816 req->type = EIO_CHOWN;
830 req->ptr1 = SvPVbyte_nolen (req->sv1); 817 req->ptr1 = SvPVbyte_nolen (req->sv1);
831 } 818 }
832 else 819 else
930 917
931int 918int
932aioreq_pri (int pri = 0) 919aioreq_pri (int pri = 0)
933 PROTOTYPE: ;$ 920 PROTOTYPE: ;$
934 CODE: 921 CODE:
935 RETVAL = next_pri - EIO_PRI_BIAS; 922 RETVAL = next_pri;
936 if (items > 0) 923 if (items > 0)
937 { 924 {
938 if (pri < EIO_PRI_MIN) pri = EIO_PRI_MIN; 925 if (pri < EIO_PRI_MIN) pri = EIO_PRI_MIN;
939 if (pri > EIO_PRI_MAX) pri = EIO_PRI_MAX; 926 if (pri > EIO_PRI_MAX) pri = EIO_PRI_MAX;
940 next_pri = pri + EIO_PRI_BIAS; 927 next_pri = pri;
941 } 928 }
942 OUTPUT: 929 OUTPUT:
943 RETVAL 930 RETVAL
944 931
945void 932void
946aioreq_nice (int nice = 0) 933aioreq_nice (int nice = 0)
947 CODE: 934 CODE:
948 nice = next_pri - nice; 935 nice = next_pri - nice;
949 if (nice < EIO_PRI_MIN) nice = EIO_PRI_MIN; 936 if (nice < EIO_PRI_MIN) nice = EIO_PRI_MIN;
950 if (nice > EIO_PRI_MAX) nice = EIO_PRI_MAX; 937 if (nice > EIO_PRI_MAX) nice = EIO_PRI_MAX;
951 next_pri = nice + EIO_PRI_BIAS; 938 next_pri = nice;
952 939
953void 940void
954flush () 941flush ()
955 PROTOTYPE: 942 PROTOTYPE:
956 CODE: 943 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines