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.232 by root, Sat Jun 13 00:06:13 2015 UTC vs.
Revision 1.234 by root, Thu Jun 25 15:20:11 2015 UTC

339 croak ("IO::AIO: expected a working directory object as returned by aio_wd"); 339 croak ("IO::AIO: expected a working directory object as returned by aio_wd");
340 340
341 return (aio_wd)(long)SvIVX (SvRV (sv)); 341 return (aio_wd)(long)SvIVX (SvRV (sv));
342} 342}
343 343
344static SV *
345newmortalFH (int fd, int flags)
346{
347 if (fd < 0)
348 return &PL_sv_undef;
349
350 GV *gv = (GV *)sv_newmortal ();
351 char sym[64];
352 int symlen;
353
354 symlen = snprintf (sym, sizeof (sym), "fd#%d", fd);
355 gv_init (gv, aio_stash, sym, symlen, 0);
356
357 symlen = snprintf (
358 sym,
359 sizeof (sym),
360 "%s&=%d",
361 flags == O_RDONLY ? "<" : flags == O_WRONLY ? ">" : "+<",
362 fd
363 );
364
365 return do_open (gv, sym, symlen, 0, 0, 0, 0)
366 ? (SV *)gv : &PL_sv_undef;
367}
368
344static void 369static void
345aio_grp_feed (aio_req grp) 370aio_grp_feed (aio_req grp)
346{ 371{
347 if (grp->sv2 && SvOK (grp->sv2)) 372 if (grp->sv2 && SvOK (grp->sv2))
348 { 373 {
474 XPUSHs (sv_2mortal (newSViv (req->int1 & ~(EIO_READDIR_CUSTOM1 | EIO_READDIR_CUSTOM2)))); 499 XPUSHs (sv_2mortal (newSViv (req->int1 & ~(EIO_READDIR_CUSTOM1 | EIO_READDIR_CUSTOM2))));
475 } 500 }
476 break; 501 break;
477 502
478 case EIO_OPEN: 503 case EIO_OPEN:
479 { 504 PUSHs (newmortalFH (req->result, req->int1 & (O_RDONLY | O_WRONLY | O_RDWR)));
480 /* convert fd to fh */
481 SV *fh = &PL_sv_undef;
482
483 if (req->result >= 0)
484 {
485 GV *gv = (GV *)sv_newmortal ();
486 int flags = req->int1 & (O_RDONLY | O_WRONLY | O_RDWR);
487 char sym [64];
488 int symlen;
489
490 symlen = snprintf (sym, sizeof (sym), "fd#%d", (int)req->result);
491 gv_init (gv, aio_stash, sym, symlen, 0);
492
493 symlen = snprintf (
494 sym,
495 sizeof (sym),
496 "%s&=%d",
497 flags == O_RDONLY ? "<" : flags == O_WRONLY ? ">" : "+<",
498 (int)req->result
499 );
500
501 if (do_open (gv, sym, symlen, 0, 0, 0, 0))
502 fh = (SV *)gv;
503 }
504
505 PUSHs (fh);
506 }
507 break; 505 break;
508 506
509 case EIO_STATVFS: 507 case EIO_STATVFS:
510 case EIO_FSTATVFS: 508 case EIO_FSTATVFS:
511 { 509 {
935 const_iv (O_SEARCH) 933 const_iv (O_SEARCH)
936 const_iv (O_DIRECTORY) 934 const_iv (O_DIRECTORY)
937 const_iv (O_DSYNC) 935 const_iv (O_DSYNC)
938 const_iv (O_RSYNC) 936 const_iv (O_RSYNC)
939 const_iv (O_SYNC) 937 const_iv (O_SYNC)
938 const_iv (O_PATH)
939 const_iv (O_TMPFILE)
940 const_iv (O_TTY_INIT) 940 const_iv (O_TTY_INIT)
941 941
942 const_iv (S_IFIFO) 942 const_iv (S_IFIFO)
943 const_iv (S_IFCHR) 943 const_iv (S_IFCHR)
944 const_iv (S_IFBLK) 944 const_iv (S_IFBLK)
1894 RETVAL = -1; 1894 RETVAL = -1;
1895#endif 1895#endif
1896 OUTPUT: 1896 OUTPUT:
1897 RETVAL 1897 RETVAL
1898 1898
1899void
1900pipe2 (int flags = 0)
1901 PROTOTYPE: ;$
1902 PPCODE:
1903{
1904 int fd[2];
1905 int res;
1906
1907 if (flags)
1908#if HAVE_PIPE2
1909 res = pipe2 (fd, flags);
1910#else
1911 res = (errno = ENOSYS, -1);
1912#endif
1913 else
1914 res = pipe (fd);
1915
1916 if (!res)
1917 {
1918 EXTEND (SP, 2);
1919 PUSHs (newmortalFH (fd[0], O_RDONLY));
1920 PUSHs (newmortalFH (fd[1], O_WRONLY));
1921 }
1922}
1923
1899void _on_next_submit (SV *cb) 1924void _on_next_submit (SV *cb)
1900 CODE: 1925 CODE:
1901 SvREFCNT_dec (on_next_submit); 1926 SvREFCNT_dec (on_next_submit);
1902 on_next_submit = SvOK (cb) ? newSVsv (cb) : 0; 1927 on_next_submit = SvOK (cb) ? newSVsv (cb) : 0;
1903 1928

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines