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.203 by root, Thu Sep 29 23:06:24 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{
471 } 471 }
472 472
473 switch (req->type) 473 switch (req->type)
474 { 474 {
475 case EIO_WD_OPEN: 475 case EIO_WD_OPEN:
476 PUSHs (sv_2mortal (newSVaio_wd (req->wd))); 476 PUSHs (req->result ? &PL_sv_undef : sv_2mortal (newSVaio_wd (req->wd)));
477 break; 477 break;
478 478
479 case EIO_READDIR: 479 case EIO_READDIR:
480 { 480 {
481 SV *rv = &PL_sv_undef; 481 SV *rv = &PL_sv_undef;
809{ 809{
810 SvGETMAGIC (cb_sv); 810 SvGETMAGIC (cb_sv);
811 return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0; 811 return SvOK (cb_sv) ? s_get_cv_croak (cb_sv) : 0;
812} 812}
813 813
814static aio_req ecb_noinline
815dreq (SV *callback)
816{
817 SV *cb_cv;
818 aio_req req;
819 int req_pri = next_pri;
820 next_pri = EIO_PRI_DEFAULT;
821
822 cb_cv = get_cb (callback);
823
824 Newz (0, req, 1, eio_req);
825 if (!req)
826 croak ("out of memory during eio_req allocation");
827
828 req->callback = SvREFCNT_inc (cb_cv);
829 req->pri = req_pri;
830
831 return req;
832}
833
814#define dREQ \ 834#define dREQ \
815 SV *cb_cv; \ 835 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 836
829#define REQ_SEND \ 837#define REQ_SEND \
830 PUTBACK; \ 838 PUTBACK; \
831 req_submit (req); \ 839 req_submit (req); \
832 SPAGAIN; \ 840 SPAGAIN; \
886 req->type = type_path; 894 req->type = type_path;
887 req_set_path1 (req, fh_or_path); 895 req_set_path1 (req, fh_or_path);
888 break; 896 break;
889 } 897 }
890} 898}
899
900XS(boot_IO__AIO) ecb_cold;
891 901
892MODULE = IO::AIO PACKAGE = IO::AIO 902MODULE = IO::AIO PACKAGE = IO::AIO
893 903
894PROTOTYPES: ENABLE 904PROTOTYPES: ENABLE
895 905
1294 aio_statvfs = EIO_STATVFS 1304 aio_statvfs = EIO_STATVFS
1295 PPCODE: 1305 PPCODE:
1296{ 1306{
1297 dREQ; 1307 dREQ;
1298 1308
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); 1309 req_set_fh_or_path (req, ix, ix == EIO_STATVFS ? EIO_FSTATVFS : EIO_FSTAT, fh_or_path);
1310
1301 REQ_SEND; 1311 REQ_SEND;
1302} 1312}
1303 1313
1304UV 1314UV
1305major (UV dev) 1315major (UV dev)
1785DESTROY (SV *self) 1795DESTROY (SV *self)
1786 CODE: 1796 CODE:
1787{ 1797{
1788 aio_wd wd = SvAIO_WD (self); 1798 aio_wd wd = SvAIO_WD (self);
1789#if HAVE_AT 1799#if HAVE_AT
1800 {
1790 SV *callback = &PL_sv_undef; 1801 SV *callback = &PL_sv_undef;
1791 dREQ; /* clobbers next_pri :/ */ 1802 dREQ; /* clobbers next_pri :/ */
1803 next_pri = req->pri; /* restore next_pri */
1804 req->pri = EIO_PRI_MAX; /* better use max. priority to conserve fds */
1792 req->type = EIO_WD_CLOSE; 1805 req->type = EIO_WD_CLOSE;
1793 req->wd = wd; 1806 req->wd = wd;
1794 REQ_SEND; 1807 REQ_SEND;
1808 }
1795#else 1809#else
1796 eio_wd_close_sync (wd); 1810 eio_wd_close_sync (wd);
1797#endif 1811#endif
1798} 1812}
1799 1813

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines