From 6c7445ff5310993e00d6d3f226836a60378465fd Mon Sep 17 00:00:00 2001 From: Benoit Germain <bnt.germain@gmail.com> Date: Mon, 18 Nov 2013 10:41:32 +0100 Subject: Fix a deadlock when GCing during a linda operation. See issue #73. --- src/keeper.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/keeper.c b/src/keeper.c index 9affbdf..418b5fb 100644 --- a/src/keeper.c +++ b/src/keeper.c @@ -599,7 +599,9 @@ char const* init_keepers( lua_State* L) lua_rawset( K, LUA_REGISTRYINDEX); STACK_END( K, 0); - MUTEX_INIT( &GKeepers[i].lock_); + // we can trigger a GC from inside keeper_call(), where a keeper is acquired + // from there, GC can collect a linda, which would acquire the keeper again, and deadlock the thread. + MUTEX_RECURSIVE_INIT( &GKeepers[i].lock_); GKeepers[i].L = K; } #if HAVE_KEEPER_ATEXIT_DESINIT -- cgit v1.2.3-55-g6feb