Hi,

I cannot figure out how to achieve the following: to add a new uv_tcp_t to 
already active uv loop which is presently blocked on IO.

In detail:

My uv event loop is invoked as UV_RUN_DEFAULT.  This is managing the IO for 
a single TCP connection which was actively established as follows:

  uv_connect_t connect_req;
  struct sockaddr_in addr;
  uv_ip4_addr("127.0.0.1", 40001, &addr);
  uv_tcp_init(uv_default_loop(), &tcp_handle_1);
  uv_tcp_connect(&connect_req,
                 &tcp_handle_1,
                 (const struct sockaddr*) &addr,
                 connect_cb);
  uv_run(uv_default_loop(), UV_RUN_DEFAULT);


In the connect_cb() the read is enabled:

static void connect_cb(uv_connect_t* req, int status)
{
  uv_read_start(req->handle, alloc_buffer, on_read);
}


Nothing surprising so far, and all works ; this is a single actively 
established socket which can read from other side.

Next, slightly later, and in a separate thread, I wish to create a new 
uv_tcp_t handle and add that to the loop, so I do the same (just changing 
the handle variable):

  uv_connect_t connect_req;
  struct sockaddr_in addr;
  uv_ip4_addr("127.0.0.1", 40002, &addr);
  uv_tcp_init(uv_default_loop(), &*tcp_handle_2*);
  uv_tcp_connect(&connect_req,
                 &*tcp_handle_2*,
                 (const struct sockaddr*) &addr,
                 connect_cb);


Now the problem I encounter is that while I do see a connection is made to 
127.0.0.1:40002, this second stream (tcp_handle_2) does not read from the 
socket.  In fact it will read, but only after some bytes have arrived on 
the first connection.

I think the problem is that the uv event loop is blocked in the IO; so when 
tcp_handle_2 is added, the uv loop does not immediately call the 
connect_cb() to set up the stream reading.  The uv loop remains blocked 
until bytes appears on tcp_handle_1, at which point the connect_cb() for 
tcp_handle_2 is called and then reads can take place.

So what's the best approach to resolve this?  I would like to have a single 
uv event loop to manage many actively established connections, but I have 
not found a way to interrupt an io-blocked uv loop so that it can deliver 
the callbacks associated with setting up a new connection.  One possible 
approach would be to use an idler, however if I try that, I see CPU use 
rise to 100%.  Another approach might be to use something like socketpair 
to manually interrupt the uv loop; but I've not yet found that in libuv.

Help appreciated. Thanks,

Darren

-- 
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 post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/libuv.
For more options, visit https://groups.google.com/d/optout.

Reply via email to