Skip to content

Commit

Permalink
ustream: prevent recursive calls to the read callback
Browse files Browse the repository at this point in the history
Simplifies stacked ustreams and calling poll from the read function.
Reuse an unused leftover struct member in order to not break ABI.

Signed-off-by: Felix Fietkau <[email protected]>
  • Loading branch information
nbd168 committed Mar 29, 2024
1 parent 12bda4b commit eb9bcb6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
14 changes: 10 additions & 4 deletions ustream.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

#include "ustream.h"

#define CB_PENDING_READ (1 << 0)

static void ustream_init_buf(struct ustream_buf *buf, int len)
{
if (!len)
Expand Down Expand Up @@ -133,7 +135,6 @@ void ustream_init_defaults(struct ustream *s)
s->state_change.cb = ustream_state_change_cb;
s->write_error = false;
s->eof = false;
s->eof_write_done = false;
s->read_blocked = 0;

s->r.buffers = 0;
Expand Down Expand Up @@ -301,7 +302,6 @@ char *ustream_reserve(struct ustream *s, int len, int *maxlen)
void ustream_fill_read(struct ustream *s, int len)
{
struct ustream_buf *buf = s->r.data_tail;
int n = len;
int maxlen;

s->r.data_bytes += len;
Expand All @@ -321,8 +321,14 @@ void ustream_fill_read(struct ustream *s, int len)
buf = buf->next;
} while (len);

if (s->notify_read)
s->notify_read(s, n);
if (s->notify_read) {
if (s->pending_cb & CB_PENDING_READ)
return;

s->pending_cb |= CB_PENDING_READ;
s->notify_read(s, s->r.data_bytes);
s->pending_cb &= ~CB_PENDING_READ;
}
}

char *ustream_get_read_buf(struct ustream *s, int *buflen)
Expand Down
3 changes: 2 additions & 1 deletion ustream.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,8 @@ struct ustream {
*/
bool string_data;
bool write_error;
bool eof, eof_write_done;
bool eof;
uint8_t pending_cb;

enum read_blocked_reason read_blocked;
};
Expand Down

0 comments on commit eb9bcb6

Please sign in to comment.