Lines Matching refs:fgen

8 static mcp_funcgen_t *mcp_funcgen_route(lua_State *L, mcp_funcgen_t *fgen, mcp_parser_t *pr);
9 static int mcp_funcgen_router_cleanup(lua_State *L, mcp_funcgen_t *fgen);
10 static void _mcplib_funcgen_cache(mcp_funcgen_t *fgen, mcp_rcontext_t *rctx);
11 static void mcp_funcgen_cleanup(lua_State *L, mcp_funcgen_t *fgen);
33 mcp_funcgen_t *fgen = luaL_checkudata(L, -1, "mcp.funcgen"); in mcplib_funcgen_gc() local
34 if (fgen->closed) { in mcplib_funcgen_gc()
37 assert(fgen->self_ref == 0); in mcplib_funcgen_gc()
39 mcp_funcgen_cleanup(L, fgen); in mcplib_funcgen_gc()
40 fgen->closed = true; in mcplib_funcgen_gc()
78 static void mcp_rcontext_cleanup(lua_State *L, mcp_funcgen_t *fgen, mcp_rcontext_t *rctx, int fgen_… in mcp_rcontext_cleanup() argument
87 for (int x = 0; x < fgen->max_queues; x++) { in mcp_rcontext_cleanup()
94 lua_rawgeti(L, LUA_REGISTRYINDEX, subrctx->fgen->self_ref); in mcp_rcontext_cleanup()
95 mcp_rcontext_cleanup(L, subrctx->fgen, subrctx, lua_absindex(L, -1)); in mcp_rcontext_cleanup()
123 fgen->total--; in mcp_rcontext_cleanup()
128 mcp_sharedvm_delta(t->proxy_ctx, SHAREDVM_FGENSLOT_IDX, fgen->name, -1); in mcp_rcontext_cleanup()
144 static void _mcplib_funcgen_cache(mcp_funcgen_t *fgen, mcp_rcontext_t *rctx) { in _mcplib_funcgen_cache() argument
158 if (fgen->free > fgen->total/2 - 1) { in _mcplib_funcgen_cache()
159 if (fgen->free_pressure++ > FGEN_FREE_PRESSURE_MAX) { in _mcplib_funcgen_cache()
162 if (fgen->free_waiter.tv_sec == 0) { in _mcplib_funcgen_cache()
163 fgen->free_waiter.tv_sec = now.tv_sec + FGEN_FREE_WAIT; in _mcplib_funcgen_cache()
166 if (now.tv_sec >= fgen->free_waiter.tv_sec) { in _mcplib_funcgen_cache()
170 fgen->free_pressure -= FGEN_FREE_PRESSURE_DROP; in _mcplib_funcgen_cache()
173 fgen->free_pressure >>= 1; in _mcplib_funcgen_cache()
175 fgen->free_waiter.tv_sec = 0; in _mcplib_funcgen_cache()
179 if (fgen->free + 1 >= fgen->free_max) { in _mcplib_funcgen_cache()
180 int x = fgen->free_max; in _mcplib_funcgen_cache()
181 fgen->free_max *= 2; in _mcplib_funcgen_cache()
182 fgen->list = realloc(fgen->list, fgen->free_max * sizeof(mcp_rcontext_t *)); in _mcplib_funcgen_cache()
183 for (; x < fgen->free_max; x++) { in _mcplib_funcgen_cache()
184 fgen->list[x] = NULL; in _mcplib_funcgen_cache()
187 fgen->list[fgen->free] = rctx; in _mcplib_funcgen_cache()
188 fgen->free++; in _mcplib_funcgen_cache()
191 assert(fgen->self_ref); in _mcplib_funcgen_cache()
192 lua_State *L = fgen->thread->L; in _mcplib_funcgen_cache()
193 lua_rawgeti(L, LUA_REGISTRYINDEX, fgen->self_ref); in _mcplib_funcgen_cache()
194 mcp_rcontext_cleanup(L, fgen, rctx, lua_absindex(L, -1)); in _mcplib_funcgen_cache()
200 if (fgen->closed && fgen->free == fgen->total) { in _mcplib_funcgen_cache()
201 mcp_funcgen_cleanup(fgen->thread->L, fgen); in _mcplib_funcgen_cache()
207 mcp_funcgen_t *fgen = luaL_checkudata(L, -2, "mcp.funcgen"); in _mcplib_funcgen_gencall() local
210 size_t rctx_len = sizeof(mcp_rcontext_t) + sizeof(struct mcp_rqueue_s) * fgen->max_queues; in _mcplib_funcgen_gencall()
217 rc->fgen = fgen; in _mcplib_funcgen_gencall()
221 for (int x = 0; x < fgen->max_queues; x++) { in _mcplib_funcgen_gencall()
222 struct mcp_rqueue_s *frqu = &fgen->queue_list[x]; in _mcplib_funcgen_gencall()
228 mcp_resp_t *r = mcp_prep_bare_resobj(L, fgen->thread); in _mcplib_funcgen_gencall()
268 if (fgen->argument_ref) { in _mcplib_funcgen_gencall()
269 lua_rawgeti(L, LUA_REGISTRYINDEX, fgen->argument_ref); in _mcplib_funcgen_gencall()
287 fgen->total++; in _mcplib_funcgen_gencall()
295 _mcplib_funcgen_cache(fgen, rc); in _mcplib_funcgen_gencall()
304 mcp_sharedvm_delta(t->proxy_ctx, SHAREDVM_FGENSLOT_IDX, fgen->name, 1); in _mcplib_funcgen_gencall()
315 mcp_funcgen_t *fgen = rctx->fgen; in _mcp_funcgen_return_rctx() local
326 lua_State *L = fgen->thread->L; in _mcp_funcgen_return_rctx()
338 mcp_request_cleanup(fgen->thread, rctx->request); in _mcp_funcgen_return_rctx()
347 for (int x = 0; x < fgen->max_queues; x++) { in _mcp_funcgen_return_rctx()
352 mcp_response_cleanup(fgen->thread, rqu->res_obj); in _mcp_funcgen_return_rctx()
377 mcp_funcgen_t *fgen = rctx->fgen; in mcp_funcgen_return_rctx() local
392 WSTAT_DECR(rctx->fgen->thread, proxy_req_active, 1); in mcp_funcgen_return_rctx()
394 _mcplib_funcgen_cache(fgen, rctx); in mcp_funcgen_return_rctx()
397 mcp_rcontext_t *mcp_funcgen_get_rctx(lua_State *L, int fgen_ref, mcp_funcgen_t *fgen) { in mcp_funcgen_get_rctx() argument
400 if (fgen->free == 0) { in mcp_funcgen_get_rctx()
402 fgen->free_pressure = 0; in mcp_funcgen_get_rctx()
403 fgen->free_waiter.tv_sec = 0; in mcp_funcgen_get_rctx()
409 lua_rawgeti(L, LUA_REGISTRYINDEX, fgen->generator_ref); in mcp_funcgen_get_rctx()
422 rctx = fgen->list[fgen->free-1]; in mcp_funcgen_get_rctx()
423 fgen->list[fgen->free-1] = NULL; in mcp_funcgen_get_rctx()
424 fgen->free--; in mcp_funcgen_get_rctx()
430 mcp_rcontext_t *mcp_funcgen_start(lua_State *L, mcp_funcgen_t *fgen, mcp_parser_t *pr) { in mcp_funcgen_start() argument
431 if (fgen->is_router) { in mcp_funcgen_start()
432 fgen = mcp_funcgen_route(L, fgen, pr); in mcp_funcgen_start()
433 if (fgen == NULL) { in mcp_funcgen_start()
439 mcp_rcontext_t *rctx = mcp_funcgen_get_rctx(L, fgen->self_ref, fgen); in mcp_funcgen_start()
461 WSTAT_INCR(fgen->thread, proxy_req_active, 1); in mcp_funcgen_start()
467 static void mcp_funcgen_cleanup(lua_State *L, mcp_funcgen_t *fgen) { in mcp_funcgen_cleanup() argument
471 if (fgen->self_ref) { in mcp_funcgen_cleanup()
473 lua_rawgeti(L, LUA_REGISTRYINDEX, fgen->self_ref); in mcp_funcgen_cleanup()
476 luaL_unref(L, LUA_REGISTRYINDEX, fgen->self_ref); in mcp_funcgen_cleanup()
477 fgen->self_ref = 0; in mcp_funcgen_cleanup()
478 } else if (fgen->closed) { in mcp_funcgen_cleanup()
486 if (fgen->is_router) { in mcp_funcgen_cleanup()
488 mcp_funcgen_router_cleanup(L, fgen); in mcp_funcgen_cleanup()
493 mcp_sharedvm_delta(t->proxy_ctx, SHAREDVM_FGEN_IDX, fgen->name, -1); in mcp_funcgen_cleanup()
496 for (int x = 0; x < fgen->free_max; x++) { in mcp_funcgen_cleanup()
497 mcp_rcontext_t *rctx = fgen->list[x]; in mcp_funcgen_cleanup()
501 mcp_rcontext_cleanup(L, fgen, rctx, fgen_idx); in mcp_funcgen_cleanup()
504 if (fgen->argument_ref) { in mcp_funcgen_cleanup()
505 luaL_unref(L, LUA_REGISTRYINDEX, fgen->argument_ref); in mcp_funcgen_cleanup()
506 fgen->argument_ref = 0; in mcp_funcgen_cleanup()
509 if (fgen->generator_ref) { in mcp_funcgen_cleanup()
510 luaL_unref(L, LUA_REGISTRYINDEX, fgen->generator_ref); in mcp_funcgen_cleanup()
511 fgen->generator_ref = 0; in mcp_funcgen_cleanup()
514 if (fgen->queue_list) { in mcp_funcgen_cleanup()
515 for (int x = 0; x < fgen->max_queues; x++) { in mcp_funcgen_cleanup()
516 struct mcp_rqueue_s *rqu = &fgen->queue_list[x]; in mcp_funcgen_cleanup()
528 free(fgen->queue_list); in mcp_funcgen_cleanup()
531 free(fgen->list); in mcp_funcgen_cleanup()
532 fgen->list = NULL; in mcp_funcgen_cleanup()
539 mcp_funcgen_t *fgen = luaL_checkudata(L, -1, "mcp.funcgen"); in mcp_funcgen_reference() local
540 if (fgen->self_ref) { in mcp_funcgen_reference()
541 fgen->refcount++; in mcp_funcgen_reference()
544 fgen->self_ref = luaL_ref(L, LUA_REGISTRYINDEX); in mcp_funcgen_reference()
545 fgen->refcount = 1; in mcp_funcgen_reference()
547 P_DEBUG("%s: funcgen referenced: %d\n", __func__, fgen->refcount); in mcp_funcgen_reference()
550 void mcp_funcgen_dereference(lua_State *L, mcp_funcgen_t *fgen) { in mcp_funcgen_dereference() argument
551 assert(fgen->refcount > 0); in mcp_funcgen_dereference()
552 fgen->refcount--; in mcp_funcgen_dereference()
553 P_DEBUG("%s: funcgen dereferenced: %d\n", __func__, fgen->refcount); in mcp_funcgen_dereference()
554 if (fgen->refcount == 0) { in mcp_funcgen_dereference()
555 fgen->closed = true; in mcp_funcgen_dereference()
558 if (fgen->free == fgen->total) { in mcp_funcgen_dereference()
559 mcp_funcgen_cleanup(L, fgen); in mcp_funcgen_dereference()
593 mcp_funcgen_t *fgen = lua_touserdata(L, -1); in mcplib_funcgenbare_new() local
594 strncpy(fgen->name, "anonymous", FGEN_NAME_MAXLEN); in mcplib_funcgenbare_new()
595 mcp_sharedvm_delta(fgen->thread->proxy_ctx, SHAREDVM_FGEN_IDX, fgen->name, 1); in mcplib_funcgenbare_new()
597 fgen->generator_ref = gen_ref; in mcplib_funcgenbare_new()
598 fgen->ready = true; in mcplib_funcgenbare_new()
606 mcp_funcgen_t *fgen = lua_newuserdatauv(L, sizeof(mcp_funcgen_t), 2); in mcplib_funcgen_new() local
607 memset(fgen, 0, sizeof(mcp_funcgen_t)); in mcplib_funcgen_new()
608 fgen->thread = t; in mcplib_funcgen_new()
609 fgen->free_max = FGEN_DEFAULT_FREELIST_SIZE; in mcplib_funcgen_new()
610 fgen->list = calloc(fgen->free_max, sizeof(mcp_rcontext_t *)); in mcplib_funcgen_new()
625 mcp_funcgen_t *fgen = lua_touserdata(L, 1); in mcplib_funcgen_new_handle() local
629 if (fgen->ready) { in mcplib_funcgen_new_handle()
650 fgen->max_queues++; in mcplib_funcgen_new_handle()
651 if (fgen->queue_list == NULL) { in mcplib_funcgen_new_handle()
652 fgen->queue_list = malloc(sizeof(struct mcp_rqueue_s)); in mcplib_funcgen_new_handle()
654 … fgen->queue_list = realloc(fgen->queue_list, fgen->max_queues * sizeof(struct mcp_rqueue_s)); in mcplib_funcgen_new_handle()
656 if (fgen->queue_list == NULL) { in mcplib_funcgen_new_handle()
661 struct mcp_rqueue_s *rqu = &fgen->queue_list[fgen->max_queues-1]; in mcplib_funcgen_new_handle()
676 lua_pushinteger(L, fgen->max_queues-1); in mcplib_funcgen_new_handle()
681 mcp_funcgen_t *fgen = lua_touserdata(L, 1); in mcplib_funcgen_ready() local
684 if (fgen->ready) { in mcplib_funcgen_ready()
693 fgen->generator_ref = luaL_ref(L, LUA_REGISTRYINDEX); in mcplib_funcgen_ready()
696 fgen->argument_ref = luaL_ref(L, LUA_REGISTRYINDEX); in mcplib_funcgen_ready()
704 strncpy(fgen->name, name, FGEN_NAME_MAXLEN); in mcplib_funcgen_ready()
706 strncpy(fgen->name, "anonymous", FGEN_NAME_MAXLEN); in mcplib_funcgen_ready()
712 lua_rawgeti(L, LUA_REGISTRYINDEX, fgen->generator_ref); // for gencall in mcplib_funcgen_ready()
717 mcp_sharedvm_delta(fgen->thread->proxy_ctx, SHAREDVM_FGEN_IDX, fgen->name, 1); in mcplib_funcgen_ready()
719 fgen->ready = true; in mcplib_funcgen_ready()
731 if (handle < 0 || handle >= rctx->fgen->max_queues) { in mcplib_rcontext_handle_set_cb()
752 if (handle < 0 || handle >= rctx->fgen->max_queues) { in _mcplib_rcontext_queue()
832 mcp_resp_t *r = mcp_prep_bare_resobj(rctx->Lc, rctx->fgen->thread); in _mcp_resume_rctx_process_error()
846 mcp_resp_t *r = mcp_prep_bare_resobj(rctx->Lc, rctx->fgen->thread); in _mcp_start_rctx_process_error()
1141 mcp_set_resobj(rqu->res_obj, rq, be, rctx->fgen->thread); in mcp_run_rcontext_handle()
1298 if (!isnum || handle < 0 || handle >= rctx->fgen->max_queues) { in mcplib_rcontext_wait_handle()
1366 if (!isnum || handle < 0 || handle >= rctx->fgen->max_queues) { in _mcplib_rcontext_checkhandle()
1566 static mcp_funcgen_t *mcp_funcgen_route(lua_State *L, mcp_funcgen_t *fgen, mcp_parser_t *pr) { in mcp_funcgen_route() argument
1567 struct mcp_funcgen_router *fr = (struct mcp_funcgen_router *)fgen; in mcp_funcgen_route()
1640 static int mcp_funcgen_router_cleanup(lua_State *L, mcp_funcgen_t *fgen) { in mcp_funcgen_router_cleanup() argument
1641 struct mcp_funcgen_router *fr = (struct mcp_funcgen_router *)fgen; in mcp_funcgen_router_cleanup()
1847 mcp_funcgen_t *fgen = &router->fgen_self; in mcplib_router_new() local
1861 strncpy(fgen->name, "mcp_router", FGEN_NAME_MAXLEN); in mcplib_router_new()
1929 fgen->thread = t; in mcplib_router_new()