In libuv v1.x (963ecc82) in Windows 10, I noticed that 'uv_read_start'
over a 'uv_tty_t' calls the 'uv_alloc_cb' before it returns. The same
does not seem to happen in Linux, nor even in Windows if we use other
'uv_tcp_t' ir 'uv_pipe_t'. Is this expected?
It was a problem for me because my code only sets up the environment
for the callback if 'uv_read_start' returns successfully (err >= 0).
Also, from the way the general design of the event loop of libuv is
described (http://docs.libuv.org/en/v1.x/design.html), I was surprised
that callbacks can be invoked inside an API call.
I attached a small example to reproduce this scenario. On Linux, it
works as expected:
```
libuv_ttyinlineread.c:38:main(server started!)
I type this line
libuv_ttyinlineread.c:14:on_alloc(size=65536)
libuv_ttyinlineread.c:9:on_read(nread=17)
```
But on Windows 10, I get this:
```
libuv_ttyinlineread.c:14:on_alloc(size=8192)
Assertion failed: handle->data, file libuv_ttyinlineread.c, line 15
```
Thanks in advance.
--
Renato Maia
--
You received this message because you are subscribed to the Google Groups
"libuv" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/libuv/CAB-PuDqxTkLpXMwh52Z7Z%3DuCMTceY2S9OpYk8SjZecvV1KzizQ%40mail.gmail.com.
#include <assert.h>
#include <uv.h>
#define BUFFER_SIZE 1024
#define log(F,V) printf("%s:%d:%s("F")\n", __FILE__, __LINE__, __func__, V);
static void on_read (uv_stream_t *stream, ssize_t nread, const uv_buf_t *buffer)
{
log("nread=%zd", nread);
}
static void on_alloc (uv_handle_t *handle, size_t suggested_size, uv_buf_t
*buffer)
{
log("size=%zd", suggested_size);
assert(handle->data);
buffer->base = handle->data;
buffer->len = BUFFER_SIZE;
}
int main(int argc, char const *argv[])
{
uv_loop_t loop;
uv_tty_t stdin_tty;
int err;
char buffer[BUFFER_SIZE];
err = uv_loop_init(&loop);
assert(err >= 0);
err = uv_tty_init(&loop, &stdin_tty, 0, 0);
assert(err >= 0);
stdin_tty.data = NULL;
err = uv_read_start((uv_stream_t *)&stdin_tty, on_alloc, on_read);
assert(err >= 0);
stdin_tty.data = buffer;
log("%s", "server started!");
err = uv_run(&loop, UV_RUN_DEFAULT);
assert(err >= 0);
return 0;
}