Am 01.10.2014 um 14:40 schrieb Rob Hoelz: > Hello Awesome developers, Hi Rob,
> I've encountered an interesting behavior in Awesome while playing with > coroutines and timers (in an effort to develop a framework where one > can write synchronous-looking code that runs in an asynchronous > fashion). In short, I am able to make Awesome segfault when using > certain Awesome API functions from within a coroutine. At least here it doesn't segfault, but die from an unprotected Lua error. That may not make much of a difference to you, but to me it's quite a big one. > Here's some example code: > > local sd = require 'sleep-dealer' > local notify = require('naughty').notify > > sd.tuck_in(function() > for i = 1, 5 do > sd.sleep(1) > notify { > title = 'Alert!', > text = tostring(i), > } > end > end) Urgh, complicated. Thanks for your simpler example from the other mail in this thread: local co = coroutine.create(function() notify { title = 'Alert!', text = 'hello' } end) coroutine.resume(co) [...] > When naughty.notify is called, a segfault occurs. I've determined that > this is because globalconf.L is used in a lot of Lua API calls. > Sometimes the Lua state passed into a function is really the state > corresponding to a coroutine, so the states don't match and Lua panics. Yeah, but nothing crashes! :P > I bring this up here on the mailing list rather than fixing it myself > or filing a bug because I wanted to take the pulse of the developer > community on whether this is a true bug or if this is doing something > with Awesome that it wasn't intended for. If it's the latter, I can > let the matter rest; if it's the former, I would be happy to contribute > a patch that fixes the problem. Sorry for not replying sooner. I've been busy. Thanks to you I learned something about Lua and I already went ahead and fixed the problem. I went through all uses of globalconf.L in awesome and checked them: https://github.com/awesomeWM/awesome/commit/f957764e522253007dbb7ecf5abf869bd38b70e2 https://github.com/awesomeWM/awesome/commit/4cfea189f04e3133c87b36ef26229abaa4ab7eb2 https://github.com/awesomeWM/awesome/commit/d668268591c9854184583fffe58b945f8a9398d9 https://github.com/awesomeWM/awesome/commit/da15317ac2e299f3c1b3833b2c5b198d2d7df5ab If anyone has a good idea on how to make it harder to introduce this kind of error in the future, please speak up. I guess it would at least be a good idea to never use globalconf.L directly and instead force the code to create a local variable lua_State *L and use that. That way, there are less places where globalconf.L is used plus the compiler warns if there are two variables with name "L" in scope... I guess I'll implement that. Cheers, Uli -- "In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move." -- To unsubscribe, send mail to awesome-devel-unsubscr...@naquadah.org.