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.115 by root, Sat May 10 18:06:41 2008 UTC vs.
Revision 1.119 by root, Sun May 11 19:11:05 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
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
106static unsigned int max_outstanding = 0x7fffffff; 109static SV *on_next_submit;
107
108static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS; 110static int next_pri = EIO_DEFAULT_PRI + EIO_PRI_BIAS;
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);
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:
405 } 421 }
406} 422}
407 423
408static int poll_cb (void) 424static int poll_cb (void)
409{ 425{
426 int res;
427
428 do
429 {
410 int res = eio_poll (); 430 res = eio_poll ();
411 431
412 if (res > 0) 432 if (res > 0)
413 croak (0); 433 croak (0);
434 }
435 while (max_outstanding && max_outstanding <= eio_nreqs ());
414 436
415 return res; 437 return res;
438}
439
440static void atfork_child (void)
441{
442 create_respipe ();
416} 443}
417 444
418#define dREQ \ 445#define dREQ \
419 aio_req req; \ 446 aio_req req; \
420 int req_pri = next_pri; \ 447 int req_pri = next_pri; \
429 \ 456 \
430 req->callback = newSVsv (callback); \ 457 req->callback = newSVsv (callback); \
431 req->pri = req_pri 458 req->pri = req_pri
432 459
433#define REQ_SEND \ 460#define REQ_SEND \
434 eio_submit (req); \ 461 req_submit (req); \
435 \ 462 \
436 if (GIMME_V != G_VOID) \ 463 if (GIMME_V != G_VOID) \
437 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 464 XPUSHs (req_sv (req, AIO_REQ_KLASS));
438 465
439MODULE = IO::AIO PACKAGE = IO::AIO 466MODULE = IO::AIO PACKAGE = IO::AIO
464 491
465 create_respipe (); 492 create_respipe ();
466 493
467 if (eio_init (want_poll, done_poll) < 0) 494 if (eio_init (want_poll, done_poll) < 0)
468 croak ("IO::AIO: unable to initialise eio library"); 495 croak ("IO::AIO: unable to initialise eio library");
496
497 /* atfork child called in fifo order, so before eio's handler */
498 X_THREAD_ATFORK (0, 0, atfork_child);
469} 499}
470 500
471void 501void
472max_poll_reqs (int nreqs) 502max_poll_reqs (int nreqs)
473 PROTOTYPE: $ 503 PROTOTYPE: $
630 PPCODE: 660 PPCODE:
631{ 661{
632 SV *data; 662 SV *data;
633 dREQ; 663 dREQ;
634 664
635 data = newSV (NAME_MAX);
636 SvPOK_on (data);
637
638 req->type = EIO_READLINK; 665 req->type = EIO_READLINK;
639 req->sv1 = newSVsv (path); 666 req->sv1 = newSVsv (path);
640 req->ptr1 = SvPVbyte_nolen (req->sv1); 667 req->ptr1 = SvPVbyte_nolen (req->sv1);
641 req->sv2 = data;
642 req->ptr2 = SvPVbyte_nolen (data);
643 668
644 REQ_SEND; 669 REQ_SEND;
645} 670}
646 671
647void 672void
685 aio_lstat = EIO_LSTAT 710 aio_lstat = EIO_LSTAT
686 PPCODE: 711 PPCODE:
687{ 712{
688 dREQ; 713 dREQ;
689 714
690 req->ptr2 = malloc (sizeof (EIO_STRUCT_STAT));
691 if (!req->ptr2)
692 {
693 req_destroy (req);
694 croak ("out of memory during aio_stat statdata allocation");
695 }
696
697 req->flags |= EIO_FLAG_PTR2_FREE;
698 req->sv1 = newSVsv (fh_or_path); 715 req->sv1 = newSVsv (fh_or_path);
699 716
700 if (SvPOK (fh_or_path)) 717 if (SvPOK (req->sv1))
701 { 718 {
702 req->type = ix; 719 req->type = ix;
703 req->ptr1 = SvPVbyte_nolen (req->sv1); 720 req->ptr1 = SvPVbyte_nolen (req->sv1);
704 } 721 }
705 else 722 else
719 736
720 req->nv1 = SvOK (atime) ? SvNV (atime) : -1.; 737 req->nv1 = SvOK (atime) ? SvNV (atime) : -1.;
721 req->nv2 = SvOK (mtime) ? SvNV (mtime) : -1.; 738 req->nv2 = SvOK (mtime) ? SvNV (mtime) : -1.;
722 req->sv1 = newSVsv (fh_or_path); 739 req->sv1 = newSVsv (fh_or_path);
723 740
724 if (SvPOK (fh_or_path)) 741 if (SvPOK (req->sv1))
725 { 742 {
726 req->type = EIO_UTIME; 743 req->type = EIO_UTIME;
727 req->ptr1 = SvPVbyte_nolen (req->sv1); 744 req->ptr1 = SvPVbyte_nolen (req->sv1);
728 } 745 }
729 else 746 else
742 dREQ; 759 dREQ;
743 760
744 req->sv1 = newSVsv (fh_or_path); 761 req->sv1 = newSVsv (fh_or_path);
745 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; 762 req->offs = SvOK (offset) ? SvVAL64 (offset) : -1;
746 763
747 if (SvPOK (fh_or_path)) 764 if (SvPOK (req->sv1))
748 { 765 {
749 req->type = EIO_TRUNCATE; 766 req->type = EIO_TRUNCATE;
750 req->ptr1 = SvPVbyte_nolen (req->sv1); 767 req->ptr1 = SvPVbyte_nolen (req->sv1);
751 } 768 }
752 else 769 else
760 777
761void 778void
762aio_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)
763 ALIAS: 780 ALIAS:
764 aio_chmod = EIO_CHMOD 781 aio_chmod = EIO_CHMOD
765 aio_fchmod = EIO_FCHMOD
766 aio_mkdir = EIO_MKDIR 782 aio_mkdir = EIO_MKDIR
767 PPCODE: 783 PPCODE:
768{ 784{
769 dREQ; 785 dREQ;
770 786
771 req->type = ix;
772 req->int2 = mode; 787 req->int2 = mode;
773 req->sv1 = newSVsv (fh_or_path); 788 req->sv1 = newSVsv (fh_or_path);
774 789
775 if (ix == EIO_FCHMOD) 790 if (SvPOK (req->sv1))
791 {
792 req->type = EIO_FCHMOD;
776 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path))); 793 req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh_or_path)));
794 }
777 else 795 else
796 {
797 req->type = ix;
778 req->ptr1 = SvPVbyte_nolen (req->sv1); 798 req->ptr1 = SvPVbyte_nolen (req->sv1);
799 }
779 800
780 REQ_SEND; 801 REQ_SEND;
781} 802}
782 803
783void 804void
788 809
789 req->int2 = SvOK (uid) ? SvIV (uid) : -1; 810 req->int2 = SvOK (uid) ? SvIV (uid) : -1;
790 req->int3 = SvOK (gid) ? SvIV (gid) : -1; 811 req->int3 = SvOK (gid) ? SvIV (gid) : -1;
791 req->sv1 = newSVsv (fh_or_path); 812 req->sv1 = newSVsv (fh_or_path);
792 813
793 if (SvPOK (fh_or_path)) 814 if (SvPOK (req->sv1))
794 { 815 {
795 req->type = EIO_CHOWN; 816 req->type = EIO_CHOWN;
796 req->ptr1 = SvPVbyte_nolen (req->sv1); 817 req->ptr1 = SvPVbyte_nolen (req->sv1);
797 } 818 }
798 else 819 else
918 939
919void 940void
920flush () 941flush ()
921 PROTOTYPE: 942 PROTOTYPE:
922 CODE: 943 CODE:
923 while (nreqs) 944 while (eio_nreqs ())
924 { 945 {
925 poll_wait (); 946 poll_wait ();
926 poll_cb (); 947 poll_cb ();
927 } 948 }
928 949
989 RETVAL = started; 1010 RETVAL = started;
990 if (WORDACCESS_UNSAFE) X_UNLOCK (wrklock); 1011 if (WORDACCESS_UNSAFE) X_UNLOCK (wrklock);
991 OUTPUT: 1012 OUTPUT:
992 RETVAL 1013 RETVAL
993 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
994PROTOTYPES: DISABLE 1020PROTOTYPES: DISABLE
995 1021
996MODULE = IO::AIO PACKAGE = IO::AIO::REQ 1022MODULE = IO::AIO PACKAGE = IO::AIO::REQ
997 1023
998void 1024void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines