[noPoll] Integration with existing IO loop

Tony Mountifield tony en softins.co.uk
Jue Abr 6 11:07:20 CEST 2017

In article <823e6a9a-f2bd-8b08-6db6-c4d03e277533 at fetcorp.com>,
Dave Gilmour (FET) <dave at fetcorp.com> wrote:
> I am attempting to integrate nopoll into an existing IO loop because I 
> have other sockets that I must also look after.  I am having an issue 
> with my first call to nopoll_conn_get_msg blocking.
> [...]
> I get an event on the connected socket and call nopoll_conn_get_msg 
> (ws_client_conn);
> My problem is this call does not return. I have tracked it down to the 
> following line of code in nopoll_conn.c:
> /* get the first 2 bytes from the websocket header */
> bytes = __nopoll_conn_receive (conn, buffer, 2); <<<<<<<<<<<<<<this call 
> blocks
> The problem is that when this happens I am not servicing any of my other 
> sockets any more. Once a message is passed either from the client to the 
> server or vice versa everything seems to go ahead without a problem. So 
> my question is, what is nopoll waiting for at this point and how can I 
> avoid the blocking.

Are you setting the connected socket to non-blocking?

if (! nopoll_conn_set_sock_block(nopoll_conn_socket(conn), nopoll_false)) {
	// handle error

I do so in my on_ready handler.

Presumably, if you are handling the sockets yourself, you are completing the accept
as described in section 2.2. of http://www.aspl.es/nopoll/html/nopoll_core_library_manual.html

Another approach might be to have one thread servicing the nopoll sockets
using nopoll_loop_wait(), and another thread servicing the non-nopoll sockets.
You might still need to set the socket to non-blocking.

Disclaimer: I'm still pretty new to nopoll, and climbing the learning curve!

Tony Mountifield
Work: tony at softins.co.uk - http://www.softins.co.uk
Play: tony at mountifield.org - http://tony.mountifield.org

Más información sobre la lista de distribución noPoll