*
*/
+#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 wrbufcore_mainloop(void) {
- int r;
+void fdsetset(int fd, fd_set *set) {
+ FD_SET(fd,set);
+ if (fd >= maxselfd) maxselfd= fd+1;
+}
- while (!seeneof || used) {
-
- FD_ZERO(&readfds); if (!seeneof && used+1<buffersize) FD_SET(0,&readfds);
- FD_ZERO(&writefds); if (writing) FD_SET(1,&writefds);
+void wrbufcore_prepselect(int rdfd, int wrfd) {
+ FD_ZERO(&readfds);
+ if (rdfd>=0 && !seeneof && used+1<buffersize) fdsetset(rdfd,&readfds);
+
+ FD_ZERO(&writefds);
+ if (writing) fdsetset(wrfd,&writefds);
+}
- callselect();
+void wrbufcore_afterselect(int rdfd, int wrfd) {
+ int r;
- if (FD_ISSET(1,&writefds) && !FD_ISSET(0,&readfds) && !used) {
- writing= 0;
- FD_CLR(1,&writefds);
- }
+ if (FD_ISSET(wrfd,&writefds) &&
+ !(rdfd>=0 && FD_ISSET(rdfd,&readfds)) &&
+ !used) {
+ wrbuf_report("stopping");
+ writing= 0;
+ FD_CLR(wrfd,&writefds);
+ }
- if (FD_ISSET(0,&readfds)) {
- r= read(0,rp,min(buffersize-1-used,buf+buffersize-rp));
- if (!r) {
- seeneof=1; writing=1;
- } else if (r<0) {
- if (!(errno == EAGAIN || errno == EINTR)) { perror("read"); exit(1); }
- } else {
- used+= r;
- rp+= r;
- if (rp == buf+buffersize) rp=buf;
- }
- if (used > waitfill) writing=1;
+ if (rdfd>=0 && FD_ISSET(rdfd,&readfds)) {
+ 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 {
+ used+= r;
+ rp+= r;
+ if (rp == buf+buffersize) rp=buf;
}
+ if (used > waitfill) {
+ if (!writing) wrbuf_report("starting");
+ writing=1;
+ }
+ }
- if (FD_ISSET(1,&writefds) && used) {
- r= write(1,wp,min(used,buf+buffersize-wp));
- if (r<=0) {
- if (!(errno == EAGAIN || errno == EINTR)) { perror("write"); exit(1); }
- } else {
- used-= r;
- wp+= r;
- if (wp == buf+buffersize) wp=buf;
- }
+ if (FD_ISSET(wrfd,&writefds) && used) {
+ r= write(wrfd,wp,min(used,buf+buffersize-wp));
+ if (r<=0) {
+ if (!(errno == EAGAIN || errno == EINTR)) { perror("write"); exit(1); }
+ } else {
+ used-= r;
+ wp+= r;
+ if (wp == buf+buffersize) wp=buf;
}
}
}