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.202 by root, Thu Sep 29 10:01:35 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; \
1296 aio_statvfs = EIO_STATVFS 1304 aio_statvfs = EIO_STATVFS
1297 PPCODE: 1305 PPCODE:
1298{ 1306{
1299 dREQ; 1307 dREQ;
1300 1308
1301 req->sv1 = newSVsv (fh_or_path);
1302 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
1303 REQ_SEND; 1311 REQ_SEND;
1304} 1312}
1305 1313
1306UV 1314UV
1307major (UV dev) 1315major (UV dev)
1787DESTROY (SV *self) 1795DESTROY (SV *self)
1788 CODE: 1796 CODE:
1789{ 1797{
1790 aio_wd wd = SvAIO_WD (self); 1798 aio_wd wd = SvAIO_WD (self);
1791#if HAVE_AT 1799#if HAVE_AT
1800 {
1792 SV *callback = &PL_sv_undef; 1801 SV *callback = &PL_sv_undef;
1793 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 */
1794 req->type = EIO_WD_CLOSE; 1805 req->type = EIO_WD_CLOSE;
1795 req->wd = wd; 1806 req->wd = wd;
1796 REQ_SEND; 1807 REQ_SEND;
1808 }
1797#else 1809#else
1798 eio_wd_close_sync (wd); 1810 eio_wd_close_sync (wd);
1799#endif 1811#endif
1800} 1812}
1801 1813

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines