--- IO-AIO/AIO.xs 2008/09/30 17:03:53 1.129 +++ IO-AIO/AIO.xs 2009/04/19 13:06:15 1.135 @@ -113,8 +113,6 @@ static int req_invoke (eio_req *req); #define EIO_FINISH(req) req_invoke (req) -static void aio_grp_feed (eio_req *grp); -#define EIO_FEED(req) aio_grp_feed (req) static void req_destroy (eio_req *grp); #define EIO_DESTROY(req) req_destroy (req) @@ -520,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 (); @@ -600,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: @@ -638,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; @@ -663,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); @@ -1135,7 +1163,8 @@ CODE: { SvREFCNT_dec (grp->sv2); - grp->sv2 = newSVsv (callback); + grp->sv2 = newSVsv (callback); + grp->feed = aio_grp_feed; if (grp->int2 <= 0) grp->int2 = 2;