| 603 | } |
| 604 | |
| 605 | static int |
| 606 | vconnHookHandler(TSCont contp, TSEvent event, void *edata) |
| 607 | { |
| 608 | TSVConn vconn = (TSVConn)edata; |
| 609 | |
| 610 | int ret; |
| 611 | uint64_t req_id; |
| 612 | |
| 613 | lua_State *l; |
| 614 | |
| 615 | ts_lua_main_ctx *main_ctx; |
| 616 | ts_lua_vconn_ctx *vconn_ctx; |
| 617 | |
| 618 | ts_lua_instance_conf *conf = (ts_lua_instance_conf *)TSContDataGet(contp); |
| 619 | |
| 620 | main_ctx = static_cast<decltype(main_ctx)>(pthread_getspecific(lua_g_state_key)); |
| 621 | if (main_ctx == NULL) { |
| 622 | req_id = __sync_fetch_and_add(&ts_lua_g_http_next_id, 1); |
| 623 | Dbg(dbg_ctl, "[%s] req_id for vconn handler: %" PRId64, __FUNCTION__, req_id); |
| 624 | main_ctx = &ts_lua_g_main_ctx_array[req_id % conf->states]; |
| 625 | pthread_setspecific(lua_g_state_key, main_ctx); |
| 626 | } |
| 627 | |
| 628 | TSMutexLock(main_ctx->mutexp); |
| 629 | |
| 630 | vconn_ctx = ts_lua_create_vconn_ctx(main_ctx, conf); |
| 631 | vconn_ctx->vconn = vconn; |
| 632 | l = vconn_ctx->lua; |
| 633 | |
| 634 | switch (event) { |
| 635 | case TS_EVENT_VCONN_START: |
| 636 | lua_getglobal(l, TS_LUA_FUNCTION_G_VCONN_START); |
| 637 | break; |
| 638 | |
| 639 | default: |
| 640 | ts_lua_destroy_vconn_ctx(vconn_ctx); |
| 641 | TSMutexUnlock(main_ctx->mutexp); |
| 642 | TSVConnReenable(vconn); |
| 643 | return 0; |
| 644 | } |
| 645 | |
| 646 | if (lua_type(l, -1) != LUA_TFUNCTION) { |
| 647 | lua_pop(l, 1); |
| 648 | ts_lua_destroy_vconn_ctx(vconn_ctx); |
| 649 | TSMutexUnlock(main_ctx->mutexp); |
| 650 | |
| 651 | TSVConnReenable(vconn); |
| 652 | return 0; |
| 653 | } |
| 654 | |
| 655 | if (lua_pcall(l, 0, 1, 0) != 0) { |
| 656 | TSError("[ts_lua][%s] lua_pcall failed: %s", __FUNCTION__, lua_tostring(l, -1)); |
| 657 | } |
| 658 | |
| 659 | ret = lua_tointeger(l, -1); |
| 660 | lua_pop(l, 1); |
| 661 | |
| 662 | ts_lua_destroy_vconn_ctx(vconn_ctx); |
nothing calls this directly
no test coverage detected