[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Lua callback in another thread
- From: Daurnimator <quae@...>
- Date: Fri, 22 Apr 2016 16:52:06 +1000
On 22 April 2016 at 15:08, Thijs Schreijer <thijs@thijsschreijer.nl> wrote:
> I had the same issue long ago with the PUPnP library, hence I wrote
> “darksidesync” [1], which signals the main thread using a udp packet (or
> just by polling). Not the most elegant solution, but works and is very
> portable (though I think the Windows build is broken right now)
>
>
>
> Thijs
>
>
>
> [1] http://tieske.github.io/DarkSideSync/topics/readme.md.html
>
>
>
> Van: lua-l-bounces@lists.lua.org [mailto:lua-l-bounces@lists.lua.org] Namens
> Laurent FAILLIE
> Verzonden: Wednesday, 20 April, 2016 11:33
> Aan: Lua Mailing List
> Onderwerp: Lua callback in another thread
>
>
>
> Hello,
>
>
>
> I have a C multi-threaded program using Lua as user end scripting language (
> https://github.com/destroyedlolo/Selene , I already presented some months
> back :) ).
>
>
>
> My main thread is used also to declare some Lua callbacks needs to be called
> when an MQTT data arrived. So I keep a reference to this function using
> classical luaL_ref().
>
>
>
> Now, my problem : an MQTT data arrives and is handled by another thread, on
> which I need to created a dedicated Lua_State for this newly created thread.
> But how can I retrieve then launch this function in the new lua_state.
>
> Because, for the moment, I'm retrieving the function from the main state,
> using xmove() it to the new one and this call it ... obviously, it's
> crashing as the main state may be busy by other tasks.
>
> In addition, I don't want to block the main thread using mutex as I don't
> want to have to rely on main thead activities.
>
>
>
> So any idea welcome :)
Infact, sending a packet to a socket *is* actually the best option for
this sort of thing.
On linux, you have a special fast kernel provided file descriptor type
'eventfd' just for this purpose.
In general, you can fall back to using a pipe() or socketpair() and
writing a single byte so that the other end polls readable.