diff --git a/io/io_mmapwritefile.c b/io/io_mmapwritefile.c index 653818d..dd649b2 100644 --- a/io/io_mmapwritefile.c +++ b/io/io_mmapwritefile.c @@ -20,7 +20,7 @@ int64 io_mmapwritefile(int64 out,int64 in,uint64 off,uint64 bytes,io_write_callb const char* c; unsigned long left; #ifdef __MINGW32__ - if (!e->mh) e->mh=CreateFileMapping(out,0,PAGE_READONLY,0,0,NULL); + if (!e->mh) e->mh=CreateFileMapping(in,0,PAGE_READONLY,0,0,NULL); if (!e->mh) goto readwrite; #endif do { @@ -56,8 +56,7 @@ int64 io_mmapwritefile(int64 out,int64 in,uint64 off,uint64 bytes,io_write_callb while (left>0) { m=writecb(out,c,left); if (m<0) { - e->canwrite=0; - e->next_write=-1; + io_eagain(out); if (errno!=EAGAIN) { #ifdef __MINGW32__ UnmapViewOfFile(e->mmapped); @@ -75,6 +74,11 @@ int64 io_mmapwritefile(int64 out,int64 in,uint64 off,uint64 bytes,io_write_callb bytes-=m; off+=m; c+=m; + if (e && left>0) { + e->canwrite=0; + e->next_write=-1; + return sent; + } } } while (bytes); if (e->mmapped) { @@ -109,6 +113,11 @@ readwrite: n-=m; bytes-=m; tmp+=m; + if (e && m!=n) { + e->canwrite=0; + e->next_write=-1; + goto abort; + } } } abort: diff --git a/io/io_sendfile.c b/io/io_sendfile.c index ef704c9..8ba5eee 100644 --- a/io/io_sendfile.c +++ b/io/io_sendfile.c @@ -14,8 +14,14 @@ int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n) { off_t sbytes; int r=sendfile(fd,s,off,n,0,&sbytes,0); - if (r==-1) + if (r==-1) { + io_entry* e=iarray_get(&io_fds,s); + if (e) { + e->canwrite=0; + e->next_write=-1; + } return (errno==EAGAIN?(sbytes?sbytes:-1):-3); + } return n; } @@ -31,6 +37,13 @@ int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n) { int64 io_sendfile(int64 out,int64 in,uint64 off,uint64 bytes) { long long r=sendfile64(out,in,off,bytes,0,0); if (r==-1 && errno!=EAGAIN) r=-3; + if (r!=bytes) { + io_entry* e=iarray_get(&io_fds,s); + if (e) { + e->canwrite=0; + e->next_write=-1; + } + } return r; } @@ -45,6 +58,13 @@ int64 io_sendfile(int64 out,int64 in,uint64 off,uint64 bytes) { off64_t o=off; long long r=sendfile64(out,in,&o,bytes); if (r==-1 && errno!=EAGAIN) r=-3; + if (r!=bytes) { + io_entry* e=iarray_get(&io_fds,s); + if (e) { + e->canwrite=0; + e->next_write=-1; + } + } return r; } @@ -65,9 +85,16 @@ int64 io_sendfile(int64 out,int64 in,uint64 off,uint64 bytes) { p.file_bytes=bytes; p.trailer_data=0; p.trailer_length=0; - if (send_file(&destfd,&p,0)>=0) + if (send_file(&destfd,&p,0)>=0) { + if (p.bytes_sent != bytes) { + io_entry* e=iarray_get(&io_fds,s); + if (e) { + e->canwrite=0; + e->next_write=-1; + } + } return p.bytes_sent; - if (errno==EAGAIN) + } if (errno==EAGAIN) return -1; else return -3; @@ -99,14 +126,16 @@ int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n) { n-=todo; if (n==0) return done; continue; - } else if (i==-1) { + } else { if (e) { e->canwrite=0; e->next_write=-1; } - return (errno==EAGAIN?-1:-3); - } else - return done+i; + if (i==-1) + return (errno==EAGAIN?-1:-3); + else + return done+i; + } } return 0; } diff --git a/io/io_tryread.c b/io/io_tryread.c index 5b43cde..7f3fb21 100644 --- a/io/io_tryread.c +++ b/io/io_tryread.c @@ -86,7 +86,7 @@ int64 io_tryread(int64 d,char* buf,int64 len) { if (!e) { errno=EBADF; return -3; } if (!e->nonblock) { p.fd=d; - if (p.fd != d) { errno=EBADF; return -3; } /* catch overflow */ + if (p.fd!=d) { errno=EBADF; return -3; } /* catch integer truncation */ p.events=POLLIN; switch (poll(&p,1,0)) { case -1: return -3; @@ -110,7 +110,7 @@ int64 io_tryread(int64 d,char* buf,int64 len) { if (errno!=EAGAIN) r=-3; } - if (r==-1 || r==0) { + if (r!=len) { e->canread=0; #if defined(HAVE_SIGIO) || defined(HAVE_EPOLL) if (d==alt_firstread) { diff --git a/io/io_trywrite.c b/io/io_trywrite.c index 08f6ed8..33091be 100644 --- a/io/io_trywrite.c +++ b/io/io_trywrite.c @@ -104,7 +104,7 @@ int64 io_trywrite(int64 d,const char* buf,int64 len) { if (errno!=EAGAIN) r=-3; } - if (r==-1 || r==0) { + if (r!=len) { e->canwrite=0; #if defined(HAVE_SIGIO) || defined(HAVE_EPOLL) if (d==alt_firstwrite) { diff --git a/io/io_waituntil2.c b/io/io_waituntil2.c index 050ecc6..ac4ff6a 100644 --- a/io/io_waituntil2.c +++ b/io/io_waituntil2.c @@ -125,8 +125,15 @@ int64 io_waituntil2(int64 milliseconds) { int n; struct epoll_event y[100]; io_entry* e; - if (alt_firstread>=0 && (e=iarray_get(&io_fds,alt_firstread)) && e->canread) return 1; - if (alt_firstwrite>=0 && (e=iarray_get(&io_fds,alt_firstwrite)) && e->canwrite) return 1; + if (alt_firstread>=0 && (e=iarray_get(&io_fds,alt_firstread)) && e->canread) { +// write(1,"r",1); + return 1; + } + if (alt_firstwrite>=0 && (e=iarray_get(&io_fds,alt_firstwrite)) && e->canwrite) { +// write(1,"w",1); + return 1; + } +// write(1,".",1); if ((n=epoll_wait(io_master,y,100,milliseconds))==-1) return -1; for (i=0; i