Signed-off-by: Yousong Zhou <yszhou4t...@gmail.com>
---
 ustream.c |   20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/ustream.c b/ustream.c
index 64cdc6a..1d0c38e 100644
--- a/ustream.c
+++ b/ustream.c
@@ -364,6 +364,17 @@ static void ustream_write_error(struct ustream *s)
        s->write_error = true;
 }
 
+static int ustream_call_write_cb(struct ustream *s, const char *data, int len, 
bool more)
+{
+       int bytes;
+
+       bytes = s->write(s, data, len, more);
+       if (s->notify_write && bytes > 0)
+               s->notify_write(s, bytes);
+
+       return bytes;
+}
+
 bool ustream_write_pending(struct ustream *s)
 {
        struct ustream_buf *buf = s->w.head;
@@ -376,7 +387,7 @@ bool ustream_write_pending(struct ustream *s)
                struct ustream_buf *next = buf->next;
                int maxlen = buf->tail - buf->data;
 
-               len = s->write(s, buf->data, maxlen, !!buf->next);
+               len = ustream_call_write_cb(s, buf->data, maxlen, !!buf->next);
                if (len < 0) {
                        ustream_write_error(s);
                        break;
@@ -396,9 +407,6 @@ bool ustream_write_pending(struct ustream *s)
                buf = next;
        }
 
-       if (s->notify_write)
-               s->notify_write(s, wr);
-
        if (s->eof && wr && !s->w.data_bytes)
                ustream_state_change(s);
 
@@ -441,7 +449,7 @@ int ustream_write(struct ustream *s, const char *data, int 
len, bool more)
                return 0;
 
        if (!l->data_bytes) {
-               wr = s->write(s, data, len, more);
+               wr = ustream_call_write_cb(s, data, len, more);
                if (wr == len)
                        return wr;
 
@@ -475,7 +483,7 @@ int ustream_vprintf(struct ustream *s, const char *format, 
va_list arg)
                maxlen = vsnprintf(buf, MAX_STACK_BUFLEN, format, arg2);
                va_end(arg2);
                if (maxlen < MAX_STACK_BUFLEN) {
-                       wr = s->write(s, buf, maxlen, false);
+                       wr = ustream_call_write_cb(s, buf, maxlen, false);
                        if (wr < 0) {
                                ustream_write_error(s);
                                return wr;
-- 
1.7.10.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to