chiark / gitweb /
improve deadlock section
[chiark-utils.git] / cprogs / wrbufcore.c
index 417cb01ac0cef44f7cc03c80f04f0120152fc857..7ed609a00ebfbe1fc97e3637de3a79dc9fcc7281 100644 (file)
 #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) {
@@ -51,6 +58,7 @@ 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);
   }
@@ -59,6 +67,7 @@ void wrbufcore_afterselect(int rdfd, int wrfd) {
     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 {
@@ -66,7 +75,10 @@ void wrbufcore_afterselect(int rdfd, int wrfd) {
       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) {