projects
/
project
/
libubox.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ustream: avoid calling s->poll from a write path to avoid looping back through the...
[project/libubox.git]
/
ustream.c
diff --git
a/ustream.c
b/ustream.c
index
3295417
..
9c61806
100644
(file)
--- a/
ustream.c
+++ b/
ustream.c
@@
-104,7
+104,8
@@
static void ustream_state_change_cb(struct uloop_timeout *t)
if (s->write_error)
ustream_free_buffers(&s->w);
if (s->write_error)
ustream_free_buffers(&s->w);
- s->notify_state(s);
+ if (s->notify_state)
+ s->notify_state(s);
}
void ustream_init_defaults(struct ustream *s)
}
void ustream_init_defaults(struct ustream *s)
@@
-340,7
+341,7
@@
bool ustream_write_pending(struct ustream *s)
if (s->write_error)
return false;
if (s->write_error)
return false;
- while (buf) {
+ while (buf
&& s->w.data_bytes
) {
struct ustream_buf *next = buf->next;
int maxlen = buf->tail - buf->data;
struct ustream_buf *next = buf->next;
int maxlen = buf->tail - buf->data;
@@
-403,7
+404,7
@@
static int ustream_write_buffered(struct ustream *s, const char *data, int len,
int ustream_write(struct ustream *s, const char *data, int len, bool more)
{
struct ustream_buf_list *l = &s->w;
int ustream_write(struct ustream *s, const char *data, int len, bool more)
{
struct ustream_buf_list *l = &s->w;
- int wr;
+ int wr
= 0
;
if (s->write_error)
return 0;
if (s->write_error)
return 0;
@@
-434,6
+435,9
@@
int ustream_vprintf(struct ustream *s, const char *format, va_list arg)
va_list arg2;
int wr, maxlen, buflen;
va_list arg2;
int wr, maxlen, buflen;
+ if (s->write_error)
+ return 0;
+
if (!l->data_bytes) {
buf = alloca(MAX_STACK_BUFLEN);
va_copy(arg2, arg);
if (!l->data_bytes) {
buf = alloca(MAX_STACK_BUFLEN);
va_copy(arg2, arg);
@@
-492,6
+496,9
@@
int ustream_printf(struct ustream *s, const char *format, ...)
va_list arg;
int ret;
va_list arg;
int ret;
+ if (s->write_error)
+ return 0;
+
va_start(arg, format);
ret = ustream_vprintf(s, format, arg);
va_end(arg);
va_start(arg, format);
ret = ustream_vprintf(s, format, arg);
va_end(arg);