diff options
Diffstat (limited to 'src/keeper.c')
-rw-r--r-- | src/keeper.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/src/keeper.c b/src/keeper.c index bd232cd..c9b2039 100644 --- a/src/keeper.c +++ b/src/keeper.c | |||
@@ -70,7 +70,7 @@ typedef struct | |||
70 | static keeper_fifo* prepare_fifo_access( lua_State* L, int idx) | 70 | static keeper_fifo* prepare_fifo_access( lua_State* L, int idx) |
71 | { | 71 | { |
72 | keeper_fifo* fifo = (keeper_fifo*) lua_touserdata( L, idx); | 72 | keeper_fifo* fifo = (keeper_fifo*) lua_touserdata( L, idx); |
73 | if( fifo) | 73 | if( fifo != NULL) |
74 | { | 74 | { |
75 | idx = lua_absindex( L, idx); | 75 | idx = lua_absindex( L, idx); |
76 | STACK_GROW( L, 1); | 76 | STACK_GROW( L, 1); |
@@ -286,15 +286,15 @@ int keepercall_receive( lua_State* L) | |||
286 | { | 286 | { |
287 | int top = lua_gettop( L); | 287 | int top = lua_gettop( L); |
288 | int i; | 288 | int i; |
289 | keeper_fifo* fifo; | ||
290 | push_table( L, 1); // ud keys fifos | 289 | push_table( L, 1); // ud keys fifos |
291 | lua_replace( L, 1); // fifos keys | 290 | lua_replace( L, 1); // fifos keys |
292 | for( i = 2; i <= top; ++ i) | 291 | for( i = 2; i <= top; ++ i) |
293 | { | 292 | { |
293 | keeper_fifo* fifo; | ||
294 | lua_pushvalue( L, i); // fifos keys key[i] | 294 | lua_pushvalue( L, i); // fifos keys key[i] |
295 | lua_rawget( L, 1); // fifos keys fifo | 295 | lua_rawget( L, 1); // fifos keys fifo |
296 | fifo = prepare_fifo_access( L, -1); // fifos keys fifo | 296 | fifo = prepare_fifo_access( L, -1); // fifos keys fifo |
297 | if( fifo && fifo->count > 0) | 297 | if( fifo != NULL && fifo->count > 0) |
298 | { | 298 | { |
299 | fifo_pop( L, fifo, 1); // fifos keys val | 299 | fifo_pop( L, fifo, 1); // fifos keys val |
300 | if( !lua_isnil( L, -1)) | 300 | if( !lua_isnil( L, -1)) |
@@ -332,7 +332,7 @@ int keepercall_receive_batched( lua_State* L) | |||
332 | lua_rawget( L, 2); // key fifos fifo | 332 | lua_rawget( L, 2); // key fifos fifo |
333 | lua_remove( L, 2); // key fifo | 333 | lua_remove( L, 2); // key fifo |
334 | fifo = prepare_fifo_access( L, 2); // key fifo | 334 | fifo = prepare_fifo_access( L, 2); // key fifo |
335 | if( fifo && fifo->count >= min_count) | 335 | if( fifo != NULL && fifo->count >= min_count) |
336 | { | 336 | { |
337 | fifo_pop( L, fifo, __min( max_count, fifo->count)); // key ... | 337 | fifo_pop( L, fifo, __min( max_count, fifo->count)); // key ... |
338 | } | 338 | } |
@@ -360,7 +360,7 @@ int keepercall_limit( lua_State* L) | |||
360 | lua_pushvalue( L, -1); // fifos key key | 360 | lua_pushvalue( L, -1); // fifos key key |
361 | lua_rawget( L, -3); // fifos key fifo | 361 | lua_rawget( L, -3); // fifos key fifo |
362 | fifo = (keeper_fifo*) lua_touserdata( L, -1); | 362 | fifo = (keeper_fifo*) lua_touserdata( L, -1); |
363 | if( !fifo) | 363 | if( fifo == NULL) |
364 | { | 364 | { |
365 | lua_pop( L, 1); // fifos key | 365 | lua_pop( L, 1); // fifos key |
366 | fifo_new( L); // fifos key fifo | 366 | fifo_new( L); // fifos key fifo |
@@ -437,7 +437,7 @@ int keepercall_get( lua_State* L) | |||
437 | lua_replace( L, 1); // fifos key | 437 | lua_replace( L, 1); // fifos key |
438 | lua_rawget( L, 1); // fifos fifo | 438 | lua_rawget( L, 1); // fifos fifo |
439 | fifo = prepare_fifo_access( L, -1); // fifos fifo | 439 | fifo = prepare_fifo_access( L, -1); // fifos fifo |
440 | if( fifo && fifo->count > 0) | 440 | if( fifo != NULL && fifo->count > 0) |
441 | { | 441 | { |
442 | lua_remove( L, 1); // fifo | 442 | lua_remove( L, 1); // fifo |
443 | // read one value off the fifo | 443 | // read one value off the fifo |
@@ -497,7 +497,7 @@ int keepercall_count( lua_State* L) | |||
497 | lua_rawget( L, 2); // out fifos keys fifo | 497 | lua_rawget( L, 2); // out fifos keys fifo |
498 | fifo = prepare_fifo_access( L, -1); // out fifos keys fifo | 498 | fifo = prepare_fifo_access( L, -1); // out fifos keys fifo |
499 | lua_pop( L, 1); // out fifos keys | 499 | lua_pop( L, 1); // out fifos keys |
500 | if( fifo) | 500 | if( fifo != NULL) |
501 | { | 501 | { |
502 | lua_pushinteger( L, fifo->count); // out fifos keys count | 502 | lua_pushinteger( L, fifo->count); // out fifos keys count |
503 | lua_rawset( L, 1); // out fifos keys | 503 | lua_rawset( L, 1); // out fifos keys |
@@ -540,14 +540,17 @@ void close_keepers( void) | |||
540 | for( i = 0; i < GNbKeepers; ++ i) | 540 | for( i = 0; i < GNbKeepers; ++ i) |
541 | { | 541 | { |
542 | lua_State* L = GKeepers[i].L; | 542 | lua_State* L = GKeepers[i].L; |
543 | GKeepers[i].L = 0; | 543 | GKeepers[i].L = NULL; |
544 | lua_close( L); | 544 | lua_close( L); |
545 | } | 545 | } |
546 | for( i = 0; i < GNbKeepers; ++ i) | 546 | for( i = 0; i < GNbKeepers; ++ i) |
547 | { | 547 | { |
548 | MUTEX_FREE( &GKeepers[i].lock_); | 548 | MUTEX_FREE( &GKeepers[i].lock_); |
549 | } | 549 | } |
550 | if( GKeepers) free( GKeepers); | 550 | if( GKeepers != NULL) |
551 | { | ||
552 | free( GKeepers); | ||
553 | } | ||
551 | GKeepers = NULL; | 554 | GKeepers = NULL; |
552 | GNbKeepers = 0; | 555 | GNbKeepers = 0; |
553 | } | 556 | } |
@@ -560,20 +563,29 @@ void close_keepers( void) | |||
560 | * Note: Any problems would be design flaws; the created Lua state is left | 563 | * Note: Any problems would be design flaws; the created Lua state is left |
561 | * unclosed, because it does not really matter. In production code, this | 564 | * unclosed, because it does not really matter. In production code, this |
562 | * function never fails. | 565 | * function never fails. |
566 | * settings table is at position 1 on the stack | ||
563 | */ | 567 | */ |
564 | char const* init_keepers( lua_State* L, int _on_state_create, int const _nbKeepers) | 568 | char const* init_keepers( lua_State* L) |
565 | { | 569 | { |
566 | int i; | 570 | int i, on_state_create; |
567 | assert( _nbKeepers >= 1); | 571 | STACK_CHECK( L); |
568 | GNbKeepers = _nbKeepers; | 572 | lua_getfield( L, 1, "nb_keepers"); |
569 | GKeepers = malloc( _nbKeepers * sizeof( struct s_Keeper)); | 573 | GNbKeepers = lua_tointeger( L, -1); |
570 | for( i = 0; i < _nbKeepers; ++ i) | 574 | lua_pop( L, 1); |
575 | STACK_MID( L, 0); | ||
576 | assert( GNbKeepers >= 1); | ||
577 | |||
578 | lua_getfield( L, 1, "on_state_create"); | ||
579 | on_state_create = lua_isnil( L, -1) ? -1 : lua_absindex( L, -1); | ||
580 | |||
581 | GKeepers = malloc( GNbKeepers * sizeof( struct s_Keeper)); | ||
582 | for( i = 0; i < GNbKeepers; ++ i) | ||
571 | { | 583 | { |
572 | lua_State* K; | 584 | lua_State* K; |
573 | DEBUGSPEW_CODE( fprintf( stderr, INDENT_BEGIN "### init_keepers %d BEGIN\n" INDENT_END, i)); | 585 | DEBUGSPEW_CODE( fprintf( stderr, INDENT_BEGIN "### init_keepers %d BEGIN\n" INDENT_END, i)); |
574 | DEBUGSPEW_CODE( ++ debugspew_indent_depth); | 586 | DEBUGSPEW_CODE( ++ debugspew_indent_depth); |
575 | // we don't need any libs in the keeper states | 587 | // we don't need any libs in the keeper states |
576 | K = luaG_newstate( L, _on_state_create, NULL); | 588 | K = luaG_newstate( L, on_state_create, NULL); |
577 | 589 | ||
578 | STACK_CHECK( K); | 590 | STACK_CHECK( K); |
579 | 591 | ||
@@ -596,6 +608,8 @@ char const* init_keepers( lua_State* L, int _on_state_create, int const _nbKeepe | |||
596 | GKeepers[i].L = K; | 608 | GKeepers[i].L = K; |
597 | //GKeepers[i].count = 0; | 609 | //GKeepers[i].count = 0; |
598 | } | 610 | } |
611 | lua_pop( L, 1); | ||
612 | STACK_END( L, 0); | ||
599 | #if HAVE_KEEPER_ATEXIT_DESINIT | 613 | #if HAVE_KEEPER_ATEXIT_DESINIT |
600 | atexit( atexit_close_keepers); | 614 | atexit( atexit_close_keepers); |
601 | #endif // HAVE_KEEPER_ATEXIT_DESINIT | 615 | #endif // HAVE_KEEPER_ATEXIT_DESINIT |