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.201 by root, Thu Sep 29 09:57:12 2011 UTC vs.
Revision 1.206 by root, Tue Oct 4 18:22:37 2011 UTC

371} 371}
372 372
373static SV * 373static SV *
374newSVaio_wd (aio_wd wd) 374newSVaio_wd (aio_wd wd)
375{ 375{
376 return sv_bless (newRV_noinc (newSViv ((long)wd)), aio_wd_stash); 376 return sv_bless (newRV_noinc (newSViv ((IV)wd)), aio_wd_stash);
377} 377}
378 378
379static aio_req 379static aio_req
380SvAIO_REQ (SV *sv) 380SvAIO_REQ (SV *sv)
381{ 381{
382 MAGIC *mg; 382 MAGIC *mg;
383 383
384 if (!SvROK (sv) 384 if (!SvROK (sv)
385 /* for speed reasons, we do not verify that SvROK actually has a stash ptr */
385 || (SvSTASH (SvRV (sv)) != aio_grp_stash 386 || (SvSTASH (SvRV (sv)) != aio_grp_stash
386 && SvSTASH (SvRV (sv)) != aio_req_stash 387 && SvSTASH (SvRV (sv)) != aio_req_stash
387 && !sv_derived_from (sv, "IO::AIO::REQ"))) 388 && !sv_derived_from (sv, "IO::AIO::REQ")))
388 croak ("object of class IO::AIO::REQ expected"); 389 croak ("object of class IO::AIO::REQ expected");
389 390
394 395
395static aio_wd 396static aio_wd
396SvAIO_WD (SV *sv) 397SvAIO_WD (SV *sv)
397{ 398{
398 if (!SvROK (sv) 399 if (!SvROK (sv)
400 || SvTYPE (SvRV (sv)) != SVt_PVMG
399 || SvSTASH (SvRV (sv)) != aio_wd_stash 401 || SvSTASH (SvRV (sv)) != aio_wd_stash)
400 || SvTYPE (SvRV (sv)) != SVt_PVMG)
401 croak ("IO::AIO: expected a working directory object as returned by aio_wd"); 402 croak ("IO::AIO: expected a working directory object as returned by aio_wd");
402 403
403 return (aio_wd)(long)SvIVX (SvRV (sv)); 404 return (aio_wd)(long)SvIVX (SvRV (sv));
404} 405}
405 406
471 } 472 }
472 473
473 switch (req->type) 474 switch (req->type)
474 { 475 {
475 case EIO_WD_OPEN: 476 case EIO_WD_OPEN:
476 PUSHs (sv_2mortal (newSVaio_wd (req->wd))); 477 PUSHs (req->result ? &PL_sv_undef : sv_2mortal (newSVaio_wd (req->wd)));
477 break; 478 break;
478 479
479 case EIO_READDIR: 480 case EIO_READDIR:
480 { 481 {
481 SV *rv = &PL_sv_undef; 482 SV *rv = &PL_sv_undef;
689 SvREFCNT_dec (req->sv2); 690 SvREFCNT_dec (req->sv2);
690 SvREFCNT_dec (req->sv3); 691 SvREFCNT_dec (req->sv3);
691 SvREFCNT_dec (req->sv4); 692 SvREFCNT_dec (req->sv4);
692 SvREFCNT_dec (req->callback); 693 SvREFCNT_dec (req->callback);
693 694
694 Safefree (req); 695 free (req);
695} 696}
696 697
697static void 698static void
698req_cancel_subs (aio_req grp) 699req_cancel_subs (aio_req grp)
699{ 700{
809{ 810{
810 SvGETMAGIC (cb_sv); 811 SvGETMAGIC (cb_sv);
811 return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0; 812 return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0;
812} 813}
813 814
815static aio_req ecb_noinline
816dreq (SV *callback)
817{
818 SV *cb_cv;
819 aio_req req;
820 int req_pri = next_pri;
821 next_pri = EIO_PRI_DEFAULT;
822
823 cb_cv = get_cb (callback);
824
825 req = calloc (sizeof (*req), 1);
826 if (!req)
827 croak ("out of memory during eio_req allocation");
828
829 req->callback = SvREFCNT_inc (cb_cv);
830 req->pri = req_pri;
831
832 return req;
833}
834
814#define dREQ \ 835#define dREQ \
815 SV *cb_cv; \ 836 aio_req req = dreq (callback); \
816 aio_req req; \
817 int req_pri = next_pri; \
818 next_pri = EIO_PRI_DEFAULT; \
819 \
820 cb_cv = get_cb (callback); \
821 \
822 Newz (0, req, 1, eio_req); \
823 if (!req) \
824 croak ("out of memory during eio_req allocation"); \
825 \
826 req->callback = SvREFCNT_inc (cb_cv); \
827 req->pri = req_pri
828 837
829#define REQ_SEND \ 838#define REQ_SEND \
830 PUTBACK; \ 839 PUTBACK; \
831 req_submit (req); \ 840 req_submit (req); \
832 SPAGAIN; \ 841 SPAGAIN; \
837ecb_inline void 846ecb_inline void
838req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr) 847req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr)
839{ 848{
840 if (expect_false (SvROK (path))) 849 if (expect_false (SvROK (path)))
841 { 850 {
842 AV *av = (AV *)SvRV (path); 851 SV *rv = SvRV (path);
843 SV *wdob; 852 SV *wdob;
844 853
845 if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1) 854 if (SvTYPE (rv) == SVt_PVAV && AvFILLp (rv) == 1)
846 croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs");
847
848 path = AvARRAY (av)[1];
849 wdob = AvARRAY (av)[0];
850
851 if (SvOK (wdob))
852 { 855 {
856 path = AvARRAY (rv)[1];
857 wdob = AvARRAY (rv)[0];
858
859 if (SvOK (wdob))
860 {
853 *wd = SvAIO_WD (wdob); 861 *wd = SvAIO_WD (wdob);
854 *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); 862 *wdsv = SvREFCNT_inc_NN (SvRV (wdob));
863 }
864 else
865 *wd = EIO_INVALID_WD;
866 }
867 else if (SvTYPE (rv) == SVt_PVMG && SvSTASH (rv) == aio_wd_stash)
868 {
869 *wd = (aio_wd)(long)SvIVX (rv);
870 *wdsv = SvREFCNT_inc_NN (rv);
871 *ptr = ".";
872 return; /* path set to "." */
855 } 873 }
856 else 874 else
857 *wd = EIO_INVALID_WD; 875 croak ("IO::AIO: pathname arguments must be specified as a string, an IO::AIO::WD object or a [IO::AIO::WD, path] pair");
858 } 876 }
859 877
860 *pathsv = newSVsv (path); 878 *pathsv = newSVsv (path);
861 *ptr = SvPVbyte_nolen (*pathsv); 879 *ptr = SvPVbyte_nolen (*pathsv);
862} 880}
886 req->type = type_path; 904 req->type = type_path;
887 req_set_path1 (req, fh_or_path); 905 req_set_path1 (req, fh_or_path);
888 break; 906 break;
889 } 907 }
890} 908}
909
910XS(boot_IO__AIO) ecb_cold;
891 911
892MODULE = IO::AIO PACKAGE = IO::AIO 912MODULE = IO::AIO PACKAGE = IO::AIO
893 913
894PROTOTYPES: ENABLE 914PROTOTYPES: ENABLE
895 915
1294 aio_statvfs = EIO_STATVFS 1314 aio_statvfs = EIO_STATVFS
1295 PPCODE: 1315 PPCODE:
1296{ 1316{
1297 dREQ; 1317 dREQ;
1298 1318
1299 req->sv1 = newSVsv (fh_or_path);
1300 req_set_fh_or_path (req, ix, ix == EIO_STATVFS ? EIO_FSTATVFS : EIO_FSTAT, fh_or_path); 1319 req_set_fh_or_path (req, ix, ix == EIO_STATVFS ? EIO_FSTATVFS : EIO_FSTAT, fh_or_path);
1320
1301 REQ_SEND; 1321 REQ_SEND;
1302} 1322}
1303 1323
1304UV 1324UV
1305major (UV dev) 1325major (UV dev)
1785DESTROY (SV *self) 1805DESTROY (SV *self)
1786 CODE: 1806 CODE:
1787{ 1807{
1788 aio_wd wd = SvAIO_WD (self); 1808 aio_wd wd = SvAIO_WD (self);
1789#if HAVE_AT 1809#if HAVE_AT
1810 {
1790 SV *callback = &PL_sv_undef; 1811 SV *callback = &PL_sv_undef;
1791 dREQ; /* clobbers next_pri :/ */ 1812 dREQ; /* clobbers next_pri :/ */
1813 next_pri = req->pri; /* restore next_pri */
1814 req->pri = EIO_PRI_MAX; /* better use max. priority to conserve fds */
1792 req->type = EIO_WD_CLOSE; 1815 req->type = EIO_WD_CLOSE;
1793 req->wd = wd; 1816 req->wd = wd;
1794 REQ_SEND; 1817 REQ_SEND;
1818 }
1795#else 1819#else
1796 eio_wd_close_sync (wd); 1820 eio_wd_close_sync (wd);
1797#endif 1821#endif
1798} 1822}
1799 1823

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines