diff options
Diffstat (limited to 'src/keeper.c')
-rw-r--r-- | src/keeper.c | 33 |
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 @@ | |||
63 | static struct s_Keeper *GKeepers = NULL; | 63 | static struct s_Keeper *GKeepers = NULL; |
64 | static int GNbKeepers = 0; | 64 | static int GNbKeepers = 0; |
65 | 65 | ||
66 | static 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 | |||
268 | void 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 | } | ||