diff options
Diffstat (limited to '')
-rw-r--r-- | src/keeper.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/keeper.c b/src/keeper.c index 715583b..b67bee2 100644 --- a/src/keeper.c +++ b/src/keeper.c | |||
@@ -188,7 +188,7 @@ static void push_table( lua_State* L, int idx_) | |||
188 | 188 | ||
189 | int keeper_push_linda_storage( Universe* U, lua_State* L, void* ptr_, ptrdiff_t magic_) | 189 | int keeper_push_linda_storage( Universe* U, lua_State* L, void* ptr_, ptrdiff_t magic_) |
190 | { | 190 | { |
191 | Keeper* const K = keeper_acquire( U->keepers, magic_); | 191 | Keeper* const K = which_keeper( U->keepers, magic_); |
192 | lua_State* const KL = K ? K->L : NULL; | 192 | lua_State* const KL = K ? K->L : NULL; |
193 | if( KL == NULL) return 0; | 193 | if( KL == NULL) return 0; |
194 | STACK_GROW( KL, 4); | 194 | STACK_GROW( KL, 4); |
@@ -233,7 +233,6 @@ int keeper_push_linda_storage( Universe* U, lua_State* L, void* ptr_, ptrdiff_t | |||
233 | STACK_END( L, 1); | 233 | STACK_END( L, 1); |
234 | lua_pop( KL, 1); // | 234 | lua_pop( KL, 1); // |
235 | STACK_END( KL, 0); | 235 | STACK_END( KL, 0); |
236 | keeper_release( K); | ||
237 | return 1; | 236 | return 1; |
238 | } | 237 | } |
239 | 238 | ||
@@ -715,6 +714,14 @@ void init_keepers( Universe* U, lua_State* L) | |||
715 | STACK_END( L, 0); | 714 | STACK_END( L, 0); |
716 | } | 715 | } |
717 | 716 | ||
717 | // should be called only when inside a keeper_acquire/keeper_release pair (see linda_protected_call) | ||
718 | Keeper* which_keeper(Keepers* keepers_, ptrdiff_t magic_) | ||
719 | { | ||
720 | int const nbKeepers = keepers_->nb_keepers; | ||
721 | unsigned int i = (unsigned int)((magic_ >> KEEPER_MAGIC_SHIFT) % nbKeepers); | ||
722 | return &keepers_->keeper_array[i]; | ||
723 | } | ||
724 | |||
718 | Keeper* keeper_acquire( Keepers* keepers_, ptrdiff_t magic_) | 725 | Keeper* keeper_acquire( Keepers* keepers_, ptrdiff_t magic_) |
719 | { | 726 | { |
720 | int const nbKeepers = keepers_->nb_keepers; | 727 | int const nbKeepers = keepers_->nb_keepers; |