[Libwebsockets] Write notification
andy at warmcat.com
Thu Nov 5 11:34:45 CET 2020
On 11/5/20 10:15 AM, Mykola Stryebkov wrote:
> I’m working with minimal-ws-server-threads-foreign-smp and I need to let now a connection it has data to send out. And I need to do it from receive callback of another connection. Which in general case is handled in another service thread.
> In the example I see the following code:
> if (lws_wsi_tsi((*pconn)->wsi) == lws_wsi_tsi(wsi))
> Is there a thread-safe way to let know a connection that it has data to send out if I use libuv foreign loops?
libuv or foreign or lws owns the loop aren't really relevant, it's the
same situation however you set up LWS_MAX_SMP > 1 and create n
per_threads / loops.
One event loop thread can't safely directly change the state of what's
basically the POLLOUT wait event from another... the target event loop
may already be in a wait and ignore the change (linux) or overwrite the
change withthe old .events mask when it comes out of the wait (BSDs).
The basic, robust solution is a shared linked-list "queue" object
protected by your own locking that threads use to ask other event loops
to do jobs for them. You lock it, add things you want the other event
loop to do on its tail, unlock it and use lws_cancel_service() or
lws_cancel_service_pt() to signal to the target there is something to do.
As soon as they are able (waking from their wait if necessary) the
protocols see a LWS_CALLBACK_EVENT_WAIT_CANCELLED from each event loop
context they exist on, and can check if anything in their queue and do
it from the correct thread context.
You must take care that on _CLOSE callback, the shared objects are
locked and the closing wsi is removed from any lists and the "job queue"
is cleaned out from any references of it too.
More information about the Libwebsockets