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.203 by root, Thu Sep 29 23:06:24 2011 UTC vs.
Revision 1.204 by root, Sat Oct 1 10:48:04 2011 UTC

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
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{
819 int req_pri = next_pri; 820 int req_pri = next_pri;
820 next_pri = EIO_PRI_DEFAULT; 821 next_pri = EIO_PRI_DEFAULT;
821 822
822 cb_cv = get_cb (callback); 823 cb_cv = get_cb (callback);
823 824
824 Newz (0, req, 1, eio_req); 825 req = calloc (sizeof (*req), 1);
825 if (!req) 826 if (!req)
826 croak ("out of memory during eio_req allocation"); 827 croak ("out of memory during eio_req allocation");
827 828
828 req->callback = SvREFCNT_inc (cb_cv); 829 req->callback = SvREFCNT_inc (cb_cv);
829 req->pri = req_pri; 830 req->pri = req_pri;
845ecb_inline void 846ecb_inline void
846req_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)
847{ 848{
848 if (expect_false (SvROK (path))) 849 if (expect_false (SvROK (path)))
849 { 850 {
850 AV *av = (AV *)SvRV (path); 851 SV *rv = SvRV (path);
851 SV *wdob; 852 SV *wdob;
852 853
853 if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1) 854 if (SvTYPE (rv) == SVt_PVAV && AvFILLp (rv) == 1)
854 croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs");
855
856 path = AvARRAY (av)[1];
857 wdob = AvARRAY (av)[0];
858
859 if (SvOK (wdob))
860 { 855 {
856 path = AvARRAY (rv)[1];
857 wdob = AvARRAY (rv)[0];
858
859 if (SvOK (wdob))
860 {
861 *wd = SvAIO_WD (wdob); 861 *wd = SvAIO_WD (wdob);
862 *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 = SvIVX (rv);
870 *wdsv = SvREFCNT_inc_NN (rv);
871 *ptr = ".";
872 return; /* path set to "." */
863 } 873 }
864 else 874 else
865 *wd = EIO_INVALID_WD; 875 croak ("IO::AIO: pathname arguments must be specified as strings, an IO::AIO::WD object or a [IO::AIO::WD, path] pair");
866 } 876 }
867 877
868 *pathsv = newSVsv (path); 878 *pathsv = newSVsv (path);
869 *ptr = SvPVbyte_nolen (*pathsv); 879 *ptr = SvPVbyte_nolen (*pathsv);
870} 880}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines