--- IO-AIO/AIO.xs 2018/11/29 21:48:44 1.269 +++ IO-AIO/AIO.xs 2019/03/10 12:16:48 1.274 @@ -5,6 +5,7 @@ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" +#include "perliol.h" #if !defined mg_findext # define mg_findext(sv,type,vtbl) mg_find (sv, type) @@ -118,6 +119,10 @@ # include #endif +#if HAVE_SYS_UIO_H +# include +#endif + #if HAVE_ST_XTIMENSEC # define ATIMENSEC PL_statcache.st_atimensec # define MTIMENSEC PL_statcache.st_mtimensec @@ -818,6 +823,12 @@ PUSHs (sv_result); break; +#if 0 + case EIO_CLOSE: + PerlIOUnix_refcnt_dec (req->int1); + break; +#endif + case EIO_DUP2: /* EIO_DUP2 actually means aio_close(), so fudge result value */ if (req->result > 0) SvIV_set (sv_result, 0); @@ -1475,11 +1486,35 @@ { int fd = s_fileno_croak (fh, 0); dREQ; +#if 0 + /* partially duplicate logic in s_fileno */ + SvGETMAGIC (fh); + + if (SvROK (fh)) + { + fh = SvRV (fh); + SvGETMAGIC (fh); + } - req->type = EIO_DUP2; - req->int1 = close_fd; - req->sv2 = newSVsv (fh); - req->int2 = fd; + if (SvTYPE (fh) == SVt_PVGV) + { + /* perl filehandle */ + PerlIOUnix_refcnt_inc (fd); + do_close ((GV *)fh, 1); + + req->type = EIO_CLOSE; + req->int1 = fd; + /*req->sv2 = newSVsv (fh);*/ /* since we stole the fd, no need to keep the fh */ + } + else +#endif + { + /* fd number */ + req->type = EIO_DUP2; + req->int1 = close_fd; + req->sv2 = newSVsv (fh); + req->int2 = fd; + } REQ_SEND; } @@ -2248,6 +2283,7 @@ int mlockall (int flags) + PROTOTYPE: $; CODE: RETVAL = eio_mlockall_sync (flags); OUTPUT: