| 694 | } |
| 695 | |
| 696 | ts_lua_vconn_ctx * |
| 697 | ts_lua_create_vconn_ctx(ts_lua_main_ctx *main_ctx, ts_lua_instance_conf *conf) |
| 698 | { |
| 699 | ts_lua_vconn_ctx *vconn_ctx; |
| 700 | |
| 701 | vconn_ctx = TSRalloc<ts_lua_vconn_ctx>(); |
| 702 | memset(vconn_ctx, 0, sizeof(*vconn_ctx)); |
| 703 | |
| 704 | lua_State *L = main_ctx->lua; |
| 705 | lua_State *l = lua_newthread(L); |
| 706 | |
| 707 | lua_pushlightuserdata(L, conf); |
| 708 | lua_rawget(L, LUA_REGISTRYINDEX); |
| 709 | |
| 710 | /* new globals table for coroutine */ |
| 711 | lua_newtable(l); |
| 712 | lua_pushvalue(l, -1); |
| 713 | lua_setfield(l, -2, "_G"); |
| 714 | lua_newtable(l); |
| 715 | lua_xmove(L, l, 1); |
| 716 | lua_setfield(l, -2, "__index"); |
| 717 | lua_setmetatable(l, -2); |
| 718 | |
| 719 | lua_replace(l, LUA_GLOBALSINDEX); |
| 720 | |
| 721 | // init coroutine |
| 722 | vconn_ctx->ref = luaL_ref(L, LUA_REGISTRYINDEX); |
| 723 | |
| 724 | vconn_ctx->lua = l; |
| 725 | vconn_ctx->mctx = main_ctx; |
| 726 | |
| 727 | // update thread stats |
| 728 | ts_lua_ctx_stats *const stats = main_ctx->stats; |
| 729 | |
| 730 | TSMutexLock(stats->mutexp); |
| 731 | ++stats->threads; |
| 732 | if (stats->threads_max < stats->threads) { |
| 733 | stats->threads_max = stats->threads; |
| 734 | } |
| 735 | TSMutexUnlock(stats->mutexp); |
| 736 | |
| 737 | vconn_ctx->instance_conf = conf; |
| 738 | |
| 739 | ts_lua_set_vconn_ctx(l, vconn_ctx); |
| 740 | ts_lua_create_context_table(l); |
| 741 | |
| 742 | return vconn_ctx; |
| 743 | } |
| 744 | |
| 745 | void |
| 746 | ts_lua_destroy_vconn_ctx(ts_lua_vconn_ctx *vconn_ctx) |
no test coverage detected