>
> Hi.
> I have a similar task - process incoming connections in different thread.
> And I don't have fixed set of working threads, they are started on demand
> and depending on settings which can, in particular, say to start new thread
> for each incoming connection.
> Creation and processing of pipe just to transfer socket inside one process
> is not trivial task. Sorry, but it looks rather ... over-engineered, to use
> this IPC method for inter-thread communication when without libuv the task
> is very simple - just pass accepted FD to new thread. Especially when there
> are many independent listening sockets (each can listen in different
> loop/thread). And also using a pipe makes accepting new connection rather
> long-timed task because requires several loop iterations.
My idea is to accept connections in one thread / loop (same as listening)
and then dup() accepted socket, close original accepted socket, pass dup'ed
socket to new thread / loop. On Unix this looks like:
uv_tcp_t *client_sock=new uv_tcp_t; //must not be local to be correctly
closed
uv_tcp_init(server->loop, client_sock);
uv_accept((uv_stream_t*)&server->sock, (uv_stream_t*)client_sock);
uv_os_fd_t client_fd, client_fd_dup;
uv_fileno((uv_handle_t*)client_sock, &client_fd);
client_fd_dup=dup(client_fd);
uv_close((uv_handle_t*)&client_sock, [](uv_handle_t* handle) -> void {
uv_tcp_t *client_sock=(uv_tcp_t *)handle;
delete client_sock;
});
//pass client_fd_dup to another thread immediately OR inside uv_close
callback
//and do "uv_tcp_open(&client->sock, client_fd_dup)" for client->sock which
was inited for loop of that thread
This method seams to work and be legal for libuv. Any problems to expect?
--
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.