chiark / gitweb /
working on trivsoundd
[chiark-utils.git] / cprogs / wrbufcore.c
index 260f6d2..417cb01 100644 (file)
@@ -27,6 +27,8 @@
  *
  */
 
+#include "rwbuffer.h"
+
 static size_t waitfill;
 static int writing;
 
@@ -35,44 +37,46 @@ void wrbufcore_startup(void) {
   writing=0;
 }
 
-void wrbufcore_mainloop(void) {
-  int r;
+void wrbufcore_prepselect(int rdfd, int wrfd) {
+  FD_ZERO(&readfds);
+  if (rdfd>=0 && !seeneof && used+1<buffersize) FD_SET(rdfd,&readfds);
 
-  while (!seeneof || used) {
-    
-    FD_ZERO(&readfds); if (!seeneof && used+1<buffersize) FD_SET(0,&readfds);
-    FD_ZERO(&writefds); if (writing) FD_SET(1,&writefds);
+  FD_ZERO(&writefds);
+  if (writing) FD_SET(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) {
+    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;
+    } 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 (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;
     }
   }
 }