--- IO-AIO/AIO.xs 2008/10/13 10:38:17 1.132 +++ IO-AIO/AIO.xs 2009/04/19 13:06:15 1.135 @@ -518,6 +518,10 @@ #ifndef _WIN32 newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); #endif + newCONSTSUB (stash, "S_IFIFO", newSViv (S_IFIFO)); + newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_BEFORE", newSViv (EIO_SYNC_FILE_RANGE_WAIT_BEFORE)); + newCONSTSUB (stash, "SYNC_FILE_RANGE_WRITE" , newSViv (EIO_SYNC_FILE_RANGE_WRITE)); + newCONSTSUB (stash, "SYNC_FILE_RANGE_WAIT_AFTER" , newSViv (EIO_SYNC_FILE_RANGE_WAIT_AFTER)); create_respipe (); @@ -598,6 +602,23 @@ } void +aio_sync_file_range (SV *fh, SV *offset, SV *nbytes, IV flags, SV *callback=&PL_sv_undef) + PROTOTYPE: $$$$;$ + PPCODE: +{ + dREQ; + + req->type = EIO_SYNC_FILE_RANGE; + req->sv1 = newSVsv (fh); + req->int1 = PerlIO_fileno (IoIFP (sv_2io (fh))); + req->offs = SvVAL64 (offset); + req->size = SvVAL64 (nbytes); + req->int2 = flags; + + REQ_SEND (req); +} + +void aio_close (SV *fh, SV *callback=&PL_sv_undef) PROTOTYPE: $;$ PPCODE: @@ -636,9 +657,13 @@ STRLEN svlen; char *svptr = SvPVbyte (data, svlen); UV len = SvUV (length); + int fd; + + if (SvTYPE (data) > SVt_PVMG) + croak ("illegal data argument '%s', must be plain scalar string", SvPV_nolen (data)); SvUPGRADE (data, SVt_PV); - SvPOK_on (data); + SvPOK_only (data); if (dataoffset < 0) dataoffset += svlen; @@ -661,13 +686,18 @@ if (len < 0) croak ("length must not be negative"); + fd = PerlIO_fileno (ix == EIO_READ ? IoIFP (sv_2io (fh)) + : IoOFP (sv_2io (fh))); + + if (fd < 0) + croak ("illegal fh argument, either not an OS file or read/write mode mismatch"); + { dREQ; req->type = ix; req->sv1 = newSVsv (fh); - req->int1 = PerlIO_fileno (ix == EIO_READ ? IoIFP (sv_2io (fh)) - : IoOFP (sv_2io (fh))); + req->int1 = fd; req->offs = SvOK (offset) ? SvVAL64 (offset) : -1; req->size = len; req->sv2 = SvREFCNT_inc (data);