#include "rwbuffer.h"
static size_t waitfill;
-static int writing;
+
+int writing;
void wrbufcore_startup(void) {
waitfill= (buffersize*3)/4;
writing=0;
+ maxselfd=0;
+}
+
+void fdsetset(int fd, fd_set *set) {
+ FD_SET(fd,set);
+ if (fd >= maxselfd) maxselfd= fd+1;
}
void wrbufcore_prepselect(int rdfd, int wrfd) {
FD_ZERO(&readfds);
- if (rdfd>=0 && !seeneof && used+1<buffersize) FD_SET(rdfd,&readfds);
-
+ if (rdfd>=0 && !seeneof && used+1<buffersize) fdsetset(rdfd,&readfds);
+
FD_ZERO(&writefds);
- if (writing) FD_SET(wrfd,&writefds);
+ if (writing) fdsetset(wrfd,&writefds);
}
void wrbufcore_afterselect(int rdfd, int wrfd) {
if (FD_ISSET(wrfd,&writefds) &&
!(rdfd>=0 && FD_ISSET(rdfd,&readfds)) &&
!used) {
+ wrbuf_report("stopping");
writing= 0;
FD_CLR(wrfd,&writefds);
}
r= read(rdfd,rp,min(buffersize-1-used,buf+buffersize-rp));
if (!r) {
seeneof=1; writing=1;
+ wrbuf_report("seeneof");
} else if (r<0) {
if (!(errno == EAGAIN || errno == EINTR)) { perror("read"); exit(1); }
} else {
rp+= r;
if (rp == buf+buffersize) rp=buf;
}
- if (used > waitfill) writing=1;
+ if (used > waitfill) {
+ if (!writing) wrbuf_report("starting");
+ writing=1;
+ }
}
if (FD_ISSET(wrfd,&writefds) && used) {