aboutsummaryrefslogtreecommitdiff
path: root/src/keeper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/keeper.c')
-rw-r--r--src/keeper.c46
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
70static keeper_fifo* prepare_fifo_access( lua_State* L, int idx) 70static 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*/
564char const* init_keepers( lua_State* L, int _on_state_create, int const _nbKeepers) 568char 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