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.116 by root, Sat May 10 19:25:33 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)
101#include "libeio/eio.c" 104#include "libeio/eio.c"
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
109static SV *on_next_submit;
110static int next_pri = EIO_PRI_DEFAULT;
106static int max_outstanding = 0; 111static int max_outstanding;
107
108static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS;
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);
113static void req_cancel (aio_req req); 116static void req_cancel (aio_req req);
166 FREETMPS; 169 FREETMPS;
167 LEAVE; 170 LEAVE;
168 } 171 }
169} 172}
170 173
174static void req_submit (eio_req *req)
175{
176 eio_submit (req);
177
178 if (on_next_submit)
179 {
180 dSP;
181 SV *cb = sv_2mortal (on_next_submit);
182
183 on_next_submit = 0;
184
185 PUSHMARK (SP);
186 PUTBACK;
187 call_sv (cb, G_DISCARD | G_EVAL);
188 }
189}
190
171static int req_invoke (eio_req *req) 191static int req_invoke (eio_req *req)
172{ 192{
173 dSP; 193 dSP;
174 194
175 if (req->flags & FLAG_SV2_RO_OFF) 195 if (req->flags & FLAG_SV2_RO_OFF)
260 case EIO_BUSY: 280 case EIO_BUSY:
261 break; 281 break;
262 282
263 case EIO_READLINK: 283 case EIO_READLINK:
264 if (req->result > 0) 284 if (req->result > 0)
265 { 285 PUSHs (sv_2mortal (newSVpvn (req->ptr2, req->result)));
266 SvCUR_set (req->sv2, req->result);
267 *SvEND (req->sv2) = 0;
268 PUSHs (req->sv2);
269 }
270 break; 286 break;
271 287
272 case EIO_STAT: 288 case EIO_STAT:
273 case EIO_LSTAT: 289 case EIO_LSTAT:
274 case EIO_FSTAT: 290 case EIO_FSTAT:
427} 443}
428 444
429#define dREQ \ 445#define dREQ \
430 aio_req req; \ 446 aio_req req; \
431 int req_pri = next_pri; \ 447 int req_pri = next_pri; \
432 next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; \ 448 next_pri = EIO_PRI_DEFAULT; \
433 \ 449 \
434 if (SvOK (callback) && !SvROK (callback)) \ 450 if (SvOK (callback) && !SvROK (callback)) \
435 croak ("callback must be undef or of reference type"); \ 451 croak ("callback must be undef or of reference type"); \
436 \ 452 \
437 Newz (0, req, 1, eio_req); \ 453 Newz (0, req, 1, eio_req); \
440 \ 456 \
441 req->callback = newSVsv (callback); \ 457 req->callback = newSVsv (callback); \
442 req->pri = req_pri 458 req->pri = req_pri
443 459
444#define REQ_SEND \ 460#define REQ_SEND \
445 eio_submit (req); \ 461 req_submit (req); \
446 \ 462 \
447 if (GIMME_V != G_VOID) \ 463 if (GIMME_V != G_VOID) \
448 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 464 XPUSHs (req_sv (req, AIO_REQ_KLASS));
449 465
450MODULE = IO::AIO PACKAGE = IO::AIO 466MODULE = IO::AIO PACKAGE = IO::AIO
644 PPCODE: 660 PPCODE:
645{ 661{
646 SV *data; 662 SV *data;
647 dREQ; 663 dREQ;
648 664
649 data = newSV (NAME_MAX);
650 SvPOK_on (data);
651
652 req->type = EIO_READLINK; 665 req->type = EIO_READLINK;
653 req->sv1 = newSVsv (path); 666 req->sv1 = newSVsv (path);
654 req->ptr1 = SvPVbyte_nolen (req->sv1); 667 req->ptr1 = SvPVbyte_nolen (req->sv1);
655 req->sv2 = data;
656 req->ptr2 = SvPVbyte_nolen (data);
657 668
658 REQ_SEND; 669 REQ_SEND;
659} 670}
660 671
661void 672void
699 aio_lstat = EIO_LSTAT 710 aio_lstat = EIO_LSTAT
700 PPCODE: 711 PPCODE:
701{ 712{
702 dREQ; 713 dREQ;
703 714
704 req->ptr2 = malloc (sizeof (EIO_STRUCT_STAT));
705 if (!req->ptr2)
706 {
707 req_destroy (req);
708 croak ("out of memory during aio_stat statdata allocation");
709 }
710
711 req->flags |= EIO_FLAG_PTR2_FREE;
712 req->sv1 = newSVsv (fh_or_path); 715 req->sv1 = newSVsv (fh_or_path);
713 716
714 if (SvPOK (fh_or_path)) 717 if (SvPOK (req->sv1))
715 { 718 {
716 req->type = ix; 719 req->type = ix;
717 req->ptr1 = SvPVbyte_nolen (req->sv1); 720 req->ptr1 = SvPVbyte_nolen (req->sv1);
718 } 721 }
719 else 722 else
733 736
734 req->nv1 = SvOK (atime) ? SvNV (atime) : -1.; 737 req->nv1 = SvOK (atime) ? SvNV (atime) : -1.;
735 req->nv2 = SvOK (mtime) ? SvNV (mtime) : -1.; 738 req->nv2 = SvOK (mtime) ? SvNV (mtime) : -1.;
736 req->sv1 = newSVsv (fh_or_path); 739 req->sv1 = newSVsv (fh_or_path);
737 740
738 if (SvPOK (fh_or_path)) 741 if (SvPOK (req->sv1))
739 { 742 {
740 req->type = EIO_UTIME; 743 req->type = EIO_UTIME;
741 req->ptr1 = SvPVbyte_nolen (req->sv1); 744 req->ptr1 = SvPVbyte_nolen (req->sv1);
742 } 745 }
743 else 746 else
756 dREQ; 759 dREQ;
757 760
758 req->sv1 = newSVsv (fh_or_path); 761 req->sv1 = newSVsv (fh_or_path);
759 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; 762 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1;
760 763
761 if (SvPOK (fh_or_path)) 764 if (SvPOK (req->sv1))
762 { 765 {
763 req->type = EIO_TRUNCATE; 766 req->type = EIO_TRUNCATE;
764 req->ptr1 = SvPVbyte_nolen (req->sv1); 767 req->ptr1 = SvPVbyte_nolen (req->sv1);
765 } 768 }
766 else 769 else
774 777
775void 778void
776aio_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)
777 ALIAS: 780 ALIAS:
778 aio_chmod = EIO_CHMOD 781 aio_chmod = EIO_CHMOD
779 aio_fchmod = EIO_FCHMOD
780 aio_mkdir = EIO_MKDIR 782 aio_mkdir = EIO_MKDIR
781 PPCODE: 783 PPCODE:
782{ 784{
783 dREQ; 785 dREQ;
784 786
785 req->type = ix;
786 req->int2 = mode; 787 req->int2 = mode;
787 req->sv1 = newSVsv (fh_or_path); 788 req->sv1 = newSVsv (fh_or_path);
788 789
789 if (ix == EIO_FCHMOD) 790 if (SvPOK (req->sv1))
790 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path))); 791 {
792 req->type = ix;
793 req->ptr1 = SvPVbyte_nolen (req->sv1);
794 }
791 else 795 else
792 req->ptr1 = SvPVbyte_nolen (req->sv1); 796 {
797 req->type = EIO_FCHMOD;
798 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path)));
799 }
793 800
794 REQ_SEND; 801 REQ_SEND;
795} 802}
796 803
797void 804void
802 809
803 req->int2 = SvOK (uid) ? SvIV (uid) : -1; 810 req->int2 = SvOK (uid) ? SvIV (uid) : -1;
804 req->int3 = SvOK (gid) ? SvIV (gid) : -1; 811 req->int3 = SvOK (gid) ? SvIV (gid) : -1;
805 req->sv1 = newSVsv (fh_or_path); 812 req->sv1 = newSVsv (fh_or_path);
806 813
807 if (SvPOK (fh_or_path)) 814 if (SvPOK (req->sv1))
808 { 815 {
809 req->type = EIO_CHOWN; 816 req->type = EIO_CHOWN;
810 req->ptr1 = SvPVbyte_nolen (req->sv1); 817 req->ptr1 = SvPVbyte_nolen (req->sv1);
811 } 818 }
812 else 819 else
910 917
911int 918int
912aioreq_pri (int pri = 0) 919aioreq_pri (int pri = 0)
913 PROTOTYPE: ;$ 920 PROTOTYPE: ;$
914 CODE: 921 CODE:
915 RETVAL = next_pri - EIO_PRI_BIAS; 922 RETVAL = next_pri;
916 if (items > 0) 923 if (items > 0)
917 { 924 {
918 if (pri < EIO_PRI_MIN) pri = EIO_PRI_MIN; 925 if (pri < EIO_PRI_MIN) pri = EIO_PRI_MIN;
919 if (pri > EIO_PRI_MAX) pri = EIO_PRI_MAX; 926 if (pri > EIO_PRI_MAX) pri = EIO_PRI_MAX;
920 next_pri = pri + EIO_PRI_BIAS; 927 next_pri = pri;
921 } 928 }
922 OUTPUT: 929 OUTPUT:
923 RETVAL 930 RETVAL
924 931
925void 932void
926aioreq_nice (int nice = 0) 933aioreq_nice (int nice = 0)
927 CODE: 934 CODE:
928 nice = next_pri - nice; 935 nice = next_pri - nice;
929 if (nice < EIO_PRI_MIN) nice = EIO_PRI_MIN; 936 if (nice < EIO_PRI_MIN) nice = EIO_PRI_MIN;
930 if (nice > EIO_PRI_MAX) nice = EIO_PRI_MAX; 937 if (nice > EIO_PRI_MAX) nice = EIO_PRI_MAX;
931 next_pri = nice + EIO_PRI_BIAS; 938 next_pri = nice;
932 939
933void 940void
934flush () 941flush ()
935 PROTOTYPE: 942 PROTOTYPE:
936 CODE: 943 CODE:
1003 RETVAL = started; 1010 RETVAL = started;
1004 if (WORDACCESS_UNSAFE) X_UNLOCK (wrklock); 1011 if (WORDACCESS_UNSAFE) X_UNLOCK (wrklock);
1005 OUTPUT: 1012 OUTPUT:
1006 RETVAL 1013 RETVAL
1007 1014
1015void _on_next_submit (SV *cb)
1016 CODE:
1017 SvREFCNT_dec (on_next_submit);
1018 on_next_submit = SvOK (cb) ? newSVsv (cb) : 0;
1019
1008PROTOTYPES: DISABLE 1020PROTOTYPES: DISABLE
1009 1021
1010MODULE = IO::AIO PACKAGE = IO::AIO::REQ 1022MODULE = IO::AIO PACKAGE = IO::AIO::REQ
1011 1023
1012void 1024void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines