Lines Matching refs:rctx

10 static void _mcplib_funcgen_cache(mcp_funcgen_t *fgen, mcp_rcontext_t *rctx);
12 static void mcp_resume_rctx_from_cb(mcp_rcontext_t *rctx);
46 mcp_rcontext_t *rctx = arg; in mcp_funcgen_wait_handler() local
51 lua_settop(rctx->Lc, 0); in mcp_funcgen_wait_handler()
52 rctx->wait_count = 0; in mcp_funcgen_wait_handler()
53 rctx->lua_narg = 2; in mcp_funcgen_wait_handler()
54 if (rctx->wait_mode == QWAIT_HANDLE) { in mcp_funcgen_wait_handler()
56 lua_pushnil(rctx->Lc); in mcp_funcgen_wait_handler()
57 } else if (rctx->wait_mode == QWAIT_SLEEP) { in mcp_funcgen_wait_handler()
59 rctx->lua_narg = 1; in mcp_funcgen_wait_handler()
62 lua_pushinteger(rctx->Lc, rctx->wait_done); in mcp_funcgen_wait_handler()
65 lua_pushboolean(rctx->Lc, 1); in mcp_funcgen_wait_handler()
67 rctx->wait_mode = QWAIT_IDLE; in mcp_funcgen_wait_handler()
69 mcp_resume_rctx_from_cb(rctx); in mcp_funcgen_wait_handler()
78 static void mcp_rcontext_cleanup(lua_State *L, mcp_funcgen_t *fgen, mcp_rcontext_t *rctx, int fgen_… in mcp_rcontext_cleanup() argument
79 luaL_unref(L, LUA_REGISTRYINDEX, rctx->coroutine_ref); in mcp_rcontext_cleanup()
80 luaL_unref(L, LUA_REGISTRYINDEX, rctx->function_ref); in mcp_rcontext_cleanup()
81 if (rctx->request_ref) { in mcp_rcontext_cleanup()
82 luaL_unref(L, LUA_REGISTRYINDEX, rctx->request_ref); in mcp_rcontext_cleanup()
84 assert(rctx->pending_reqs == 0); in mcp_rcontext_cleanup()
88 struct mcp_rqueue_s *rqu = &rctx->qslots[x]; in mcp_rcontext_cleanup()
114 if (event_pending(&rctx->timeout_event, EV_TIMEOUT, NULL)) { in mcp_rcontext_cleanup()
115 event_del(&rctx->timeout_event); in mcp_rcontext_cleanup()
119 luaL_unref(L, -1, rctx->self_ref); in mcp_rcontext_cleanup()
120 rctx->self_ref = 0; in mcp_rcontext_cleanup()
144 static void _mcplib_funcgen_cache(mcp_funcgen_t *fgen, mcp_rcontext_t *rctx) { in _mcplib_funcgen_cache() argument
187 fgen->list[fgen->free] = rctx; in _mcplib_funcgen_cache()
194 mcp_rcontext_cleanup(L, fgen, rctx, lua_absindex(L, -1)); in _mcplib_funcgen_cache()
314 static void _mcp_funcgen_return_rctx(mcp_rcontext_t *rctx) { in _mcp_funcgen_return_rctx() argument
315 mcp_funcgen_t *fgen = rctx->fgen; in _mcp_funcgen_return_rctx()
316 assert(rctx->pending_reqs == 0); in _mcp_funcgen_return_rctx()
317 int res = lua_resetthread(rctx->Lc); in _mcp_funcgen_return_rctx()
327 luaL_unref(L, LUA_REGISTRYINDEX, rctx->coroutine_ref); in _mcp_funcgen_return_rctx()
328 rctx->Lc = lua_newthread(L); in _mcp_funcgen_return_rctx()
329 assert(rctx->Lc); in _mcp_funcgen_return_rctx()
330 rctx->coroutine_ref = luaL_ref(L, LUA_REGISTRYINDEX); in _mcp_funcgen_return_rctx()
332 lua_settop(rctx->Lc, 0); in _mcp_funcgen_return_rctx()
334 rctx->wait_mode = QWAIT_IDLE; in _mcp_funcgen_return_rctx()
335 rctx->resp = NULL; in _mcp_funcgen_return_rctx()
336 rctx->first_queue = false; // HACK in _mcp_funcgen_return_rctx()
337 if (rctx->request) { in _mcp_funcgen_return_rctx()
338 mcp_request_cleanup(fgen->thread, rctx->request); in _mcp_funcgen_return_rctx()
342 if (event_pending(&rctx->timeout_event, EV_TIMEOUT, NULL)) { in _mcp_funcgen_return_rctx()
343 event_del(&rctx->timeout_event); in _mcp_funcgen_return_rctx()
348 struct mcp_rqueue_s *rqu = &rctx->qslots[x]; in _mcp_funcgen_return_rctx()
355 luaL_unref(rctx->Lc, LUA_REGISTRYINDEX, rqu->res_ref); in _mcp_funcgen_return_rctx()
360 luaL_unref(rctx->Lc, LUA_REGISTRYINDEX, rqu->req_ref); in _mcp_funcgen_return_rctx()
376 void mcp_funcgen_return_rctx(mcp_rcontext_t *rctx) { in mcp_funcgen_return_rctx() argument
377 mcp_funcgen_t *fgen = rctx->fgen; in mcp_funcgen_return_rctx()
378 if (rctx->pending_reqs != 0) { in mcp_funcgen_return_rctx()
382 if (rctx->parent) { in mcp_funcgen_return_rctx()
385 rctx->parent->pending_reqs--; in mcp_funcgen_return_rctx()
386 assert(rctx->parent->pending_reqs > -1); in mcp_funcgen_return_rctx()
387 if (rctx->parent->pending_reqs == 0) { in mcp_funcgen_return_rctx()
388 mcp_funcgen_return_rctx(rctx->parent); in mcp_funcgen_return_rctx()
392 WSTAT_DECR(rctx->fgen->thread, proxy_req_active, 1); in mcp_funcgen_return_rctx()
393 _mcp_funcgen_return_rctx(rctx); in mcp_funcgen_return_rctx()
394 _mcplib_funcgen_cache(fgen, rctx); in mcp_funcgen_return_rctx()
398 mcp_rcontext_t *rctx = NULL; in mcp_funcgen_get_rctx() local
422 rctx = fgen->list[fgen->free-1]; in mcp_funcgen_get_rctx()
427 return rctx; in mcp_funcgen_get_rctx()
439 mcp_rcontext_t *rctx = mcp_funcgen_get_rctx(L, fgen->self_ref, fgen); in mcp_funcgen_start() local
441 if (rctx == NULL) { in mcp_funcgen_start()
449 if (rctx->request_ref == 0) { in mcp_funcgen_start()
455 rctx->request_ref = luaL_ref(L, LUA_REGISTRYINDEX); // pop the request in mcp_funcgen_start()
456 rctx->request = rq; in mcp_funcgen_start()
462 return rctx; in mcp_funcgen_start()
497 mcp_rcontext_t *rctx = fgen->list[x]; in mcp_funcgen_cleanup() local
498 if (rctx == NULL) { in mcp_funcgen_cleanup()
501 mcp_rcontext_cleanup(L, fgen, rctx, fgen_idx); in mcp_funcgen_cleanup()
726 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_handle_set_cb() local
731 if (handle < 0 || handle >= rctx->fgen->max_queues) { in mcplib_rcontext_handle_set_cb()
736 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in mcplib_rcontext_handle_set_cb()
751 static void _mcplib_rcontext_queue(lua_State *L, mcp_rcontext_t *rctx, mcp_request_t *rq, int handl… in _mcplib_rcontext_queue() argument
752 if (handle < 0 || handle >= rctx->fgen->max_queues) { in _mcplib_rcontext_queue()
756 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in _mcplib_rcontext_queue()
785 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_enqueue() local
788 if (rctx->wait_mode != QWAIT_IDLE) { in mcplib_rcontext_enqueue()
803 _mcplib_rcontext_queue(L, rctx, rq, handle); in mcplib_rcontext_enqueue()
817 _mcplib_rcontext_queue(L, rctx, rq, handle); in mcplib_rcontext_enqueue()
829 static void _mcp_resume_rctx_process_error(mcp_rcontext_t *rctx, struct mcp_rqueue_s *rqu) { in _mcp_resume_rctx_process_error() argument
832 mcp_resp_t *r = mcp_prep_bare_resobj(rctx->Lc, rctx->fgen->thread); in _mcp_resume_rctx_process_error()
836 rqu->res_ref = luaL_ref(rctx->Lc, LUA_REGISTRYINDEX); in _mcp_resume_rctx_process_error()
837 mcp_process_rqueue_return(rctx->parent, rctx->parent_handle, r); in _mcp_resume_rctx_process_error()
838 if (rctx->parent->wait_count) { in _mcp_resume_rctx_process_error()
839 mcp_process_rctx_wait(rctx->parent, rctx->parent_handle); in _mcp_resume_rctx_process_error()
843 static void _mcp_start_rctx_process_error(mcp_rcontext_t *rctx, struct mcp_rqueue_s *rqu) { in _mcp_start_rctx_process_error() argument
846 mcp_resp_t *r = mcp_prep_bare_resobj(rctx->Lc, rctx->fgen->thread); in _mcp_start_rctx_process_error()
850 rqu->res_ref = luaL_ref(rctx->Lc, LUA_REGISTRYINDEX); in _mcp_start_rctx_process_error()
853 io_pending_proxy_t *p = mcp_queue_rctx_io(rctx->parent, NULL, NULL, r); in _mcp_start_rctx_process_error()
855 p->queue_handle = rctx->parent_handle; in _mcp_start_rctx_process_error()
859 static void mcp_start_subrctx(mcp_rcontext_t *rctx) { in mcp_start_subrctx() argument
860 int res = proxy_run_rcontext(rctx); in mcp_start_subrctx()
861 struct mcp_rqueue_s *rqu = &rctx->parent->qslots[rctx->parent_handle]; in mcp_start_subrctx()
863 int type = lua_type(rctx->Lc, 1); in mcp_start_subrctx()
865 if (type == LUA_TUSERDATA && (r = luaL_testudata(rctx->Lc, 1, "mcp.response")) != NULL) { in mcp_start_subrctx()
868 rqu->res_ref = luaL_ref(rctx->Lc, LUA_REGISTRYINDEX); in mcp_start_subrctx()
870 io_pending_proxy_t *p = mcp_queue_rctx_io(rctx->parent, NULL, NULL, r); in mcp_start_subrctx()
872 p->queue_handle = rctx->parent_handle; in mcp_start_subrctx()
881 rqu->res_ref = luaL_ref(rctx->Lc, LUA_REGISTRYINDEX); in mcp_start_subrctx()
884 io_pending_proxy_t *p = mcp_queue_rctx_io(rctx->parent, NULL, NULL, NULL); in mcp_start_subrctx()
886 p->queue_handle = rctx->parent_handle; in mcp_start_subrctx()
890 _mcp_start_rctx_process_error(rctx, rqu); in mcp_start_subrctx()
895 lua_pop(rctx->Lc, 1); // drop the error message. in mcp_start_subrctx()
896 _mcp_start_rctx_process_error(rctx, rqu); in mcp_start_subrctx()
900 static void mcp_resume_rctx_from_cb(mcp_rcontext_t *rctx) { in mcp_resume_rctx_from_cb() argument
901 int res = proxy_run_rcontext(rctx); in mcp_resume_rctx_from_cb()
902 if (rctx->parent) { in mcp_resume_rctx_from_cb()
903 struct mcp_rqueue_s *rqu = &rctx->parent->qslots[rctx->parent_handle]; in mcp_resume_rctx_from_cb()
905 int type = lua_type(rctx->Lc, 1); in mcp_resume_rctx_from_cb()
907 … if (type == LUA_TUSERDATA && (r = luaL_testudata(rctx->Lc, 1, "mcp.response")) != NULL) { in mcp_resume_rctx_from_cb()
910 rqu->res_ref = luaL_ref(rctx->Lc, LUA_REGISTRYINDEX); in mcp_resume_rctx_from_cb()
911 mcp_process_rqueue_return(rctx->parent, rctx->parent_handle, r); in mcp_resume_rctx_from_cb()
917 rqu->res_ref = luaL_ref(rctx->Lc, LUA_REGISTRYINDEX); in mcp_resume_rctx_from_cb()
922 _mcp_resume_rctx_process_error(rctx, rqu); in mcp_resume_rctx_from_cb()
924 if (rctx->parent->wait_count) { in mcp_resume_rctx_from_cb()
925 mcp_process_rctx_wait(rctx->parent, rctx->parent_handle); in mcp_resume_rctx_from_cb()
927 mcp_funcgen_return_rctx(rctx); in mcp_resume_rctx_from_cb()
930 _mcp_queue_hack(rctx->c); in mcp_resume_rctx_from_cb()
932 lua_pop(rctx->Lc, 1); // drop the error message. in mcp_resume_rctx_from_cb()
933 _mcp_resume_rctx_process_error(rctx, rqu); in mcp_resume_rctx_from_cb()
934 mcp_funcgen_return_rctx(rctx); in mcp_resume_rctx_from_cb()
947 mcp_funcgen_return_rctx(rctx); in mcp_resume_rctx_from_cb()
948 io_queue_t *q = conn_io_queue_get(rctx->c, IO_QUEUE_PROXY); in mcp_resume_rctx_from_cb()
952 conn_worker_readd(rctx->c); in mcp_resume_rctx_from_cb()
955 _mcp_queue_hack(rctx->c); in mcp_resume_rctx_from_cb()
964 mcp_rcontext_t *rctx = p->rctx; in proxy_return_rqu_dummy_cb() local
966 rctx->pending_reqs--; in proxy_return_rqu_dummy_cb()
967 assert(rctx->pending_reqs > -1); in proxy_return_rqu_dummy_cb()
969 lua_settop(rctx->Lc, 0); in proxy_return_rqu_dummy_cb()
970 lua_pushinteger(rctx->Lc, 0); // return a "0" done count to the function. in proxy_return_rqu_dummy_cb()
971 mcp_resume_rctx_from_cb(rctx); in proxy_return_rqu_dummy_cb()
976 void mcp_process_rctx_wait(mcp_rcontext_t *rctx, int handle) { in mcp_process_rctx_wait() argument
977 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in mcp_process_rctx_wait()
984 switch (rctx->wait_mode) { in mcp_process_rctx_wait()
993 rctx->wait_done++; in mcp_process_rctx_wait()
999 rctx->wait_done++; in mcp_process_rctx_wait()
1004 rctx->wait_done++; in mcp_process_rctx_wait()
1009 rctx->wait_done++; in mcp_process_rctx_wait()
1015 rctx->wait_done++; in mcp_process_rctx_wait()
1021 if (handle == rctx->wait_handle) { in mcp_process_rctx_wait()
1022 rctx->wait_done++; in mcp_process_rctx_wait()
1031 assert(rctx->pending_reqs != 0); in mcp_process_rctx_wait()
1032 …if ((status & RQUEUE_R_RESUME) || rctx->wait_done == rctx->wait_count || rctx->pending_reqs == 1) { in mcp_process_rctx_wait()
1036 lua_settop(rctx->Lc, 0); in mcp_process_rctx_wait()
1037 rctx->wait_count = 0; in mcp_process_rctx_wait()
1038 if (rctx->wait_mode == QWAIT_HANDLE) { in mcp_process_rctx_wait()
1039 mcp_rcontext_push_rqu_res(rctx->Lc, rctx, handle); in mcp_process_rctx_wait()
1041 lua_pushinteger(rctx->Lc, rctx->wait_done); in mcp_process_rctx_wait()
1043 rctx->wait_mode = QWAIT_IDLE; in mcp_process_rctx_wait()
1046 if (event_pending(&rctx->timeout_event, EV_TIMEOUT, NULL)) { in mcp_process_rctx_wait()
1047 event_del(&rctx->timeout_event); in mcp_process_rctx_wait()
1050 mcp_resume_rctx_from_cb(rctx); in mcp_process_rctx_wait()
1057 int mcp_process_rqueue_return(mcp_rcontext_t *rctx, int handle, mcp_resp_t *res) { in mcp_process_rqueue_return() argument
1058 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in mcp_process_rqueue_return()
1072 lua_settop(rctx->Lc, 0); in mcp_process_rqueue_return()
1073 lua_rawgeti(rctx->Lc, LUA_REGISTRYINDEX, rqu->cb_ref); in mcp_process_rqueue_return()
1074 lua_rawgeti(rctx->Lc, LUA_REGISTRYINDEX, rqu->res_ref); in mcp_process_rqueue_return()
1075 lua_rawgeti(rctx->Lc, LUA_REGISTRYINDEX, rqu->req_ref); in mcp_process_rqueue_return()
1076 if (lua_pcall(rctx->Lc, 2, 2, 0) != LUA_OK) { in mcp_process_rqueue_return()
1077 LOGGER_LOG(NULL, LOG_PROXYEVENTS, LOGGER_PROXY_ERROR, NULL, lua_tostring(rctx->Lc, -1)); in mcp_process_rqueue_return()
1078 } else if (lua_isinteger(rctx->Lc, 1)) { in mcp_process_rqueue_return()
1080 enum mcp_rqueue_e mode = lua_tointeger(rctx->Lc, 1); in mcp_process_rqueue_return()
1096 if (lua_toboolean(rctx->Lc, 2)) { in mcp_process_rqueue_return()
1100 lua_settop(rctx->Lc, 0); // FIXME: This might not be necessary. in mcp_process_rqueue_return()
1111 mcp_rcontext_t *rctx = p->rctx; in proxy_return_rqu_cb() local
1114 mcp_process_rqueue_return(rctx, p->queue_handle, p->client_resp); in proxy_return_rqu_cb()
1116 rctx->pending_reqs--; in proxy_return_rqu_cb()
1117 assert(rctx->pending_reqs > -1); in proxy_return_rqu_cb()
1119 if (rctx->wait_count) { in proxy_return_rqu_cb()
1120 mcp_process_rctx_wait(rctx, p->queue_handle); in proxy_return_rqu_cb()
1122 mcp_funcgen_return_rctx(rctx); in proxy_return_rqu_cb()
1128 void mcp_run_rcontext_handle(mcp_rcontext_t *rctx, int handle) { in mcp_run_rcontext_handle() argument
1130 rqu = &rctx->qslots[handle]; in mcp_run_rcontext_handle()
1141 mcp_set_resobj(rqu->res_obj, rq, be, rctx->fgen->thread); in mcp_run_rcontext_handle()
1142 io_pending_proxy_t *p = mcp_queue_rctx_io(rctx, rq, be, rqu->res_obj); in mcp_run_rcontext_handle()
1145 rctx->pending_reqs++; in mcp_run_rcontext_handle()
1149 subrctx->c = rctx->c; in mcp_run_rcontext_handle()
1150 rctx->pending_reqs++; in mcp_run_rcontext_handle()
1155 } else if (rqu->state == RQUEUE_COMPLETE && rctx->wait_count) { in mcp_run_rcontext_handle()
1158 mcp_process_rctx_wait(rctx, handle); in mcp_run_rcontext_handle()
1162 static inline void _mcplib_set_rctx_alarm(lua_State *L, mcp_rcontext_t *rctx, int arg) { in _mcplib_set_rctx_alarm() argument
1169 int pending = event_pending(&rctx->timeout_event, EV_TIMEOUT, NULL); in _mcplib_set_rctx_alarm()
1177 event_add(&rctx->timeout_event, &tv); in _mcplib_set_rctx_alarm()
1184 static inline int _mcplib_rcontext_wait_prep(lua_State *L, mcp_rcontext_t *rctx, int argc) { in _mcplib_rcontext_wait_prep() argument
1188 if (rctx->wait_mode != QWAIT_IDLE) { in _mcplib_rcontext_wait_prep()
1220 rctx->wait_count = wait; in _mcplib_rcontext_wait_prep()
1221 rctx->wait_done = 0; in _mcplib_rcontext_wait_prep()
1222 rctx->wait_mode = mode; in _mcplib_rcontext_wait_prep()
1230 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_wait_cond() local
1232 _mcplib_rcontext_wait_prep(L, rctx, argc); in mcplib_rcontext_wait_cond()
1235 if (rctx->wait_count == 0) { in mcplib_rcontext_wait_cond()
1236 io_pending_proxy_t *p = mcp_queue_rctx_io(rctx, NULL, NULL, NULL); in mcplib_rcontext_wait_cond()
1239 rctx->pending_reqs++; in mcplib_rcontext_wait_cond()
1240 rctx->wait_mode = QWAIT_IDLE; // not actually waiting. in mcplib_rcontext_wait_cond()
1243 _mcplib_set_rctx_alarm(L, rctx, 4); in mcplib_rcontext_wait_cond()
1251 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_enqueue_and_wait() local
1256 if (rctx->wait_mode != QWAIT_IDLE) { in mcplib_rcontext_enqueue_and_wait()
1273 _mcplib_rcontext_queue(L, rctx, rq, handle); in mcplib_rcontext_enqueue_and_wait()
1276 _mcplib_set_rctx_alarm(L, rctx, 4); in mcplib_rcontext_enqueue_and_wait()
1279 rctx->wait_done = 0; in mcplib_rcontext_enqueue_and_wait()
1280 rctx->wait_count = 1; in mcplib_rcontext_enqueue_and_wait()
1281 rctx->wait_mode = QWAIT_HANDLE; in mcplib_rcontext_enqueue_and_wait()
1282 rctx->wait_handle = handle; in mcplib_rcontext_enqueue_and_wait()
1289 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_wait_handle() local
1293 if (rctx->wait_mode != QWAIT_IDLE) { in mcplib_rcontext_wait_handle()
1298 if (!isnum || handle < 0 || handle >= rctx->fgen->max_queues) { in mcplib_rcontext_wait_handle()
1303 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in mcplib_rcontext_wait_handle()
1310 _mcplib_set_rctx_alarm(L, rctx, 3); in mcplib_rcontext_wait_handle()
1313 rctx->wait_done = 0; in mcplib_rcontext_wait_handle()
1314 rctx->wait_count = 1; in mcplib_rcontext_wait_handle()
1315 rctx->wait_mode = QWAIT_HANDLE; in mcplib_rcontext_wait_handle()
1316 rctx->wait_handle = handle; in mcplib_rcontext_wait_handle()
1349 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_sleep() local
1350 if (rctx->wait_mode != QWAIT_IDLE) { in mcplib_rcontext_sleep()
1355 _mcplib_set_rctx_alarm(L, rctx, 2); in mcplib_rcontext_sleep()
1356 rctx->wait_mode = QWAIT_SLEEP; in mcplib_rcontext_sleep()
1363 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in _mcplib_rcontext_checkhandle() local
1366 if (!isnum || handle < 0 || handle >= rctx->fgen->max_queues) { in _mcplib_rcontext_checkhandle()
1371 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in _mcplib_rcontext_checkhandle()
1423 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_cfd() local
1424 lua_pushinteger(L, rctx->conn_fd); in mcplib_rcontext_cfd()
1430 mcp_rcontext_t *rctx = lua_touserdata(L, 1); in mcplib_rcontext_tls_peer_cn() local
1431 if (!rctx->c) { in mcplib_rcontext_tls_peer_cn()
1438 const unsigned char *cn = ssl_get_peer_cn(rctx->c, &len); in mcplib_rcontext_tls_peer_cn()
1470 void mcp_rcontext_push_rqu_res(lua_State *L, mcp_rcontext_t *rctx, int handle) { in mcp_rcontext_push_rqu_res() argument
1471 struct mcp_rqueue_s *rqu = &rctx->qslots[handle]; in mcp_rcontext_push_rqu_res()