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);
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;
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);
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;
}