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