chiark / gitweb /
new OutBufferChain->empty feature
authorian <ian>
Tue, 15 Jul 2008 20:17:07 +0000 (20:17 +0000)
committerian <ian>
Tue, 15 Jul 2008 20:17:07 +0000 (20:17 +0000)
hostside/daemons.h
hostside/obc.c

index c103cdb0f63beb2cc38d743425b36967ca6f052a..9d1ae8757567dd49a0fd8e8e230cebd748744b2c 100644 (file)
@@ -21,6 +21,7 @@ typedef struct OutBufferChain OutBufferChain;
 typedef void OutBufferError(OutBufferChain*, const char *e1, const char *e2
                            /* on error: both e1 and e2 non-0. say `$e1: $e2'
                             * on eof: both e1 and e2 =0. */);
+typedef void OutBufferEmpty(OutBufferChain*);
 
 typedef void CopyCallBack(char *m, size_t l, void *u);
 
@@ -30,6 +31,7 @@ struct OutBufferChain {
   int fd;
   int limit; /* 0 means obc_init will set a default */
   OutBufferError *error;
+  OutBufferEmpty *empty; /* may be 0 */
   /* set/used by obc_..., oprintf, etc., only */
   int done_of_head, total;
   struct { OutBuffer *head, *tail; } obs;
index deedb7214e73c51c571704c59295b2d406ae4a64..2a04ce9ce1c6f75ab13ed3878c7f467520457a8a 100644 (file)
@@ -24,11 +24,8 @@ int obc_tryflush(OutBufferChain *ch) {
   
   for (;;) {
     ob= ch->obs.head;
-    if (!ob) {
-      if (events)
-       events->cancel_fd(events, ch->fd, OOP_WRITE);
+    if (!ob)
       return 0;
-    }
     if (ch->done_of_head == ob->l) {
       LIST_UNLINK(ch->obs, ob);
       free(ob->m);
@@ -56,6 +53,10 @@ static void *writeable(oop_source *evts, int fd,
   assert(fd == ch->fd);
   assert(evt == OOP_WRITE);
   obc_tryflush(ch);
+  if (evts && !ch->obs.head) {
+    events->cancel_fd(events, ch->fd, OOP_WRITE);
+    if (ch->empty) ch->empty(ch);
+  }
   return OOP_CONTINUE;
 }