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.117 by root, Sat May 10 20:02:09 2008 UTC vs.
Revision 1.121 by root, Tue May 13 18:50:27 2008 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines