--- IO-AIO/AIO.xs 2005/08/23 12:37:19 1.37 +++ IO-AIO/AIO.xs 2006/06/24 16:27:02 1.40 @@ -33,6 +33,11 @@ # endif #endif +/* used for struct dirent, AIX doesn't provide it */ +#ifndef NAME_MAX +# define NAME_MAX 4096 +#endif + #if __ia64 # define STACKSIZE 65536 #else @@ -46,9 +51,9 @@ REQ_SENDFILE, REQ_STAT, REQ_LSTAT, REQ_FSTAT, REQ_FSYNC, REQ_FDATASYNC, - REQ_UNLINK, REQ_RMDIR, + REQ_UNLINK, REQ_RMDIR, REQ_RENAME, REQ_READDIR, - REQ_SYMLINK, + REQ_LINK, REQ_SYMLINK, }; typedef struct aio_cb { @@ -501,10 +506,10 @@ res = sbytes; } -# else +# endif +#else res = -1; errno = ENOSYS; -# endif #endif if (res < 0 @@ -519,11 +524,11 @@ char buf[4096]; res = 0; - for (;;) + while (count) { ssize_t cnt; - cnt = pread (ifd, buf, 4096, offset); + cnt = pread (ifd, buf, count > 4096 ? 4096 : count, offset); if (cnt <= 0) { @@ -541,6 +546,7 @@ offset += cnt; res += cnt; + count -= cnt; } } @@ -661,6 +667,8 @@ case REQ_CLOSE: req->result = close (req->fd); break; case REQ_UNLINK: req->result = unlink (req->dataptr); break; case REQ_RMDIR: req->result = rmdir (req->dataptr); break; + case REQ_RENAME: req->result = rename (req->data2ptr, req->dataptr); break; + case REQ_LINK: req->result = link (req->data2ptr, req->dataptr); break; case REQ_SYMLINK: req->result = symlink (req->data2ptr, req->dataptr); break; case REQ_FDATASYNC: req->result = fdatasync (req->fd); break; @@ -781,17 +789,17 @@ } void -min_parallel(nthreads) +min_parallel (nthreads) int nthreads PROTOTYPE: $ void -max_parallel(nthreads) +max_parallel (nthreads) int nthreads PROTOTYPE: $ int -max_outstanding(nreqs) +max_outstanding (nreqs) int nreqs PROTOTYPE: $ CODE: @@ -799,7 +807,7 @@ max_outstanding = nreqs; void -aio_open(pathname,flags,mode,callback=&PL_sv_undef) +aio_open (pathname,flags,mode,callback=&PL_sv_undef) SV * pathname int flags int mode @@ -819,7 +827,7 @@ } void -aio_close(fh,callback=&PL_sv_undef) +aio_close (fh,callback=&PL_sv_undef) SV * fh SV * callback PROTOTYPE: $;$ @@ -839,7 +847,7 @@ } void -aio_read(fh,offset,length,data,dataoffset,callback=&PL_sv_undef) +aio_read (fh,offset,length,data,dataoffset,callback=&PL_sv_undef) SV * fh UV offset UV length @@ -903,7 +911,7 @@ } void -aio_sendfile(out_fh,in_fh,in_offset,length,callback=&PL_sv_undef) +aio_sendfile (out_fh,in_fh,in_offset,length,callback=&PL_sv_undef) SV * out_fh SV * in_fh UV in_offset @@ -926,7 +934,7 @@ } void -aio_readahead(fh,offset,length,callback=&PL_sv_undef) +aio_readahead (fh,offset,length,callback=&PL_sv_undef) SV * fh UV offset IV length @@ -946,7 +954,7 @@ } void -aio_stat(fh_or_path,callback=&PL_sv_undef) +aio_stat (fh_or_path,callback=&PL_sv_undef) SV * fh_or_path SV * callback ALIAS: @@ -980,12 +988,13 @@ } void -aio_unlink(pathname,callback=&PL_sv_undef) +aio_unlink (pathname,callback=&PL_sv_undef) SV * pathname SV * callback ALIAS: - aio_unlink = REQ_UNLINK - aio_rmdir = REQ_RMDIR + aio_unlink = REQ_UNLINK + aio_rmdir = REQ_RMDIR + aio_readdir = REQ_READDIR CODE: { dREQ; @@ -998,15 +1007,19 @@ } void -aio_symlink(oldpath,newpath,callback=&PL_sv_undef) +aio_link (oldpath,newpath,callback=&PL_sv_undef) SV * oldpath SV * newpath SV * callback + ALIAS: + aio_link = REQ_LINK + aio_symlink = REQ_SYMLINK + aio_rename = REQ_RENAME CODE: { dREQ; - req->type = REQ_SYMLINK; + req->type = ix; req->fh = newSVsv (oldpath); req->data2ptr = SvPVbyte_nolen (req->fh); req->data = newSVsv (newpath); @@ -1016,22 +1029,7 @@ } void -aio_readdir(pathname,callback=&PL_sv_undef) - SV * pathname - SV * callback - CODE: -{ - dREQ; - - req->type = REQ_READDIR; - req->data = newSVsv (pathname); - req->dataptr = SvPVbyte_nolen (req->data); - - send_req (req); -} - -void -flush() +flush () PROTOTYPE: CODE: while (nreqs)