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.195 by root, Mon Sep 26 20:19:08 2011 UTC vs.
Revision 1.200 by root, Thu Sep 29 09:51:24 2011 UTC

330 FLAG_SV2_RO_OFF = 0x40, /* data was set readonly */ 330 FLAG_SV2_RO_OFF = 0x40, /* data was set readonly */
331}; 331};
332 332
333typedef eio_req *aio_req; 333typedef eio_req *aio_req;
334typedef eio_req *aio_req_ornot; 334typedef eio_req *aio_req_ornot;
335typedef eio_wd *aio_wd; 335typedef eio_wd aio_wd;
336 336
337static SV *on_next_submit; 337static SV *on_next_submit;
338static int next_pri = EIO_PRI_DEFAULT; 338static int next_pri = EIO_PRI_DEFAULT;
339static int max_outstanding; 339static int max_outstanding;
340 340
363 req->self = (SV *)newHV (); 363 req->self = (SV *)newHV ();
364 sv_magic (req->self, 0, PERL_MAGIC_ext, (char *)req, 0); 364 sv_magic (req->self, 0, PERL_MAGIC_ext, (char *)req, 0);
365 } 365 }
366 366
367 return sv_2mortal (sv_bless (newRV_inc (req->self), stash)); 367 return sv_2mortal (sv_bless (newRV_inc (req->self), stash));
368}
369
370static SV *
371newSVaio_wd (aio_wd wd)
372{
373 return sv_bless (newRV_noinc (newSViv ((long)wd)), aio_wd_stash);
368} 374}
369 375
370static aio_req SvAIO_REQ (SV *sv) 376static aio_req SvAIO_REQ (SV *sv)
371{ 377{
372 MAGIC *mg; 378 MAGIC *mg;
457 } 463 }
458 464
459 switch (req->type) 465 switch (req->type)
460 { 466 {
461 case EIO_WD_OPEN: 467 case EIO_WD_OPEN:
462 PUSHs (sv_2mortal (sv_bless (newRV_noinc (newSViv (((long)req->wd))), aio_wd_stash))); 468 PUSHs (sv_2mortal (newSVaio_wd (req->wd)));
463 break; 469 break;
464 470
465 case EIO_READDIR: 471 case EIO_READDIR:
466 { 472 {
467 SV *rv = &PL_sv_undef; 473 SV *rv = &PL_sv_undef;
611 break; 617 break;
612 618
613 case EIO_STAT: 619 case EIO_STAT:
614 case EIO_LSTAT: 620 case EIO_LSTAT:
615 case EIO_FSTAT: 621 case EIO_FSTAT:
616 PL_laststype = req->type == EIO_LSTAT ? OP_LSTAT : OP_STAT; 622 PL_laststype = req->type == EIO_LSTAT ? OP_LSTAT : OP_STAT;
623
617 PL_laststatval = req->result; 624 if (!(PL_laststatval = req->result))
618 /* if compilation fails here then perl's Stat_t is not struct _stati64 */ 625 /* if compilation fails here then perl's Stat_t is not struct _stati64 */
619 PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2); 626 PL_statcache = *(EIO_STRUCT_STAT *)(req->ptr2);
627
620 PUSHs (sv_result); 628 PUSHs (sv_result);
621 break; 629 break;
622 630
623 case EIO_READ: 631 case EIO_READ:
624 { 632 {
812 XPUSHs (req_sv (req, aio_req_stash)); 820 XPUSHs (req_sv (req, aio_req_stash));
813 821
814static void 822static void
815req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr) 823req_set_path (aio_req req, SV *path, SV **wdsv, SV **pathsv, eio_wd *wd, void **ptr)
816{ 824{
817 if (SvROK (path)) 825 if (expect_false (SvROK (path)))
818 { 826 {
819 AV *av = (AV *)SvRV (path); 827 AV *av = (AV *)SvRV (path);
820 SV *wdob; 828 SV *wdob;
821 829
822 if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1) 830 if (SvTYPE (av) != SVt_PVAV || AvFILLp (av) != 1)
823 croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs"); 831 croak ("IO::AIO: pathname arguments must be specified as strings or [wd, path] arrayrefs");
824 832
825 path = AvARRAY (av)[1]; 833 path = AvARRAY (av)[1];
826 wdob = AvARRAY (av)[0]; 834 wdob = AvARRAY (av)[0];
827 835
836 if (SvOK (wdob))
837 {
828 *wd = SvAIO_WD (wdob); 838 *wd = SvAIO_WD (wdob);
829 *wdsv = SvREFCNT_inc_NN (SvRV (wdob)); 839 *wdsv = SvREFCNT_inc_NN (SvRV (wdob));
840 }
841 else
842 *wd = EIO_INVALID_WD;
830 } 843 }
831 844
832 *pathsv = newSVsv (path); 845 *pathsv = newSVsv (path);
833 *ptr = SvPVbyte_nolen (*pathsv); 846 *ptr = SvPVbyte_nolen (*pathsv);
834} 847}
1315 REQ_SEND; 1328 REQ_SEND;
1316} 1329}
1317 1330
1318void 1331void
1319aio_chmod (SV8 *fh_or_path, int mode, SV *callback=&PL_sv_undef) 1332aio_chmod (SV8 *fh_or_path, int mode, SV *callback=&PL_sv_undef)
1320 ALIAS:
1321 aio_chmod = EIO_CHMOD
1322 aio_mkdir = EIO_MKDIR
1323 PPCODE: 1333 PPCODE:
1324{ 1334{
1325 dREQ; 1335 dREQ;
1326 1336
1327 req->int2 = mode; 1337 req->int2 = mode;
1348 PPCODE: 1358 PPCODE:
1349{ 1359{
1350 dREQ; 1360 dREQ;
1351 1361
1352 req->type = EIO_READDIR; 1362 req->type = EIO_READDIR;
1353 req->sv1 = newSVsv (pathname);
1354 req->ptr1 = SvPVbyte_nolen (req->sv1);
1355 req->int1 = flags | EIO_READDIR_DENTS | EIO_READDIR_CUSTOM1; 1363 req->int1 = flags | EIO_READDIR_DENTS | EIO_READDIR_CUSTOM1;
1356 1364
1357 if (flags & EIO_READDIR_DENTS) 1365 if (flags & EIO_READDIR_DENTS)
1358 req->int1 |= EIO_READDIR_CUSTOM2; 1366 req->int1 |= EIO_READDIR_CUSTOM2;
1359 1367
1368 req_set_path1 (req, pathname);
1369
1360 REQ_SEND; 1370 REQ_SEND;
1371}
1372
1373void
1374aio_mkdir (SV8 *pathname, int mode, SV *callback=&PL_sv_undef)
1375 PPCODE:
1376{
1377 dREQ;
1378
1379 req->type = EIO_MKDIR;
1380 req->int2 = mode;
1381 req_set_path1 (req, pathname);
1382
1383 REQ_SEND;
1361} 1384}
1362 1385
1363void 1386void
1364aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef) 1387aio_unlink (SV8 *pathname, SV *callback=&PL_sv_undef)
1365 ALIAS: 1388 ALIAS:
1383 aio_symlink = EIO_SYMLINK 1406 aio_symlink = EIO_SYMLINK
1384 aio_rename = EIO_RENAME 1407 aio_rename = EIO_RENAME
1385 PPCODE: 1408 PPCODE:
1386{ 1409{
1387 dREQ; 1410 dREQ;
1388 eio_wd wd2; 1411 eio_wd wd2 = 0;
1389 1412
1390 req->type = ix; 1413 req->type = ix;
1391 req_set_path1 (req, oldpath); 1414 req_set_path1 (req, oldpath);
1392 req_set_path (req, newpath, &req->sv2, &req->sv4, &wd2, &req->ptr2); 1415 req_set_path (req, newpath, &req->sv2, &req->sv4, &wd2, &req->ptr2);
1393 req->int3 = (long)wd2; 1416 req->int3 = (long)wd2;
1736 1759
1737PROTOTYPES: DISABLE 1760PROTOTYPES: DISABLE
1738 1761
1739MODULE = IO::AIO PACKAGE = IO::AIO::WD 1762MODULE = IO::AIO PACKAGE = IO::AIO::WD
1740 1763
1764BOOT:
1765{
1766 newCONSTSUB (aio_stash, "CWD" , newSVaio_wd (EIO_CWD ));
1767 newCONSTSUB (aio_stash, "INVALID_WD", newSVaio_wd (EIO_INVALID_WD));
1768}
1769
1741void 1770void
1742DESTROY (SV *self) 1771DESTROY (SV *self)
1743 CODE: 1772 CODE:
1744{ 1773{
1745 aio_wd wd = SvAIO_WD (self); 1774 aio_wd wd = SvAIO_WD (self);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines