aboutsummaryrefslogtreecommitdiff
path: root/src/keeper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/keeper.c')
-rw-r--r--src/keeper.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/src/keeper.c b/src/keeper.c
index 2404520..28dc338 100644
--- a/src/keeper.c
+++ b/src/keeper.c
@@ -63,6 +63,21 @@
63static struct s_Keeper *GKeepers = NULL; 63static struct s_Keeper *GKeepers = NULL;
64static int GNbKeepers = 0; 64static int GNbKeepers = 0;
65 65
66static void atexit_close_keepers(void)
67{
68 int i;
69 for( i = 0; i < GNbKeepers; ++ i)
70 {
71 lua_close( GKeepers[i].L);
72 GKeepers[i].L = 0;
73 //assert( GKeepers[i].count == 0);
74 MUTEX_FREE( &GKeepers[i].lock_);
75 }
76 if( GKeepers) free( GKeepers);
77 GKeepers = NULL;
78 GNbKeepers = 0;
79}
80
66/* 81/*
67* Initialize keeper states 82* Initialize keeper states
68* 83*
@@ -118,6 +133,9 @@ char const* init_keepers( int const _nbKeepers, lua_CFunction _on_state_create)
118 GKeepers[i].L = K; 133 GKeepers[i].L = K;
119 //GKeepers[i].count = 0; 134 //GKeepers[i].count = 0;
120 } 135 }
136 // call close_keepers at the very last as we want to be sure no thread is GCing after.
137 // (and therefore may perform linda object dereferencing after keepers are gone)
138 atexit( atexit_close_keepers);
121 return NULL; // ok 139 return NULL; // ok
122} 140}
123 141
@@ -264,18 +282,3 @@ int keeper_call( lua_State *K, char const *func_name, lua_State *L, void *linda,
264 lua_settop( K, Ktos); 282 lua_settop( K, Ktos);
265 return retvals; 283 return retvals;
266} 284}
267
268void close_keepers(void)
269{
270 int i;
271 for( i = 0; i < GNbKeepers; ++ i)
272 {
273 lua_close( GKeepers[i].L);
274 GKeepers[i].L = 0;
275 //assert( GKeepers[i].count == 0);
276 MUTEX_FREE( &GKeepers[i].lock_);
277 }
278 if( GKeepers) free( GKeepers);
279 GKeepers = NULL;
280 GNbKeepers = 0;
281}