From 7c8146f00f0c57340d8f5aa38619f8292cf44ba2 Mon Sep 17 00:00:00 2001 From: niubinghui Date: Tue, 15 Oct 2024 19:15:05 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E7=BB=84=E7=BB=87=E9=83=A8=E5=88=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=8C=E6=89=80=E6=9C=89=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=9D=87=E6=94=B9=E4=B8=BA=E9=9D=A2=E5=90=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E7=9A=84=E7=BC=96=E7=A8=8B=E6=80=9D=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/lua_module_manage.h | 20 +- src/lua_binding_cfunc.c | 43 +- src/lua_binding_cfunc.h | 24 +- src/lua_binding_function.c | 154 ++--- src/lua_binding_function.h | 51 +- src/lua_module_manage.c | 100 +--- src/lua_module_manage_internal.c | 973 +++++++++++++++++++------------ src/lua_module_manage_internal.h | 349 +++++------ 8 files changed, 896 insertions(+), 818 deletions(-) diff --git a/include/lua_module_manage.h b/include/lua_module_manage.h index ea0d7ca..3b85e41 100644 --- a/include/lua_module_manage.h +++ b/include/lua_module_manage.h @@ -1,16 +1,24 @@ #pragma once +#ifdef __cplusplus +extern "C" +{ +#endif + #include "stellar/module_manager.h" #define LUA_MODULE_MANAGE_MODULE_NAME "lua_moduel_manager_module" #define LUA_MODULE_MANAGE_CONF_PATH "lua_module_manage.toml" -typedef void lua_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg, void *after_dispatch_arg); + typedef void lua_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg, void *after_dispatch_arg); -struct stellar_module *lua_module_manager_on_init(struct stellar_module_manager *mod_mgr); -void lua_module_manager_on_exit(struct stellar_module_manager *mod_mgr, struct stellar_module *mod); + struct stellar_module *lua_module_manager_on_init(struct stellar_module_manager *mod_mgr); + void lua_module_manager_on_exit(struct stellar_module_manager *mod_mgr, struct stellar_module *mod); + /* 提供的通用函数 */ + /* 通用的Lua mq订阅函数, on_msg */ + /* 注册新数据及自定义函数的接口,能够传参或获取返回值 */ -/* 提供的通用函数 */ -/* 通用的Lua mq订阅函数, on_msg */ -/* 注册新数据及自定义函数的接口,能够传参或获取返回值 */ \ No newline at end of file +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/src/lua_binding_cfunc.c b/src/lua_binding_cfunc.c index fb26ab7..7ef4d33 100644 --- a/src/lua_binding_cfunc.c +++ b/src/lua_binding_cfunc.c @@ -1,14 +1,13 @@ -#include "lua_binding_cfunc.h" #include "lua_module_manage_internal.h" +#include "lua_binding_cfunc.h" static inline struct lua_state *lua_fn_arg_pair_get_thread_state(struct lua_fn_arg_pair *pair) { - struct lua_module_manager *lua_mod_mgr = pair->lua_mod_mgr; - int thread_id = stellar_module_manager_get_thread_id(lua_mod_mgr->mod_mgr); - return lua_mod_mgr->state_array[thread_id]; + struct lua_module_manager *lua_mod_mgr = lua_fn_arg_pair_get_lua_mod_mgr(pair); + return lua_module_manager_get_current_thread_state(lua_mod_mgr); } -void lua_manager_mq_msg_free_cb_func(void *msg, void *msg_free_arg) +void lua_cfunc_mq_msg_free_cb_func(void *msg, void *msg_free_arg) { if (!msg_free_arg) return; @@ -20,13 +19,13 @@ void lua_manager_mq_msg_free_cb_func(void *msg, void *msg_free_arg) lua_cdata_data_set(¶m[0], DATATYPE_CONTEXT, msg, 0); else lua_cdata_data_set(¶m[0], DATATYPE_POINTER, msg, 0); - lua_cdata_data_set(¶m[1], DATATYPE_TABLE, NULL, free_arg->lua_arg_ref_id); + lua_cdata_data_set(¶m[1], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(free_arg)); - lua_chunk_execute(state, free_arg->lua_fn_ref_id, param, 2, NULL, 0, NULL, 0); + lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(free_arg), param, 2, NULL, 0, NULL, 0); return; } -void lua_manager_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg) +void lua_cfunc_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg) { if (!on_msg_arg) return; @@ -39,13 +38,13 @@ void lua_manager_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg) lua_cdata_data_set(¶m[1], DATATYPE_CONTEXT, msg, 0); else lua_cdata_data_set(¶m[1], DATATYPE_POINTER, msg, 0); - lua_cdata_data_set(¶m[2], DATATYPE_TABLE, NULL, msg_arg->lua_arg_ref_id); + lua_cdata_data_set(¶m[2], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(msg_arg)); - lua_chunk_execute(state, msg_arg->lua_fn_ref_id, param, 3, NULL, 0, NULL, 0); + lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(msg_arg), param, 3, NULL, 0, NULL, 0); return; } -void lua_manager_mq_on_msg_dispatch_cb_func(int topic_id, void *msg, on_msg_cb_func *on_msg_cb, void *on_msg_cb_arg, void *dispatch_arg) +void lua_cfunc_mq_on_msg_dispatch_cb_func(int topic_id, void *msg, on_msg_cb_func *on_msg_cb, void *on_msg_cb_arg, void *dispatch_arg) { if (!dispatch_arg) return; @@ -56,17 +55,17 @@ void lua_manager_mq_on_msg_dispatch_cb_func(int topic_id, void *msg, on_msg_cb_f struct lua_context *new_context = lua_context_new(state); lua_cdata_data_set(¶m[0], DATATYPE_INT, NULL, topic_id); lua_cdata_data_set(¶m[1], DATATYPE_CONTEXT, msg, 0); - lua_cdata_data_set(¶m[2], DATATYPE_TABLE, 0, dis_arg->lua_arg_ref_id); + lua_cdata_data_set(¶m[2], DATATYPE_TABLE, 0, lua_fn_arg_pair_get_arg_ref_id(dis_arg)); lua_cdata_data_set(¶m[3], DATATYPE_CONTEXT, (void *)new_context, 0); - lua_chunk_execute(state, dis_arg->lua_fn_ref_id, param, 4, NULL, 0, NULL, 0); + lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(dis_arg), param, 4, NULL, 0, NULL, 0); ((lua_mq_on_msg_cb_func *)(void *)on_msg_cb)(topic_id, msg, on_msg_cb_arg, (void *)new_context); lua_context_free(new_context); return; } -void lua_manager_packet_on_stage_callback(enum packet_stage stage, struct packet *pkt, void *args) +void lua_cfunc_packet_on_stage_callback(enum packet_stage stage, struct packet *pkt, void *args) { if (!args) return; @@ -76,13 +75,13 @@ void lua_manager_packet_on_stage_callback(enum packet_stage stage, struct packet struct lua_cdata param[3]; lua_cdata_data_set(¶m[0], DATATYPE_INT, NULL, stage); lua_cdata_data_set(¶m[1], DATATYPE_POINTER, pkt, 0); - lua_cdata_data_set(¶m[2], DATATYPE_TABLE, NULL, on_stage_callback->lua_arg_ref_id); + lua_cdata_data_set(¶m[2], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(on_stage_callback)); - lua_chunk_execute(state, on_stage_callback->lua_fn_ref_id, param, 3, NULL, 0, NULL, 0); + lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(on_stage_callback), param, 3, NULL, 0, NULL, 0); return; } -void lua_manager_session_callback(struct session *sess, struct packet *pkt, void *args) +void lua_cfunc_session_callback(struct session *sess, struct packet *pkt, void *args) { if (!args) return; @@ -92,13 +91,13 @@ void lua_manager_session_callback(struct session *sess, struct packet *pkt, void struct lua_cdata param[3]; lua_cdata_data_set(¶m[0], DATATYPE_POINTER, sess, 0); lua_cdata_data_set(¶m[1], DATATYPE_POINTER, pkt, 0); - lua_cdata_data_set(¶m[2], DATATYPE_TABLE, NULL, sess_callback->lua_arg_ref_id); + lua_cdata_data_set(¶m[2], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(sess_callback)); - lua_chunk_execute(state, sess_callback->lua_fn_ref_id, param, 3, NULL, 0, NULL, 0); + lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(sess_callback), param, 3, NULL, 0, NULL, 0); return; } -void lua_manager_tcp_stream_callback(struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len, void *args) +void lua_cfunc_tcp_stream_callback(struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len, void *args) { if (!args) return; @@ -109,8 +108,8 @@ void lua_manager_tcp_stream_callback(struct session *sess, const char *tcp_paylo lua_cdata_data_set(¶m[0], DATATYPE_POINTER, sess, 0); lua_cdata_data_set(¶m[1], DATATYPE_BUFF, (void *)tcp_payload, (int)tcp_payload_len); lua_cdata_data_set(¶m[2], DATATYPE_INT, NULL, (int)tcp_payload_len); - lua_cdata_data_set(¶m[3], DATATYPE_TABLE, NULL, tcp_stream_callback->lua_arg_ref_id); + lua_cdata_data_set(¶m[3], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(tcp_stream_callback)); - lua_chunk_execute(state, tcp_stream_callback->lua_fn_ref_id, param, 3, NULL, 0, NULL, 0); + lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(tcp_stream_callback), param, 4, NULL, 0, NULL, 0); return; } diff --git a/src/lua_binding_cfunc.h b/src/lua_binding_cfunc.h index 5704c03..f326d37 100644 --- a/src/lua_binding_cfunc.h +++ b/src/lua_binding_cfunc.h @@ -1,17 +1,23 @@ -#ifndef LUA_MODULE_MANAGE_BINDING_CFUNC_H -#define LUA_MODULE_MANAGE_BINDING_CFUNC_H +#pragma once -#include "stellar/module_manager.h" +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "stellar/mq.h" #include "stellar/packet_manager.h" #include "stellar/session_manager.h" -void lua_manager_mq_msg_free_cb_func(void *msg, void *msg_free_arg); -void lua_manager_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg); -void lua_manager_mq_on_msg_dispatch_cb_func(int topic_id, void *msg, on_msg_cb_func *on_msg_cb, void *on_msg_cb_arg, void *dispatch_arg); + void lua_cfunc_mq_msg_free_cb_func(void *msg, void *msg_free_arg); + void lua_cfunc_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg); + void lua_cfunc_mq_on_msg_dispatch_cb_func(int topic_id, void *msg, on_msg_cb_func *on_msg_cb, void *on_msg_cb_arg, void *dispatch_arg); -void lua_manager_packet_on_stage_callback(enum packet_stage stage, struct packet *pkt, void *args); + void lua_cfunc_packet_on_stage_callback(enum packet_stage stage, struct packet *pkt, void *args); -void lua_manager_session_callback(struct session *sess, struct packet *pkt, void *args); -void lua_manager_tcp_stream_callback(struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len, void *args); + void lua_cfunc_session_callback(struct session *sess, struct packet *pkt, void *args); + void lua_cfunc_tcp_stream_callback(struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len, void *args); +#ifdef __cplusplus +} #endif \ No newline at end of file diff --git a/src/lua_binding_function.c b/src/lua_binding_function.c index f9ef35c..28f4358 100644 --- a/src/lua_binding_function.c +++ b/src/lua_binding_function.c @@ -1,3 +1,4 @@ +#include "lua_module_manage_internal.h" #include "lua_binding_function.h" #include "lua_binding_cfunc.h" @@ -19,7 +20,7 @@ #define LUA_BINDING_FUNCTION_GET_VALUE_POINTER(func_name, param_type, value_type, value_func) \ int func_name(struct lua_state *state) \ { \ - lua_State *L = (lua_State *)state; \ + lua_State *L = (lua_State *)lua_state_get_lua_State(state); \ if (lua_gettop(L) != 1) \ { \ lua_settop(L, 0); \ @@ -35,7 +36,7 @@ #define LUA_BINDING_FUNCTION_GET_VALUE_INT(func_name, param_type, value_func) \ int func_name(struct lua_state *state) \ { \ - lua_State *L = (lua_State *)state; \ + lua_State *L = (lua_State *)lua_state_get_lua_State(state); \ if (lua_gettop(L) != 1) \ { \ lua_settop(L, 0); \ @@ -50,7 +51,7 @@ int lua_mq_schema_get_topic_id(struct lua_state *state) { - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); if (lua_gettop(L) != 2 || lua_type(L, -1) != LUA_TSTRING || lua_type(L, -2) != LUA_TLIGHTUSERDATA) { lua_settop(L, 0); @@ -72,7 +73,7 @@ int lua_mq_schema_get_topic_id(struct lua_state *state) int lua_mq_schema_create_topic(struct lua_state *state) { - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); if (lua_gettop(L) != 6 || lua_type(L, -5) != LUA_TSTRING || lua_type(L, -6) != LUA_TLIGHTUSERDATA) { lua_settop(L, 0); @@ -96,27 +97,19 @@ int lua_mq_schema_create_topic(struct lua_state *state) struct mq_schema *s = (struct mq_schema *)lua_topointer(L, -1); lua_settop(L, 0); - struct lua_fn_arg_pair *new_mq_dispatch_arg = CALLOC(struct lua_fn_arg_pair, 1); - memset(new_mq_dispatch_arg, 0, sizeof(struct lua_fn_arg_pair)); - new_mq_dispatch_arg->lua_fn_ref_id = on_dispatch_cb_fn_ref_id; - new_mq_dispatch_arg->lua_arg_ref_id = on_dispatch_arg_ref_id; - struct lua_fn_arg_pair *new_mq_msg_free_arg = CALLOC(struct lua_fn_arg_pair, 1); - memset(new_mq_msg_free_arg, 0, sizeof(struct lua_fn_arg_pair)); - new_mq_msg_free_arg->lua_fn_ref_id = free_cb_fn_ref_id; - new_mq_msg_free_arg->lua_arg_ref_id = free_arg_ref_id; + struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); + struct lua_fn_arg_pair *new_mq_dispatch_arg = lua_fn_arg_pair_new(lua_mod_mgr, on_dispatch_cb_fn_ref_id, on_dispatch_arg_ref_id); + struct lua_fn_arg_pair *new_mq_msg_free_arg = lua_fn_arg_pair_new(lua_mod_mgr, free_cb_fn_ref_id, free_arg_ref_id); int topic_id = mq_schema_create_topic(s, (const char *)topic_name, - lua_manager_mq_on_msg_dispatch_cb_func, + lua_cfunc_mq_on_msg_dispatch_cb_func, new_mq_dispatch_arg, - lua_manager_mq_msg_free_cb_func, + lua_cfunc_mq_msg_free_cb_func, new_mq_msg_free_arg); if (topic_id >= 0) { - struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); - new_mq_dispatch_arg->lua_mod_mgr = lua_mod_mgr; - new_mq_msg_free_arg->lua_mod_mgr = lua_mod_mgr; - LL_APPEND(lua_mod_mgr->mq_dispatch_list, new_mq_dispatch_arg); - LL_APPEND(lua_mod_mgr->mq_msg_free_list, new_mq_msg_free_arg); + lua_fn_arg_pair_insert(new_mq_dispatch_arg); + lua_fn_arg_pair_insert(new_mq_msg_free_arg); } else { @@ -128,10 +121,8 @@ int lua_mq_schema_create_topic(struct lua_state *state) luaL_unref(L, LUA_REGISTRYINDEX, on_dispatch_arg_ref_id); if (on_dispatch_cb_fn_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_dispatch_cb_fn_ref_id); - if (new_mq_dispatch_arg) - FREE(new_mq_dispatch_arg); - if (new_mq_msg_free_arg) - FREE(new_mq_msg_free_arg); + lua_fn_arg_pair_free(new_mq_dispatch_arg); + lua_fn_arg_pair_free(new_mq_msg_free_arg); } lua_pushinteger(L, topic_id); @@ -164,19 +155,14 @@ int lua_mq_schema_update_topic(struct lua_state *state) struct mq_schema *s = (struct mq_schema *)lua_topointer(L, -1); lua_settop(L, 0); - struct lua_fn_arg_pair *new_mq_dispatch_arg = CALLOC(struct lua_fn_arg_pair, 1); - memset(new_mq_dispatch_arg, 0, sizeof(struct lua_fn_arg_pair)); - new_mq_dispatch_arg->lua_fn_ref_id = on_dispatch_cb_fn_ref_id; - new_mq_dispatch_arg->lua_arg_ref_id = on_dispatch_arg_ref_id; - struct lua_fn_arg_pair *new_mq_msg_free_arg = CALLOC(struct lua_fn_arg_pair, 1); - memset(new_mq_msg_free_arg, 0, sizeof(struct lua_fn_arg_pair)); - new_mq_msg_free_arg->lua_fn_ref_id = free_cb_fn_ref_id; - new_mq_msg_free_arg->lua_arg_ref_id = free_arg_ref_id; + struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); + struct lua_fn_arg_pair *new_mq_dispatch_arg = lua_fn_arg_pair_new(lua_mod_mgr, on_dispatch_cb_fn_ref_id, on_dispatch_arg_ref_id); + struct lua_fn_arg_pair *new_mq_msg_free_arg = lua_fn_arg_pair_new(lua_mod_mgr, free_cb_fn_ref_id, free_arg_ref_id); int update_ret = mq_schema_update_topic(s, topic_id, - lua_manager_mq_on_msg_dispatch_cb_func, + lua_cfunc_mq_on_msg_dispatch_cb_func, new_mq_dispatch_arg, - lua_manager_mq_msg_free_cb_func, + lua_cfunc_mq_msg_free_cb_func, new_mq_msg_free_arg); if (topic_id) { @@ -188,18 +174,13 @@ int lua_mq_schema_update_topic(struct lua_state *state) luaL_unref(L, LUA_REGISTRYINDEX, on_dispatch_arg_ref_id); if (on_dispatch_cb_fn_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_dispatch_cb_fn_ref_id); - if (new_mq_dispatch_arg) - FREE(new_mq_dispatch_arg); - if (new_mq_msg_free_arg) - FREE(new_mq_msg_free_arg); + lua_fn_arg_pair_free(new_mq_dispatch_arg); + lua_fn_arg_pair_free(new_mq_msg_free_arg); } else { - struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); - new_mq_dispatch_arg->lua_mod_mgr = lua_mod_mgr; - new_mq_msg_free_arg->lua_mod_mgr = lua_mod_mgr; - LL_APPEND(lua_mod_mgr->mq_dispatch_list, new_mq_dispatch_arg); - LL_APPEND(lua_mod_mgr->mq_msg_free_list, new_mq_msg_free_arg); + lua_fn_arg_pair_insert(new_mq_dispatch_arg); + lua_fn_arg_pair_insert(new_mq_msg_free_arg); } lua_pushinteger(L, update_ret); @@ -242,25 +223,20 @@ int lua_mq_schema_subscribe(struct lua_state *state) struct mq_schema *s = (struct mq_schema *)lua_topointer(L, -1); lua_settop(L, 0); - struct lua_fn_arg_pair *new_mq_on_msg_arg = CALLOC(struct lua_fn_arg_pair, 1); - memset(new_mq_on_msg_arg, 0, sizeof(struct lua_fn_arg_pair)); - new_mq_on_msg_arg->lua_arg_ref_id = on_msg_arg_ref_id; - new_mq_on_msg_arg->lua_fn_ref_id = on_msg_fn_ref_id; - int subscribe_ret = mq_schema_subscribe(s, topic_id, lua_manager_mq_on_msg_cb_func, new_mq_on_msg_arg); + struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); + struct lua_fn_arg_pair *new_mq_on_msg_arg = lua_fn_arg_pair_new(lua_mod_mgr, on_msg_fn_ref_id, on_msg_arg_ref_id); + int subscribe_ret = mq_schema_subscribe(s, topic_id, lua_cfunc_mq_on_msg_cb_func, new_mq_on_msg_arg); if (subscribe_ret) { if (on_msg_arg_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_msg_arg_ref_id); if (on_msg_fn_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_msg_fn_ref_id); - if (new_mq_on_msg_arg) - FREE(new_mq_on_msg_arg); + lua_fn_arg_pair_free(new_mq_on_msg_arg); } else { - struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); - new_mq_on_msg_arg->lua_mod_mgr = lua_mod_mgr; - LL_APPEND(lua_mod_mgr->mq_on_msg_list, new_mq_on_msg_arg); + lua_fn_arg_pair_insert(new_mq_on_msg_arg); } lua_pushinteger(L, subscribe_ret); @@ -293,25 +269,30 @@ int lua_mq_runtime_publish_message(struct lua_state *state) return 1; } -LUA_BINDING_FUNCTION_GET_VALUE_INT(lua_module_manager_get_thread_id, +LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_stellar_get_stellar_module_manager, + struct lua_module_manager, + struct stellar_module_manager, + lua_module_manager_get_stellar_module_manager) + +LUA_BINDING_FUNCTION_GET_VALUE_INT(lua_stellar_get_thread_id, struct stellar_module_manager, stellar_module_manager_get_thread_id) -LUA_BINDING_FUNCTION_GET_VALUE_INT(lua_module_manager_get_max_thread_num, +LUA_BINDING_FUNCTION_GET_VALUE_INT(lua_stellar_get_max_thread_num, struct stellar_module_manager, stellar_module_manager_get_max_thread_num) -LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_module_manager_get_mq_runtime, +LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_stellar_get_mq_runtime, struct stellar_module_manager, struct mq_runtime, stellar_module_manager_get_mq_runtime) -LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_module_manager_get_mq_schema, +LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_stellar_get_mq_schema, struct stellar_module_manager, struct mq_schema, stellar_module_manager_get_mq_schema) -LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_module_manager_get_logger, +LUA_BINDING_FUNCTION_GET_VALUE_POINTER(lua_stellar_get_logger, struct stellar_module_manager, struct logger, stellar_module_manager_get_logger) @@ -345,24 +326,20 @@ int lua_packet_manager_subscribe(struct lua_state *state) struct packet_manager *pkt_mgr = (struct packet_manager *)lua_topointer(L, -1); lua_settop(L, 0); - struct lua_fn_arg_pair *new_on_packet_arg = CALLOC(struct lua_fn_arg_pair, 1); - new_on_packet_arg->lua_arg_ref_id = on_packet_stage_arg_ref_id; - new_on_packet_arg->lua_fn_ref_id = on_packet_stage_fn_ref_id; - int subscribe_ret = packet_manager_subscribe(pkt_mgr, (enum packet_stage)stage, lua_manager_packet_on_stage_callback, new_on_packet_arg); + struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); + struct lua_fn_arg_pair *new_on_packet_arg = lua_fn_arg_pair_new(lua_mod_mgr, on_packet_stage_fn_ref_id, on_packet_stage_arg_ref_id); + int subscribe_ret = packet_manager_subscribe(pkt_mgr, (enum packet_stage)stage, lua_cfunc_packet_on_stage_callback, new_on_packet_arg); if (subscribe_ret) { if (on_packet_stage_arg_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_packet_stage_arg_ref_id); if (on_packet_stage_fn_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_packet_stage_fn_ref_id); - if (new_on_packet_arg) - FREE(new_on_packet_arg); + lua_fn_arg_pair_free(new_on_packet_arg); } else { - struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); - new_on_packet_arg->lua_mod_mgr = lua_mod_mgr; - LL_APPEND(lua_mod_mgr->on_packet_stage_list, new_on_packet_arg); + lua_fn_arg_pair_insert(new_on_packet_arg); } lua_pushinteger(L, subscribe_ret); @@ -397,20 +374,19 @@ static int lua_session_manager_subscribe(struct lua_state *state, enum sess_mgr_ struct session_manager *sess_mgr = (struct session_manager *)lua_topointer(L, -1); lua_settop(L, 0); - struct lua_fn_arg_pair *new_on_sess_arg = CALLOC(struct lua_fn_arg_pair, 1); - new_on_sess_arg->lua_arg_ref_id = on_session_arg_ref_id; - new_on_sess_arg->lua_fn_ref_id = on_session_fn_ref_id; + struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); + struct lua_fn_arg_pair *new_on_sess_arg = lua_fn_arg_pair_new(lua_mod_mgr, on_session_fn_ref_id, on_session_arg_ref_id); int subscribe_ret = -1; switch (type) { case sub_type_tcp: - subscribe_ret = session_manager_subscribe_tcp(sess_mgr, lua_manager_session_callback, new_on_sess_arg); + subscribe_ret = session_manager_subscribe_tcp(sess_mgr, lua_cfunc_session_callback, new_on_sess_arg); break; case sub_type_udp: - subscribe_ret = session_manager_subscribe_udp(sess_mgr, lua_manager_session_callback, new_on_sess_arg); + subscribe_ret = session_manager_subscribe_udp(sess_mgr, lua_cfunc_session_callback, new_on_sess_arg); break; case sub_type_control_pkt: - subscribe_ret = session_manager_subscribe_control_packet(sess_mgr, lua_manager_session_callback, new_on_sess_arg); + subscribe_ret = session_manager_subscribe_control_packet(sess_mgr, lua_cfunc_session_callback, new_on_sess_arg); break; default: break; @@ -421,27 +397,11 @@ static int lua_session_manager_subscribe(struct lua_state *state, enum sess_mgr_ luaL_unref(L, LUA_REGISTRYINDEX, on_session_arg_ref_id); if (on_session_fn_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_session_fn_ref_id); - if (new_on_sess_arg) - FREE(new_on_sess_arg); + lua_fn_arg_pair_free(new_on_sess_arg); } else { - struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); - new_on_sess_arg->lua_mod_mgr = lua_mod_mgr; - switch (type) - { - case sub_type_tcp: - LL_APPEND(lua_mod_mgr->on_session_tcp_list, new_on_sess_arg); - break; - case sub_type_udp: - LL_APPEND(lua_mod_mgr->on_session_udp_list, new_on_sess_arg); - break; - case sub_type_control_pkt: - LL_APPEND(lua_mod_mgr->on_session_control_packet_list, new_on_sess_arg); - break; - default: - break; - } + lua_fn_arg_pair_insert(new_on_sess_arg); } lua_pushinteger(L, subscribe_ret); @@ -477,24 +437,20 @@ int lua_session_manager_subscribe_tcp_stream(struct lua_state *state) struct session_manager *sess_mgr = (struct session_manager *)lua_topointer(L, -1); lua_settop(L, 0); - struct lua_fn_arg_pair *new_on_tcp_stream_arg = CALLOC(struct lua_fn_arg_pair, 1); - new_on_tcp_stream_arg->lua_arg_ref_id = on_tcp_stream_arg_ref_id; - new_on_tcp_stream_arg->lua_fn_ref_id = on_tcp_stream_fn_ref_id; - int subscribe_ret = session_manager_subscribe_tcp_stream(sess_mgr, lua_manager_tcp_stream_callback, new_on_tcp_stream_arg); + struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); + struct lua_fn_arg_pair *new_on_tcp_stream_arg = lua_fn_arg_pair_new(lua_mod_mgr, on_tcp_stream_fn_ref_id, on_tcp_stream_arg_ref_id); + int subscribe_ret = session_manager_subscribe_tcp_stream(sess_mgr, lua_cfunc_tcp_stream_callback, new_on_tcp_stream_arg); if (subscribe_ret) { if (on_tcp_stream_arg_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_tcp_stream_arg_ref_id); if (on_tcp_stream_fn_ref_id + 1) luaL_unref(L, LUA_REGISTRYINDEX, on_tcp_stream_fn_ref_id); - if (new_on_tcp_stream_arg) - FREE(new_on_tcp_stream_arg); + lua_fn_arg_pair_free(new_on_tcp_stream_arg); } else { - struct lua_module_manager *lua_mod_mgr = lua_state_get_lua_module_manager(state); - new_on_tcp_stream_arg->lua_mod_mgr = lua_mod_mgr; - LL_APPEND(lua_mod_mgr->on_tcp_stream_list, new_on_tcp_stream_arg); + lua_fn_arg_pair_insert(new_on_tcp_stream_arg); } lua_pushinteger(L, subscribe_ret); diff --git a/src/lua_binding_function.h b/src/lua_binding_function.h index ffd039e..7d01786 100644 --- a/src/lua_binding_function.h +++ b/src/lua_binding_function.h @@ -1,32 +1,39 @@ -#ifndef LUA_MODULE_MANAGE_BINDING_FUNCTION_H -#define LUA_MODULE_MANAGE_BINDING_FUNCTION_H +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif #include "lua_module_manage_internal.h" -int lua_mq_schema_get_topic_id(struct lua_state *state); -int lua_mq_schema_create_topic(struct lua_state *state); -int lua_mq_schema_update_topic(struct lua_state *state); -int lua_mq_shcema_destory_topic(struct lua_state *state); -int lua_mq_schema_subscribe(struct lua_state *state); -int lua_mq_runtime_publish_message(struct lua_state *state); + int lua_mq_schema_get_topic_id(struct lua_state *state); + int lua_mq_schema_create_topic(struct lua_state *state); + int lua_mq_schema_update_topic(struct lua_state *state); + int lua_mq_shcema_destory_topic(struct lua_state *state); + int lua_mq_schema_subscribe(struct lua_state *state); + int lua_mq_runtime_publish_message(struct lua_state *state); -int lua_module_manager_get_thread_id(struct lua_state *state); -int lua_module_manager_get_max_thread_num(struct lua_state *state); -int lua_module_manager_get_mq_runtime(struct lua_state *state); -int lua_module_manager_get_mq_schema(struct lua_state *state); -int lua_module_manager_get_logger(struct lua_state *state); + int lua_stellar_get_stellar_module_manager(struct lua_state *state); + int lua_stellar_get_thread_id(struct lua_state *state); + int lua_stellar_get_max_thread_num(struct lua_state *state); + int lua_stellar_get_mq_runtime(struct lua_state *state); + int lua_stellar_get_mq_schema(struct lua_state *state); + int lua_stellar_get_logger(struct lua_state *state); -int lua_packet_get_direction(struct lua_state *state); -int lua_packet_get_payload(struct lua_state *state); -int lua_packet_get_payload_len(struct lua_state *state); + int lua_packet_get_direction(struct lua_state *state); + int lua_packet_get_payload(struct lua_state *state); + int lua_packet_get_payload_len(struct lua_state *state); -int lua_packet_manager_subscribe(struct lua_state *state); + int lua_packet_manager_subscribe(struct lua_state *state); -int lua_session_get0_current_packet(struct lua_state *state); + int lua_session_get0_current_packet(struct lua_state *state); -int lua_session_manager_subscribe_tcp(struct lua_state *state); -int lua_session_manager_subscribe_udp(struct lua_state *state); -int lua_session_manager_subscribe_control_packet(struct lua_state *state); -int lua_session_manager_subscribe_tcp_stream(struct lua_state *state); + int lua_session_manager_subscribe_tcp(struct lua_state *state); + int lua_session_manager_subscribe_udp(struct lua_state *state); + int lua_session_manager_subscribe_control_packet(struct lua_state *state); + int lua_session_manager_subscribe_tcp_stream(struct lua_state *state); +#ifdef __cplusplus +} #endif \ No newline at end of file diff --git a/src/lua_module_manage.c b/src/lua_module_manage.c index e0a2d0d..08baeb2 100644 --- a/src/lua_module_manage.c +++ b/src/lua_module_manage.c @@ -15,7 +15,7 @@ #define SESSION_SPACE_NAME "session" #define SESSION_MANAGER_SPACE_NAME "session_manager" -struct lua_bind_func_spec lua_bind_function[] = { +struct lua_state_cbind_func_spec lua_bind_function[] = { {lua_mq_schema_get_topic_id, MQ_SCHEMA_SPACE_NAME, "get_topic_id"}, {lua_mq_schema_create_topic, MQ_SCHEMA_SPACE_NAME, "create_topic"}, {lua_mq_schema_update_topic, MQ_SCHEMA_SPACE_NAME, "update_topic"}, @@ -23,11 +23,11 @@ struct lua_bind_func_spec lua_bind_function[] = { {lua_mq_schema_subscribe, MQ_SCHEMA_SPACE_NAME, "subcribe"}, {lua_mq_runtime_publish_message, MQ_RUNTIME_SPACE_NAME, "publish_message"}, - {lua_module_manager_get_thread_id, MODULE_MANAGER_SPACE_NAME, "get_thread_id"}, - {lua_module_manager_get_max_thread_num, MODULE_MANAGER_SPACE_NAME, "get_max_thread_num"}, - {lua_module_manager_get_mq_runtime, MODULE_MANAGER_SPACE_NAME, "get_mq_runtime"}, - {lua_module_manager_get_mq_schema, MODULE_MANAGER_SPACE_NAME, "get_mq_schema"}, - {lua_module_manager_get_logger, MODULE_MANAGER_SPACE_NAME, "get_logger"}, + {lua_stellar_get_thread_id, MODULE_MANAGER_SPACE_NAME, "get_thread_id"}, + {lua_stellar_get_max_thread_num, MODULE_MANAGER_SPACE_NAME, "get_max_thread_num"}, + {lua_stellar_get_mq_runtime, MODULE_MANAGER_SPACE_NAME, "get_mq_runtime"}, + {lua_stellar_get_mq_schema, MODULE_MANAGER_SPACE_NAME, "get_mq_schema"}, + {lua_stellar_get_logger, MODULE_MANAGER_SPACE_NAME, "get_logger"}, {lua_packet_get_direction, PACKET_SPACE_NAME, "get_direction"}, {lua_packet_get_payload, PACKET_SPACE_NAME, "get_payload"}, @@ -46,7 +46,7 @@ struct lua_bind_func_spec lua_bind_function[] = { #define ENUM_PACKET_STAGE_SPACE_NAME "packet_stage" -struct lua_bind_data_spec lua_bind_data[] = { +struct lua_state_cbind_data_spec lua_bind_data[] = { {DATATYPE_INT, "0", ENUM_PACKET_STAGE_SPACE_NAME, "prerouting"}, {DATATYPE_INT, "1", ENUM_PACKET_STAGE_SPACE_NAME, "input"}, {DATATYPE_INT, "2", ENUM_PACKET_STAGE_SPACE_NAME, "forward"}, @@ -55,76 +55,30 @@ struct lua_bind_data_spec lua_bind_data[] = { {DATATYPE_END, NULL, NULL, NULL}, }; -static void lua_module_manager_free(struct lua_module_manager *lua_mod_mgr) -{ - if (!lua_mod_mgr) - return; - for (size_t script_index = 0; script_index < lua_mod_mgr->load_script_num; ++script_index) - { - lua_chunk_execute(lua_mod_mgr->state_array[0], lua_mod_mgr->load_script_array[script_index].lua_unload_fn_ref_id, NULL, 0, NULL, 0, NULL, 0); - } - for (size_t state_index = 0; state_index < lua_mod_mgr->state_num; ++state_index) - { - lua_state_free(lua_mod_mgr->state_array[state_index]); - } - FREE(lua_mod_mgr); - return; -} - struct stellar_module *lua_module_manager_on_init(struct stellar_module_manager *mod_mgr) { - struct stellar_module *new_mod = NULL; - struct lua_module_manager *new_lua_manage = CALLOC(struct lua_module_manager, 1); - memset(new_lua_manage, 0, sizeof(struct lua_module_manager)); - new_lua_manage->mod_mgr = mod_mgr; + struct lua_module_manager *new_lua_mod_mgr = lua_module_manager_new(mod_mgr); + if (lua_module_manager_state_create( + new_lua_mod_mgr, + lua_bind_function, + sizeof(lua_bind_function) / sizeof(struct lua_state_cbind_func_spec), + lua_bind_data, + sizeof(lua_bind_data) / sizeof(struct lua_state_cbind_data_spec))) + goto err; + + if (lua_module_manager_load_config(new_lua_mod_mgr, LUA_MODULE_MANAGE_CONF_PATH)) + goto err; - int thread_count = stellar_module_manager_get_max_thread_num(mod_mgr); - if (thread_count <= 0) - goto init_lua_module_finish; - new_lua_manage->state_num = (size_t)thread_count; - new_lua_manage->state_array = CALLOC(struct lua_state *, thread_count); - memset(new_lua_manage->state_array, 0, thread_count * sizeof(struct lua_state *)); - for (size_t thread_index = 0; thread_index < new_lua_manage->state_num; ++thread_index) - { - new_lua_manage->state_array[thread_index] = lua_state_new(new_lua_manage); - lua_cbinding_function(new_lua_manage->state_array[thread_index], lua_bind_function, (sizeof(lua_bind_function) / sizeof(struct lua_bind_func_spec))); - lua_cbinding_data(new_lua_manage->state_array[thread_index], lua_bind_data, (sizeof(lua_bind_data) / sizeof(struct lua_bind_data_spec))); - } - - struct lua_module_spec *module_spec = lua_module_config_file_load(LUA_MODULE_MANAGE_CONF_PATH, &new_lua_manage->load_script_num); - if (new_lua_manage->load_script_num && module_spec) - { - new_lua_manage->load_script_array = CALLOC(struct lua_load_script, new_lua_manage->load_script_num); - for (size_t script_index = 0; script_index < new_lua_manage->load_script_num; ++script_index) - { - if (lua_load_script_load_single_specific(&new_lua_manage->load_script_array[script_index], new_lua_manage->state_array[0], &module_spec[script_index])) - { - lua_module_spec_free(module_spec, new_lua_manage->load_script_num); - goto err; - } - } - } - else - { - goto init_lua_module_finish; - } - lua_module_spec_free(module_spec, new_lua_manage->load_script_num); - for (size_t script_index = 0; script_index < new_lua_manage->load_script_num; ++script_index) - { - lua_chunk_execute(new_lua_manage->state_array[0], new_lua_manage->load_script_array[script_index].lua_load_fn_ref_id, NULL, 0, NULL, 0, NULL, 0); - } - - for (size_t thread_index = 1; thread_index < new_lua_manage->state_num; ++thread_index) - { - lua_state_copy_ref_value(new_lua_manage->state_array[thread_index], new_lua_manage->state_array[0]); - } - -init_lua_module_finish: - new_mod = stellar_module_new(LUA_MODULE_MANAGE_MODULE_NAME, (void *)new_lua_manage); - return new_mod; + if (lua_module_manager_call_init(new_lua_mod_mgr)) + goto err; + + if (lua_module_manager_duplicate_state(new_lua_mod_mgr)) + goto err; + + struct stellar_module *module = stellar_module_new(LUA_MODULE_MANAGE_MODULE_NAME, (void *)new_lua_mod_mgr); + return module; err: - if (new_lua_manage) - lua_module_manager_free(new_lua_manage); + lua_module_manager_free(new_lua_mod_mgr); return NULL; } diff --git a/src/lua_module_manage_internal.c b/src/lua_module_manage_internal.c index bc5520d..6681b9d 100644 --- a/src/lua_module_manage_internal.c +++ b/src/lua_module_manage_internal.c @@ -1,337 +1,15 @@ #include "lua_module_manage_internal.h" - #include "stellar/utils.h" #include -#include #include #include #include - +#include #include #include #include -/* ***** ***** ***** ***** ***** ***** */ -/* lua state */ -/* ***** ***** ***** ***** ***** ***** */ -struct lua_state -{ - lua_State *state; -}; - -#define LUA_GLOBAL_INFO_REF_ID (LUA_RIDX_LAST + 2) -#define LUA_GLOBAL_INFO_MANAGE_POINTER "__global_lua_module_manage" -// #define LUA_GLOBAL_FUNCTION_REF_ID (LUA_RIDX_LAST + 3) -// #define LUA_GLOBAL_CONTEXT_REF_ID (LUA_RIDX_LAST + 4) - -struct lua_state *lua_state_new(struct lua_module_manager *lua_mod_mgr) -{ - lua_State *new_L = luaL_newstate(); - if (!new_L) - return NULL; - luaL_openlibs(new_L); - - lua_newtable(new_L); - lua_pushlightuserdata(new_L, (void *)lua_mod_mgr); - lua_setfield(new_L, -2, LUA_GLOBAL_INFO_MANAGE_POINTER); - int global_ref = luaL_ref(new_L, LUA_REGISTRYINDEX); - lua_settop(new_L, 0); - assert(global_ref == LUA_GLOBAL_INFO_REF_ID); - - return (struct lua_state *)new_L; -} - -void lua_state_free(struct lua_state *state) -{ - lua_State *L = (lua_State *)state; - lua_close(L); - return; -} - -struct lua_module_manager *lua_state_get_lua_module_manager(struct lua_state *state) -{ - lua_State *L = (lua_State *)state; - lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_GLOBAL_INFO_REF_ID); - lua_getfield(L, -1, LUA_GLOBAL_INFO_MANAGE_POINTER); - struct lua_module_manager *lua_mod_mgr = (struct lua_module_manager *)lua_topointer(L, -1); - lua_settop(L, 0); - return lua_mod_mgr; -} - -int lua_state_copy_ref_value(struct lua_state *to, struct lua_state *from) -{ - if (!to || !from) - return PARAM_ERR; - lua_State *from_L = (lua_State *)from; - lua_State *to_L = (lua_State *)to; - - lua_newtable(from_L); - int lua_ref_max_id = luaL_ref(from_L, LUA_REGISTRYINDEX); - int data_ret = 0; - for (int ref_index = (LUA_GLOBAL_INFO_REF_ID + 1); ref_index < lua_ref_max_id; ++ref_index) - { - struct lua_cdata *trans_data = lua_cdata_new(); - lua_settop(from_L, 0); - lua_rawgeti(from_L, LUA_REGISTRYINDEX, ref_index); - data_ret = lua_cdata_pop_stack(from, trans_data); - if (data_ret) - { - lua_cdata_free(trans_data); - return data_ret; - } - data_ret = lua_cdata_push_stack(to, trans_data); - if (data_ret) - { - lua_cdata_free(trans_data); - return data_ret; - } - int ref_id = luaL_ref(to_L, LUA_REGISTRYINDEX); - lua_cdata_free(trans_data); - if (ref_id != ref_index) - { - return STATE_COPY_REF_VALUE_ERR; - } - } - luaL_unref(from_L, LUA_REGISTRYINDEX, lua_ref_max_id); - return SUCCESS; -} - -/* ***** ***** ***** ***** ***** ***** */ -/* read lua module config */ -/* ***** ***** ***** ***** ***** ***** */ -struct lua_module_spec *lua_module_config_file_load(const char *config_file_name, size_t *spec_num) -{ - *spec_num = 0; - if (access(config_file_name, F_OK)) - return NULL; - FILE *fp = fopen(config_file_name, "r"); - if (!fp) - return NULL; - char errbuff[256] = {0}; - toml_table_t *toml_table = toml_parse_file(fp, errbuff, sizeof(errbuff)); - if (fp) - fclose(fp); - if (!toml_table) - return NULL; - toml_array_t *module_array = toml_array_in(toml_table, "module"); - if (!module_array) - { - toml_free(toml_table); - return NULL; - } - - int specific_nelem = toml_array_nelem(module_array); - struct lua_module_spec *new_spec = CALLOC(struct lua_module_spec, specific_nelem); - memset(new_spec, 0, (sizeof(struct lua_module_spec) * specific_nelem)); - - for (int i = 0; i < specific_nelem; ++i) - { - toml_table_t *plugin = toml_table_at(module_array, i); - const char *raw_filepath = toml_raw_in(plugin, "path"); - const char *raw_load_func_name = toml_raw_in(plugin, "init"); - const char *raw_unload_func_name = toml_raw_in(plugin, "exit"); - - /* TODO:是不是需要进行一下配置检查 */ - new_spec[i].spec_file_path = strdup(raw_filepath); - new_spec[i].spec_load_func_name = strdup(raw_load_func_name); - new_spec[i].spec_unload_func_name = strdup(raw_unload_func_name); - } - toml_free(toml_table); - *spec_num = specific_nelem; - return new_spec; -} - -void lua_module_spec_free(struct lua_module_spec spec[], size_t spec_num) -{ - if (!spec) - return; - for (size_t spec_index = 0; spec_index < spec_num; ++spec_index) - { - if (spec[spec_index].spec_file_path) - FREE(spec[spec_index].spec_file_path); - if (spec[spec_index].spec_load_func_name) - FREE(spec[spec_index].spec_load_func_name); - if (spec[spec_index].spec_unload_func_name) - FREE(spec[spec_index].spec_unload_func_name); - } - FREE(spec); - return; -} - -/* ***** ***** ***** ***** ***** ***** */ -/* binding function or data to state */ -/* ***** ***** ***** ***** ***** ***** */ -static int lua_cbinding_single_function(struct lua_state *state, struct lua_bind_func_spec *func_spec) -{ - lua_State *L = (lua_State *)state; - if (func_spec->space_name) - { - lua_getglobal(L, func_spec->space_name); - if (lua_type(L, -1) == LUA_TNIL) - { - lua_pop(L, 1); - lua_newtable(L); - } - else - { - if (lua_type(L, -1) != LUA_TTABLE) - { - lua_settop(L, 0); - return CFUNC_BIND_NAMESPACE_CONFLICT; - } - lua_getfield(L, -1, func_spec->func_name); - if (lua_type(L, -1) != LUA_TNIL) - { - lua_settop(L, 0); - return CFUNC_BIND_NAME_CONFLICT; - } - lua_pop(L, 1); - } - lua_pushcfunction(L, (lua_CFunction)func_spec->func); - lua_setfield(L, -2, func_spec->func_name); - lua_setglobal(L, func_spec->space_name); - } - else - { - lua_getglobal(L, func_spec->func_name); - if (lua_type(L, -1) != LUA_TNIL) - { - lua_settop(L, 0); - return CFUNC_BIND_NAME_CONFLICT; - } - lua_pop(L, 1); - lua_pushcfunction(L, (lua_CFunction)func_spec->func); - lua_setglobal(L, func_spec->func_name); - } - lua_settop(L, 0); - return SUCCESS; -} - -static int lua_cbinding_single_data(struct lua_state *state, struct lua_bind_data_spec *data_spec) -{ - lua_State *L = (lua_State *)state; - if (data_spec->space_name) - { - lua_getglobal(L, data_spec->space_name); - if (lua_type(L, -1) == LUA_TNIL) - { - lua_pop(L, 1); - lua_newtable(L); - } - else - { - if (lua_type(L, -1) != LUA_TTABLE) - { - lua_settop(L, 0); - return CDATA_BIND_NAMESPACE_CONFLICT; - } - lua_getfield(L, -1, data_spec->data_name); - if (lua_type(L, -1) != LUA_TNIL) - { - lua_settop(L, 0); - return CDATA_BIND_NAME_CONFLICT; - } - lua_pop(L, 1); - } - - switch (data_spec->data_type) - { - case DATATYPE_BOOL: - if (strstr(data_spec->data_value, "true") || strstr(data_spec->data_value, "TRUE")) - lua_pushboolean(L, 1); - else - lua_pushboolean(L, 0); - break; - case DATATYPE_INT: - lua_pushinteger(L, atoi(data_spec->data_value)); - break; - case DATATYPE_NUM: - lua_pushnumber(L, (lua_Number)atof(data_spec->data_value)); - break; - case DATATYPE_STRING: - lua_pushlstring(L, (const char *)data_spec->data_value, strlen(data_spec->data_value)); - break; - default: - lua_settop(L, 0); - return CDATA_BIND_TYPE_ERR; - } - lua_setfield(L, -2, data_spec->data_name); - lua_setglobal(L, data_spec->space_name); - } - else - { - lua_getglobal(L, data_spec->data_name); - if (lua_type(L, -1) != LUA_TNIL) - { - lua_settop(L, 0); - return CDATA_BIND_NAME_CONFLICT; - } - lua_pop(L, 1); - - switch (data_spec->data_type) - { - case DATATYPE_BOOL: - if (strstr(data_spec->data_value, "true") || strstr(data_spec->data_value, "TRUE")) - lua_pushboolean(L, 1); - else - lua_pushboolean(L, 0); - break; - case DATATYPE_INT: - lua_pushinteger(L, atoi(data_spec->data_value)); - break; - case DATATYPE_NUM: - lua_pushnumber(L, (lua_Number)atof(data_spec->data_value)); - break; - case DATATYPE_STRING: - lua_pushlstring(L, (const char *)data_spec->data_value, strlen(data_spec->data_value)); - break; - default: - lua_settop(L, 0); - return CDATA_BIND_TYPE_ERR; - } - lua_setglobal(L, data_spec->data_name); - } - lua_settop(L, 0); - return SUCCESS; -} - -int lua_cbinding_function(struct lua_state *state, struct lua_bind_func_spec bind_function[], size_t bind_func_num) -{ - if (!state || !bind_function) - return PARAM_ERR; - for (size_t index = 0; index < bind_func_num; ++index) - { - if (bind_function[index].func && bind_function[index].func_name) - { - int bind_ret = lua_cbinding_single_function(state, &bind_function[index]); - if (bind_ret) - return bind_ret; - } - else - break; - } - return SUCCESS; -} - -int lua_cbinding_data(struct lua_state *state, struct lua_bind_data_spec bind_data[], size_t bind_data_num) -{ - if (!state || !bind_data) - return PARAM_ERR; - for (size_t index = 0; index < bind_data_num; ++index) - { - if (bind_data[index].data_value && bind_data[index].data_name) - { - int bind_ret = lua_cbinding_single_data(state, &bind_data[index]); - if (bind_ret) - return bind_ret; - } - else - break; - } - return SUCCESS; -} - /* ***** ***** ***** ***** ***** ***** */ /* context */ /* ***** ***** ***** ***** ***** ***** */ @@ -347,7 +25,7 @@ struct lua_context *lua_context_new(struct lua_state *state) { if (!state) return NULL; - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); lua_newtable(L); int ref_id = luaL_ref(L, LUA_REGISTRYINDEX); @@ -372,7 +50,7 @@ void lua_context_free(struct lua_context *context) { if (!context) return; - luaL_unref((lua_State *)context->state, LUA_REGISTRYINDEX, context->lua_context_ref_id); + luaL_unref((lua_State *)lua_state_get_lua_State(context->state), LUA_REGISTRYINDEX, context->lua_context_ref_id); FREE(context); return; } @@ -380,7 +58,7 @@ void lua_context_free(struct lua_context *context) void lua_context_push_stack(struct lua_context *context) { if (context && context->lua_context_ref_id) - lua_rawgeti((lua_State *)context->state, LUA_REGISTRYINDEX, context->lua_context_ref_id); + lua_rawgeti((lua_State *)lua_state_get_lua_State(context->state), LUA_REGISTRYINDEX, context->lua_context_ref_id); return; } @@ -393,7 +71,7 @@ int lua_context_check_if_context(void *context) } /* ***** ***** ***** ***** ***** ***** */ -/* trans data between C and Lua */ +/* operation to lua_cdata */ /* ***** ***** ***** ***** ***** ***** */ struct lua_cnode { @@ -506,7 +184,7 @@ int lua_cdata_push_stack(struct lua_state *state, struct lua_cdata *cdata) { if (!state || !cdata) return PARAM_ERR; - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); switch (cdata->type) { @@ -554,7 +232,7 @@ int lua_cdata_pop_stack(struct lua_state *state, struct lua_cdata *cdata) { if (!state || !cdata) return PARAM_ERR; - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); lua_cdata_inner_data_free(cdata); switch (lua_type(L, -1)) @@ -635,7 +313,7 @@ static int lua_ctable_push_stack(struct lua_state *state, struct lua_ctable *cta { if (!state || !ctable) return PARAM_ERR; - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); lua_newtable(L); int push_ret = 0; for (unsigned array_index = 0; array_index < ctable->array_size; array_index++) @@ -671,7 +349,7 @@ static int lua_ctable_pop_stack(struct lua_state *state, struct lua_ctable *ctab { if (!state || !ctable) return PARAM_ERR; - lua_State *L = (lua_State *)state; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); /* 获取table长度 */ ctable->array_size = (size_t)lua_rawlen(L, -1); @@ -768,63 +446,304 @@ static const char *lua_cdata_function_writer(lua_State *state __unused, void *ud } /* ***** ***** ***** ***** ***** ***** */ -/* execute one chunk */ +/* lua state */ /* ***** ***** ***** ***** ***** ***** */ -int lua_chunk_execute( - struct lua_state *state, - int fn_ref_id, - struct lua_cdata param[], - size_t param_num, - struct lua_cdata returnvalue[], - size_t r_num, - char *errlog, - size_t err_len) +struct lua_state { - if (!state || fn_ref_id <= 0 || (param_num && !param) || (r_num && !returnvalue)) + lua_State *state; +}; + +#define LUA_GLOBAL_INFO_REF_ID (LUA_RIDX_LAST + 2) +#define LUA_GLOBAL_INFO_MANAGE_POINTER "__global_lua_module_manage" +// #define LUA_GLOBAL_FUNCTION_REF_ID (LUA_RIDX_LAST + 3) +// #define LUA_GLOBAL_CONTEXT_REF_ID (LUA_RIDX_LAST + 4) + +struct lua_state *lua_state_new(struct lua_module_manager *lua_mod_mgr) +{ + lua_State *new_L = luaL_newstate(); + if (!new_L) + return NULL; + luaL_openlibs(new_L); + + lua_newtable(new_L); + lua_pushlightuserdata(new_L, (void *)lua_mod_mgr); + lua_setfield(new_L, -2, LUA_GLOBAL_INFO_MANAGE_POINTER); + int global_ref = luaL_ref(new_L, LUA_REGISTRYINDEX); + lua_settop(new_L, 0); + assert(global_ref == LUA_GLOBAL_INFO_REF_ID); + + return (struct lua_state *)new_L; +} + +void lua_state_free(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + lua_close(L); + return; +} + +struct lua_module_manager *lua_state_get_lua_module_manager(struct lua_state *state) +{ + lua_State *L = (lua_State *)lua_state_get_lua_State(state); + lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_GLOBAL_INFO_REF_ID); + lua_getfield(L, -1, LUA_GLOBAL_INFO_MANAGE_POINTER); + struct lua_module_manager *lua_mod_mgr = (struct lua_module_manager *)lua_topointer(L, -1); + lua_settop(L, 0); + return lua_mod_mgr; +} + +void *lua_state_get_lua_State(struct lua_state *state) +{ + return (void *)state; +} + +int lua_state_cbinding_function(struct lua_state *state, struct lua_state_cbind_func_spec *bind_func_array, size_t bind_func_num) +{ + if (!state || !bind_func_array) + return PARAM_ERR; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); + for (size_t index = 0; index < bind_func_num; ++index) + { + if (bind_func_array[index].func && bind_func_array[index].func_name) + { + if (bind_func_array[index].space_name) + { + lua_getglobal(L, bind_func_array[index].space_name); + if (lua_type(L, -1) == LUA_TNIL) + { + lua_pop(L, 1); + lua_newtable(L); + } + else + { + if (lua_type(L, -1) != LUA_TTABLE) + { + lua_settop(L, 0); + return STATE_BIND_FUNC_NAMESPACE_CONFLICT; + } + lua_getfield(L, -1, bind_func_array[index].func_name); + if (lua_type(L, -1) != LUA_TNIL) + { + lua_settop(L, 0); + return STATE_BIND_FUNC_NAME_CONFLICT; + } + lua_pop(L, 1); + } + lua_pushcfunction(L, (lua_CFunction)bind_func_array[index].func); + lua_setfield(L, -2, bind_func_array[index].func_name); + lua_setglobal(L, bind_func_array[index].space_name); + } + else + { + lua_getglobal(L, bind_func_array[index].func_name); + if (lua_type(L, -1) != LUA_TNIL) + { + lua_settop(L, 0); + return STATE_BIND_FUNC_NAME_CONFLICT; + } + lua_pop(L, 1); + lua_pushcfunction(L, (lua_CFunction)bind_func_array[index].func); + lua_setglobal(L, bind_func_array[index].func_name); + } + lua_settop(L, 0); + } + else + break; + } + return SUCCESS; +} + +int lua_state_cbinding_data(struct lua_state *state, struct lua_state_cbind_data_spec *bind_data_array, size_t bind_data_num) +{ + if (!state || !bind_data_array) + return PARAM_ERR; + lua_State *L = (lua_State *)lua_state_get_lua_State(state); + for (size_t index = 0; index < bind_data_num; ++index) + { + if (bind_data_array[index].data_value && bind_data_array[index].data_name) + { + if (bind_data_array[index].space_name) + { + lua_getglobal(L, bind_data_array[index].space_name); + if (lua_type(L, -1) == LUA_TNIL) + { + lua_pop(L, 1); + lua_newtable(L); + } + else + { + if (lua_type(L, -1) != LUA_TTABLE) + { + lua_settop(L, 0); + return STATE_BIND_DATA_NAMESPACE_CONFLICT; + } + lua_getfield(L, -1, bind_data_array[index].data_name); + if (lua_type(L, -1) != LUA_TNIL) + { + lua_settop(L, 0); + return STATE_BIND_DATA_NAME_CONFLICT; + } + lua_pop(L, 1); + } + + switch (bind_data_array[index].data_type) + { + case DATATYPE_BOOL: + if (strstr(bind_data_array[index].data_value, "true") || strstr(bind_data_array[index].data_value, "TRUE")) + lua_pushboolean(L, 1); + else + lua_pushboolean(L, 0); + break; + case DATATYPE_INT: + lua_pushinteger(L, atoi(bind_data_array[index].data_value)); + break; + case DATATYPE_NUM: + lua_pushnumber(L, (lua_Number)atof(bind_data_array[index].data_value)); + break; + case DATATYPE_STRING: + lua_pushlstring(L, (const char *)bind_data_array[index].data_value, strlen(bind_data_array[index].data_value)); + break; + default: + lua_settop(L, 0); + return STATE_BIND_DATA_TYPE_ERR; + } + lua_setfield(L, -2, bind_data_array[index].data_name); + lua_setglobal(L, bind_data_array[index].space_name); + } + else + { + lua_getglobal(L, bind_data_array[index].data_name); + if (lua_type(L, -1) != LUA_TNIL) + { + lua_settop(L, 0); + return STATE_BIND_DATA_NAME_CONFLICT; + } + lua_pop(L, 1); + + switch (bind_data_array[index].data_type) + { + case DATATYPE_BOOL: + if (strstr(bind_data_array[index].data_value, "true") || strstr(bind_data_array[index].data_value, "TRUE")) + lua_pushboolean(L, 1); + else + lua_pushboolean(L, 0); + break; + case DATATYPE_INT: + lua_pushinteger(L, atoi(bind_data_array[index].data_value)); + break; + case DATATYPE_NUM: + lua_pushnumber(L, (lua_Number)atof(bind_data_array[index].data_value)); + break; + case DATATYPE_STRING: + lua_pushlstring(L, (const char *)bind_data_array[index].data_value, strlen(bind_data_array[index].data_value)); + break; + default: + lua_settop(L, 0); + return STATE_BIND_DATA_TYPE_ERR; + } + lua_setglobal(L, bind_data_array[index].data_name); + } + lua_settop(L, 0); + } + else + break; + } + return SUCCESS; +} + +int lua_state_copy_ref_value(struct lua_state *to, struct lua_state *from) +{ + if (!to || !from) + return PARAM_ERR; + lua_State *from_L = (lua_State *)lua_state_get_lua_State(from); + lua_State *to_L = (lua_State *)lua_state_get_lua_State(to); + + lua_newtable(from_L); + int lua_ref_max_id = luaL_ref(from_L, LUA_REGISTRYINDEX); + int data_ret = 0; + for (int ref_index = (LUA_GLOBAL_INFO_REF_ID + 1); ref_index < lua_ref_max_id; ++ref_index) + { + struct lua_cdata *trans_data = lua_cdata_new(); + lua_settop(from_L, 0); + lua_rawgeti(from_L, LUA_REGISTRYINDEX, ref_index); + data_ret = lua_cdata_pop_stack(from, trans_data); + if (data_ret) + { + lua_cdata_free(trans_data); + return (STATE_COPY_REF_VALUE_ERR + data_ret); + } + data_ret = lua_cdata_push_stack(to, trans_data); + if (data_ret) + { + lua_cdata_free(trans_data); + return (STATE_COPY_REF_VALUE_ERR + data_ret); + } + int ref_id = luaL_ref(to_L, LUA_REGISTRYINDEX); + lua_cdata_free(trans_data); + if (ref_id != ref_index) + { + return STATE_COPY_REF_VALUE_CONFLICT; + } + } + luaL_unref(from_L, LUA_REGISTRYINDEX, lua_ref_max_id); + return SUCCESS; +} + +int lua_state_execute_chunk( + struct lua_state *state, + int chunk_ref_id, + struct lua_cdata *param_array, + size_t param_num, + struct lua_cdata *return_array, + size_t return_num, + char *err_log, + size_t err_log_len) +{ + if (!state || chunk_ref_id <= 0 || (param_num && !param_array) || (return_num && !return_array)) return PARAM_ERR; lua_State *L = (lua_State *)state; - lua_rawgeti(L, LUA_REGISTRYINDEX, fn_ref_id); + lua_rawgeti(L, LUA_REGISTRYINDEX, chunk_ref_id); if (lua_type(L, -1) != LUA_TFUNCTION) { lua_settop(L, 0); - return CHUNK_EXECUTE_TYPE_NOT_FUNCTION; + return STATE_CHUNK_REF_ID_NOT_FUNCTION; } int pushret = 0; for (unsigned param_index = 0; param_index < param_num; ++param_index) { - if ((pushret = lua_cdata_push_stack(state, ¶m[param_index]))) + if ((pushret = lua_cdata_push_stack(state, ¶m_array[param_index]))) { lua_settop(L, 0); - return pushret; + return (STATE_CHUNK_DATA_PUSH_ERR + pushret); } } if (lua_pcall(L, param_num, LUA_MULTRET, 0)) { - if (errlog) - snprintf(errlog, (err_len - 1), "run script[%d] err %s\n", fn_ref_id, lua_tostring(L, -1)); + if (err_log) + snprintf(err_log, (err_log_len - 1), "run script[%d] err %s\n", chunk_ref_id, lua_tostring(L, -1)); lua_settop(L, 0); - return CHUNK_EXECUTE_RUN_CODE_ERR; + return STATE_CHUNK_RUNNING_ERR; } - if (r_num > 0) + if (return_num > 0) { int count = lua_gettop(L); /* 如果接收返回值数量不够, 只保留前r_num个返回值 */ - if (count > (int)r_num) + if (count > (int)return_num) { - lua_pop(L, (count - (int)r_num)); - count = (int)r_num; + lua_pop(L, (count - (int)return_num)); + count = (int)return_num; } int pop_ret = 0; for (int i = (count - 1); i >= 0; --i) { - if ((pop_ret = lua_cdata_pop_stack(state, &(returnvalue[i])))) + if ((pop_ret = lua_cdata_pop_stack(state, &(return_array[i])))) { lua_settop(L, 0); - return pop_ret; + return (STATE_CHUNK_DATA_POP_ERR + pop_ret); } } } @@ -833,30 +752,334 @@ int lua_chunk_execute( return SUCCESS; } -int lua_load_script_load_single_specific(struct lua_load_script *script, struct lua_state *state, struct lua_module_spec *module_spec) +/* ***** ***** ***** ***** ***** ***** */ +/* lua module manager */ +/* ***** ***** ***** ***** ***** ***** */ +struct lua_fn_arg_pair { - if (!state || !module_spec || !script) + struct lua_fn_arg_pair *next; + struct lua_module_manager *lua_mod_mgr; + int lua_fn_ref_id; + int lua_arg_ref_id; +}; + +struct lua_fn_arg_pair *lua_fn_arg_pair_new(struct lua_module_manager *lua_mod_mgr, int fn_ref_id, int arg_ref_id) +{ + struct lua_fn_arg_pair *new_pair = CALLOC(struct lua_fn_arg_pair, 1); + new_pair->lua_mod_mgr = lua_mod_mgr; + new_pair->lua_fn_ref_id = fn_ref_id; + new_pair->lua_arg_ref_id = arg_ref_id; + return new_pair; +} + +void lua_fn_arg_pair_free(struct lua_fn_arg_pair *pair) +{ + if (pair) + FREE(pair); + return; +} + +void lua_fn_arg_pair_insert(struct lua_fn_arg_pair *pair) +{ + lua_module_manger_pair_list_insert(pair->lua_mod_mgr, pair); + return; +} + +int lua_fn_arg_pair_get_fn_ref_id(struct lua_fn_arg_pair *pair) +{ + if (pair) + return pair->lua_fn_ref_id; + return 0; +} + +int lua_fn_arg_pair_get_arg_ref_id(struct lua_fn_arg_pair *pair) +{ + if (pair) + return pair->lua_arg_ref_id; + return 0; +} + +struct lua_module_manager *lua_fn_arg_pair_get_lua_mod_mgr(struct lua_fn_arg_pair *pair) +{ + if (pair) + return pair->lua_mod_mgr; + return NULL; +} + +struct lua_load_script +{ + char *file_path; + char *init_func_name; + char *exit_func_name; + int lua_init_fn_ref_id; + int lua_exit_fn_ref_id; + int lua_script_env_ref_id; +}; + +struct lua_module_manager +{ + struct stellar_module_manager *mod_mgr; + + size_t state_num; + size_t load_script_num; + struct lua_state **state_array; + struct lua_load_script *load_script_array; + + struct lua_fn_arg_pair *pair_list; +}; +/* + struct lua_fn_arg_pair *mq_dispatch_list; + struct lua_fn_arg_pair *mq_msg_free_list; + struct lua_fn_arg_pair *mq_on_msg_list; + + struct lua_fn_arg_pair *on_packet_stage_list; + struct lua_fn_arg_pair *on_session_tcp_list; + struct lua_fn_arg_pair *on_session_udp_list; + struct lua_fn_arg_pair *on_session_control_packet_list; + struct lua_fn_arg_pair *on_tcp_stream_list; +*/ + +struct lua_module_manager *lua_module_manager_new(struct stellar_module_manager *mod_mgr) +{ + if (!mod_mgr) + return NULL; + struct lua_module_manager *new_lua_mod_mgr = CALLOC(struct lua_module_manager, 1); + memset(new_lua_mod_mgr, 0, sizeof(struct lua_module_manager)); + new_lua_mod_mgr->mod_mgr = mod_mgr; + return new_lua_mod_mgr; +} + +/* +static inline void lua_fn_arg_pair_list_free(struct lua_fn_arg_pair *pair) +{ + struct lua_fn_arg_pair *free_pair = NULL; + struct lua_fn_arg_pair *next_pair = NULL; + free_pair = pair; + while (free_pair) + { + next_pair = free_pair->next; + FREE(free_pair); + free_pair = next_pair; + } + return; +} +*/ + +void lua_module_manager_free(struct lua_module_manager *lua_mod_mgr) +{ + if (!lua_mod_mgr) + return; + + lua_module_manager_call_exit(lua_mod_mgr); + for (size_t state_index = 0; state_index < lua_mod_mgr->state_num; ++state_index) + { + lua_state_free(lua_mod_mgr->state_array[state_index]); + } + FREE(lua_mod_mgr->state_array); + + for (size_t script_index = 0; script_index < lua_mod_mgr->load_script_num; ++script_index) + { + if (lua_mod_mgr->load_script_array[script_index].file_path) + FREE(lua_mod_mgr->load_script_array[script_index].file_path); + if (lua_mod_mgr->load_script_array[script_index].init_func_name) + FREE(lua_mod_mgr->load_script_array[script_index].init_func_name); + if (lua_mod_mgr->load_script_array[script_index].exit_func_name) + FREE(lua_mod_mgr->load_script_array[script_index].exit_func_name); + } + FREE(lua_mod_mgr->load_script_array); + + struct lua_fn_arg_pair *free_pair = lua_mod_mgr->pair_list; + struct lua_fn_arg_pair *next_pair = NULL; + while (free_pair) + { + next_pair = free_pair->next; + FREE(free_pair); + free_pair = next_pair; + } + /* + lua_fn_arg_pair_list_free(lua_mod_mgr->mq_msg_free_list); + lua_fn_arg_pair_list_free(lua_mod_mgr->mq_on_msg_list); + lua_fn_arg_pair_list_free(lua_mod_mgr->on_packet_stage_list); + lua_fn_arg_pair_list_free(lua_mod_mgr->on_session_tcp_list); + lua_fn_arg_pair_list_free(lua_mod_mgr->on_session_udp_list); + lua_fn_arg_pair_list_free(lua_mod_mgr->on_session_control_packet_list); + lua_fn_arg_pair_list_free(lua_mod_mgr->on_tcp_stream_list); + */ + + FREE(lua_mod_mgr); + return; +} + +int lua_module_manager_state_create( + struct lua_module_manager *lua_mod_mgr, + struct lua_state_cbind_func_spec *bind_func_array, + size_t bind_func_num, + struct lua_state_cbind_data_spec *bind_data_array, + size_t bind_data_num) +{ + if (!lua_mod_mgr) return PARAM_ERR; - lua_State *L = (lua_State *)state; - if (luaL_loadfile(L, module_spec->spec_file_path) || lua_pcall(L, 0, 0, 0)) + int thread_num = stellar_module_manager_get_max_thread_num(lua_mod_mgr->mod_mgr); + if (thread_num < 0) + return LMM_STATE_THREAD_NUM_ERR; + lua_mod_mgr->state_num = (size_t)thread_num; + if (lua_mod_mgr->state_num == 0) + return SUCCESS; + + lua_mod_mgr->state_array = CALLOC(struct lua_state *, lua_mod_mgr->state_num); + memset(lua_mod_mgr->state_array, 0, sizeof(struct lua_state *) * lua_mod_mgr->state_num); + int bind_ret = SUCCESS; + for (size_t state_index = 0; state_index < lua_mod_mgr->state_num; ++state_index) { - lua_settop(L, 0); - return SCRIPT_LOAD_FILE_ERR; + lua_mod_mgr->state_array[state_index] = lua_state_new(lua_mod_mgr); + if (!lua_mod_mgr->state_array[state_index]) + return LMM_STATE_CREATE_ERR; + bind_ret = lua_state_cbinding_function(lua_mod_mgr->state_array[state_index], bind_func_array, bind_func_num); + if (bind_ret) + return bind_ret; + bind_ret = lua_state_cbinding_data(lua_mod_mgr->state_array[state_index], bind_data_array, bind_data_num); + if (bind_ret) + return bind_ret; } - lua_getglobal(L, module_spec->spec_load_func_name); - lua_getglobal(L, module_spec->spec_unload_func_name); - if (lua_type(L, -1) != LUA_TFUNCTION || lua_type(L, -2) != LUA_TFUNCTION) - { - lua_settop(L, 0); - return SCRIPT_LOAD_FUNCTION_TYPE_ERR; - } - script->lua_unload_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); - script->lua_load_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); - - lua_newtable(L); - script->lua_script_env_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); - - lua_settop(L, 0); return SUCCESS; } + +int lua_module_manager_load_config(struct lua_module_manager *lua_mod_mgr, const char *conf_file_path) +{ + if (!lua_mod_mgr || !conf_file_path) + return PARAM_ERR; + lua_mod_mgr->load_script_num = 0; + + if (access(conf_file_path, F_OK)) + return LMM_LOAD_CONFIG_FILE_NOT_EXIST; + FILE *fp = fopen(conf_file_path, "r"); + if (!fp) + return LMM_LOAD_CONFIG_FILE_OPEN_ERR; + char errbuff[256] = {0}; + toml_table_t *toml_table = toml_parse_file(fp, errbuff, sizeof(errbuff)); + if (fp) + fclose(fp); + if (!toml_table) + return LMM_LOAD_CONFIG_FILE_TOML_PARSE_ERR; + + toml_array_t *module_array = toml_array_in(toml_table, "module"); + if (!module_array) + { + /* 没有module配置 */ + toml_free(toml_table); + return SUCCESS; + } + lua_mod_mgr->load_script_num = (size_t)toml_array_nelem(module_array); + lua_mod_mgr->load_script_array = CALLOC(struct lua_load_script, lua_mod_mgr->load_script_num); + memset(lua_mod_mgr->load_script_array, 0, (sizeof(struct lua_load_script) * lua_mod_mgr->load_script_num)); + + for (size_t index = 0; index < lua_mod_mgr->load_script_num; ++index) + { + toml_table_t *plugin = toml_table_at(module_array, index); + const char *raw_filepath = toml_raw_in(plugin, "path"); + const char *raw_load_func_name = toml_raw_in(plugin, "init"); + const char *raw_unload_func_name = toml_raw_in(plugin, "exit"); + + /* TODO:是不是需要进行一下配置检查 */ + lua_mod_mgr->load_script_array[index].file_path = strdup(raw_filepath); + lua_mod_mgr->load_script_array[index].init_func_name = strdup(raw_load_func_name); + lua_mod_mgr->load_script_array[index].exit_func_name = strdup(raw_unload_func_name); + } + toml_free(toml_table); + + return SUCCESS; +} + +int lua_module_manager_call_init(struct lua_module_manager *lua_mod_mgr) +{ + if (!lua_mod_mgr) + return PARAM_ERR; + if (lua_mod_mgr->state_num == 0) + return SUCCESS; + + lua_State *L = (lua_State *)lua_state_get_lua_State(lua_mod_mgr->state_array[0]); + int execute_ret = SUCCESS; + for (size_t script_index = 0; script_index < lua_mod_mgr->load_script_num; ++script_index) + { + if (luaL_loadfile(L, lua_mod_mgr->load_script_array[script_index].file_path) || lua_pcall(L, 0, 0, 0)) + { + lua_settop(L, 0); + return LMM_LOAD_SCRIPT_FILE_OPEN_ERR; + } + lua_getglobal(L, lua_mod_mgr->load_script_array[script_index].init_func_name); + lua_getglobal(L, lua_mod_mgr->load_script_array[script_index].exit_func_name); + if (lua_type(L, -1) != LUA_TFUNCTION || lua_type(L, -2) != LUA_TFUNCTION) + { + lua_settop(L, 0); + return LMM_LOAD_SCRIPT_FUNC_TYPE_ERR; + } + lua_mod_mgr->load_script_array[script_index].lua_exit_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + lua_mod_mgr->load_script_array[script_index].lua_init_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + lua_newtable(L); + lua_mod_mgr->load_script_array[script_index].lua_script_env_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + + execute_ret = lua_state_execute_chunk(lua_mod_mgr->state_array[0], lua_mod_mgr->load_script_array[script_index].lua_init_fn_ref_id, NULL, 0, NULL, 0, NULL, 0); + if (execute_ret) + return execute_ret; + } + + return SUCCESS; +} + +int lua_module_manager_duplicate_state(struct lua_module_manager *lua_mod_mgr) +{ + if (!lua_mod_mgr) + return PARAM_ERR; + if (lua_mod_mgr->state_num <= 1) + return SUCCESS; + + int copy_ret = SUCCESS; + for (size_t thread_index = 1; thread_index < lua_mod_mgr->state_num; ++thread_index) + { + copy_ret = lua_state_copy_ref_value(lua_mod_mgr->state_array[thread_index], lua_mod_mgr->state_array[0]); + if (copy_ret) + return copy_ret; + } + return SUCCESS; +} + +void lua_module_manger_pair_list_insert(struct lua_module_manager *lua_mod_mgr, struct lua_fn_arg_pair *pair) +{ + if (!lua_mod_mgr || !pair) + return; + LL_APPEND(lua_mod_mgr->pair_list, pair); + return; +} + +int lua_module_manager_call_exit(struct lua_module_manager *lua_mod_mgr) +{ + if (!lua_mod_mgr) + return PARAM_ERR; + if (lua_mod_mgr->state_num == 0) + return SUCCESS; + + int execute_ret = SUCCESS; + for (size_t script_index = 0; script_index < lua_mod_mgr->load_script_num; ++script_index) + { + execute_ret = lua_state_execute_chunk(lua_mod_mgr->state_array[0], lua_mod_mgr->load_script_array[script_index].lua_exit_fn_ref_id, NULL, 0, NULL, 0, NULL, 0); + if (execute_ret) + return execute_ret; + } + return SUCCESS; +} + +struct lua_state *lua_module_manager_get_current_thread_state(struct lua_module_manager *lua_mod_mgr) +{ + if (!lua_mod_mgr) + return NULL; + int thread_id = stellar_module_manager_get_thread_id(lua_mod_mgr->mod_mgr); + return lua_mod_mgr->state_array[thread_id]; +} + +struct stellar_module_manager *lua_module_manager_get_stellar_module_manager(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + return lua_mod_mgr->mod_mgr; + return NULL; +} \ No newline at end of file diff --git a/src/lua_module_manage_internal.h b/src/lua_module_manage_internal.h index 79fe560..93c3426 100644 --- a/src/lua_module_manage_internal.h +++ b/src/lua_module_manage_internal.h @@ -1,231 +1,156 @@ -#ifndef LUA_MODULE_MANAGE_INTERNAL_H -#define LUA_MODULE_MANAGE_INTERNAL_H +#pragma once + +#ifdef __cplusplus +extern "C" +{ +#endif #include #include "lua_module_manage.h" -struct lua_state; -struct lua_module_manager; - -enum LUA_MODULE_ERR_CODE -{ - /* 加载配置到状态机中错误码 */ - SCRIPT_ERR = -400, - SCRIPT_LOAD_FILE_ERR, /* 配置拷贝至状态机过程中无法处理Lua文件 */ - SCRIPT_LOAD_FUNCTION_TYPE_ERR, /* 获取得到的函数名称不是全局函数, 无法加载 */ - /* 代码块执行过程中错误码 */ - CHUNK_ERR = -300, - CHUNK_EXECUTE_TYPE_NOT_FUNCTION, /* 执行代码块过程中根据ref_id获取得到的变量不是函数 */ - CHUNK_EXECUTE_RUN_CODE_ERR, /* 执行代码块运行错误 */ - /* 函数与全局变量操作错误码 */ - CDATA_ERR = -200, - CFUNC_BIND_NAMESPACE_CONFLICT, /* 命名空间数据类型不符 */ - CFUNC_BIND_NAME_CONFLICT, /* 绑定函数的函数名称与已有数据冲突 */ - CDATA_BIND_NAMESPACE_CONFLICT, /* 命名空间数据类型不符 */ - CDATA_BIND_NAME_CONFLICT, /* 全局变量名称与已有数据冲突 */ - CDATA_BIND_TYPE_ERR, /* 数据类型无法识别或存在异常 */ - CDATA_SET_VALUE_TYPE_UNSUPPORT, /* 使用了未识别的数据类型 */ - CDATA_PUSH_STACK_TYPE_UNKNOWN, /* 入栈数据无法识别数据类型 */ - CDATA_POP_STACK_TYPE_UNSUPPORT, /* 出栈数据类型不支持出栈 */ - /* 状态机基础操作中错误码 */ - STATE_ERR = -100, - STATE_COPY_REF_VALUE_ERR, /* 在状态机之间拷贝数据过程中出现异常 */ - /* 通用返回值 */ - PARAM_ERR = -1, /* 传入参数错误, 可能是指针为空或类型不符合 */ - SUCCESS = 0, /* 运行成功 */ -}; - -/* ***** ***** ***** ***** ***** ***** */ -struct lua_state *lua_state_new(struct lua_module_manager *lua_mod_mgr); -void lua_state_free(struct lua_state *state); -struct lua_module_manager *lua_state_get_lua_module_manager(struct lua_state *state); -int lua_state_copy_ref_value(struct lua_state *to, struct lua_state *from); - -/* ***** ***** ***** ***** ***** ***** */ -struct lua_module_spec -{ - char *spec_file_path; /* 插件需要使用的文件名 */ - char *spec_load_func_name; /* 加载插件需要调用的函数名称 */ - char *spec_unload_func_name; /* 卸载插件需要调用的函数名称 */ -}; -struct lua_module_spec *lua_module_config_file_load(const char *config_file_name, size_t *spec_num); -void lua_module_spec_free(struct lua_module_spec spec[], size_t spec_num); - -/* ***** ***** ***** ***** ***** ***** */ -/* 需要注册至lua中的函数 */ -typedef int (*lua_cbind_func)(struct lua_state *state); -struct lua_bind_func_spec -{ - lua_cbind_func func; /* 注册函数原型 */ - char *func_name; /* 注册至lua中的函数名称 */ - char *space_name; /* 注册至lua中的命名空间名称 */ -}; -int lua_cbinding_function(struct lua_state *state, struct lua_bind_func_spec bind_function[], size_t bind_func_num); - -enum LUA_DATATYPE -{ - DATATYPE_BEGIN = 0, - DATATYPE_NIL, /* nil类型 */ - DATATYPE_BOOL, /* bool类型 */ - DATATYPE_INT, /* int类型 */ - DATATYPE_NUM, /* double类型 */ - DATATYPE_STRING, /* 字符串类型 */ - /* 以下类型不能用于全局变量注册 */ - DATATYPE_BUFF, /* 传递报文payload时使用 */ - DATATYPE_TABLE, /* table类型 */ - DATATYPE_POINTER, /* 指针类型 */ - DATATYPE_CONTEXT, /* context上下文类型 */ - DATATYPE_LUA_TABLE, /* 此类型用于在lua之间翻译传递数据 */ - DATATYPE_FUNCTION, /* 函数类型 */ - DATATYPE_END -}; - -/* 需要注册至lua状态机中的数据 */ -struct lua_bind_data_spec -{ - enum LUA_DATATYPE data_type; /* 注册的数据类型 */ - char *data_value; /* 注册数数据值 */ - char *data_name; /* 注册的数据名称 */ - char *space_name; /* 注册至lua中的命名空间名称 */ -}; -int lua_cbinding_data(struct lua_state *state, struct lua_bind_data_spec bind_data[], size_t bind_data_num); - -/* ***** ***** ***** ***** ***** ***** */ -struct lua_context; -struct lua_context *lua_context_new(struct lua_state *state); -struct lua_context *lua_context_new_with_ref_id(struct lua_state *state, int ref_id); -void lua_context_free(struct lua_context *context); -void lua_context_push_stack(struct lua_context *context); -int lua_context_check_if_context(void *context); - -/* ***** ***** ***** ***** ***** ***** */ -struct lua_ctable; -struct lua_cdata -{ - enum LUA_DATATYPE type; - size_t data_len; /* 只有在类型为buff或function时使用此标识 */ - union + enum LUA_MODULE_ERR_CODE { - int bool; - int integer; - double number; - char *string; + /* 函数与全局变量操作错误码 */ + CDATA_ERR = -300, + CDATA_SET_VALUE_TYPE_UNSUPPORT, /* 使用了未识别的数据类型 */ + CDATA_PUSH_STACK_TYPE_UNKNOWN, /* 入栈数据无法识别数据类型 */ + CDATA_POP_STACK_TYPE_UNSUPPORT, /* 出栈数据类型不支持出栈 */ + /* 状态机基础操作中错误码 */ + STATE_ERR = -200, + STATE_BIND_FUNC_NAMESPACE_CONFLICT, /* 命名空间数据类型不符 */ + STATE_BIND_FUNC_NAME_CONFLICT, /* 绑定函数的函数名称与已有数据冲突 */ + STATE_BIND_DATA_NAMESPACE_CONFLICT, /* 命名空间数据类型不符 */ + STATE_BIND_DATA_NAME_CONFLICT, /* 全局变量名称与已有数据冲突 */ + STATE_BIND_DATA_TYPE_ERR, /* 数据类型无法识别或存在异常 */ + STATE_COPY_REF_VALUE_ERR, /* 在状态机之间拷贝数据过程中数据拷贝出现异常 */ + STATE_COPY_REF_VALUE_CONFLICT, /* 在状态机之间拷贝数据过程中出现引用ID不匹配的情况 */ + STATE_CHUNK_REF_ID_NOT_FUNCTION, /* 传入的ref_id获取值之后不是函数类型 */ + STATE_CHUNK_DATA_PUSH_ERR, /* 参数入栈过程中异常 */ + STATE_CHUNK_DATA_POP_ERR, /* 返回值出栈过程中异常 */ + STATE_CHUNK_RUNNING_ERR, /* CHUNK在调用pcall执行过程中运行错误 */ + /* lua module manager错误码 */ + LUA_MOD_MGR_ERR = -100, + LMM_STATE_THREAD_NUM_ERR, + LMM_STATE_CREATE_ERR, + LMM_LOAD_CONFIG_FILE_NOT_EXIST, + LMM_LOAD_CONFIG_FILE_OPEN_ERR, + LMM_LOAD_CONFIG_FILE_TOML_PARSE_ERR, + LMM_LOAD_SCRIPT_FILE_OPEN_ERR, + LMM_LOAD_SCRIPT_FUNC_TYPE_ERR, - char *buff; - int table; - void *pointer; - struct lua_context *context; - void *function; - struct lua_ctable *ctable; + LMM_CALL_INIT_FILE_OPEN_ERR, + LMM_CALL_INIT_FUNCTION_TYPE_ERR, + LMM_CALL_EXIT_FILE_OPEN_ERR, + LMM_CALL_EXIT_FUNCTION_TYPE_ERR, + /* 通用返回值 */ + PARAM_ERR = -1, /* 传入参数错误, 可能是指针为空或类型不符合 */ + SUCCESS = 0, /* 运行成功 */ }; -}; -struct lua_cdata *lua_cdata_new(void); -void lua_cdata_free(struct lua_cdata *cdata); -int lua_cdata_data_set(struct lua_cdata *cdata, enum LUA_DATATYPE type, void *value_p, int value_i); -int lua_cdata_push_stack(struct lua_state *state, struct lua_cdata *cdata); -int lua_cdata_pop_stack(struct lua_state *state, struct lua_cdata *cdata); -/* ***** ***** ***** ***** ***** ***** */ -int lua_chunk_execute(struct lua_state *state, int fn_ref_id, struct lua_cdata param[], size_t param_num, struct lua_cdata returnvalue[], size_t r_num, char *errlog, size_t err_len); + struct lua_state; + struct lua_module_manager; -struct lua_load_script -{ - int lua_load_fn_ref_id; - int lua_unload_fn_ref_id; - int lua_script_env_ref_id; -}; -int lua_load_script_load_single_specific(struct lua_load_script *load_script, struct lua_state *state, struct lua_module_spec *module_spec); + /* ***** ***** ***** ***** ***** ***** */ + struct lua_context; + struct lua_context *lua_context_new(struct lua_state *state); + struct lua_context *lua_context_new_with_ref_id(struct lua_state *state, int ref_id); + void lua_context_free(struct lua_context *context); + void lua_context_push_stack(struct lua_context *context); + int lua_context_check_if_context(void *context); -struct lua_fn_arg_pair -{ - struct lua_fn_arg_pair *next; - struct lua_module_manager *lua_mod_mgr; - int lua_fn_ref_id; - int lua_arg_ref_id; -}; + /* ***** ***** ***** ***** ***** ***** */ + enum LUA_DATATYPE + { + DATATYPE_BEGIN = 0, + DATATYPE_NIL, /* nil类型 */ + DATATYPE_BOOL, /* bool类型 */ + DATATYPE_INT, /* int类型 */ + DATATYPE_NUM, /* double类型 */ + DATATYPE_STRING, /* 字符串类型 */ + /* 以下类型不能用于全局变量注册 */ + DATATYPE_BUFF, /* 传递报文payload时使用 */ + DATATYPE_TABLE, /* table类型 */ + DATATYPE_POINTER, /* 指针类型 */ + DATATYPE_CONTEXT, /* context上下文类型 */ + DATATYPE_LUA_TABLE, /* 此类型用于在lua之间翻译传递数据 */ + DATATYPE_FUNCTION, /* 函数类型 */ + DATATYPE_END + }; -/* -struct lua_mq_dispatch_arg -{ - struct lua_mq_dispatch_arg *next; - struct lua_module_manage *module_manage; - int topic_id; - int lua_mq_dispatch_fn_ref_id; - int lua_mq_dispatch_arg_ref_id; -}; + struct lua_ctable; + struct lua_cdata + { + enum LUA_DATATYPE type; + size_t data_len; /* 只有在类型为buff或function时使用此标识 */ + union + { + int bool; + int integer; + double number; + char *string; -struct lua_mq_msg_free_arg -{ - struct lua_mq_msg_free_arg *next; - struct lua_module_manage *module_manage; - int topic_id; - int lua_mq_msg_free_fn_ref_id; - int lua_mq_msg_free_arg_ref_id; -}; + char *buff; + int table; + void *pointer; + struct lua_context *context; + void *function; + struct lua_ctable *ctable; + }; + }; + struct lua_cdata *lua_cdata_new(void); + void lua_cdata_free(struct lua_cdata *cdata); + int lua_cdata_data_set(struct lua_cdata *cdata, enum LUA_DATATYPE type, void *value_p, int value_i); + int lua_cdata_push_stack(struct lua_state *state, struct lua_cdata *cdata); + int lua_cdata_pop_stack(struct lua_state *state, struct lua_cdata *cdata); -struct lua_mq_on_msg_arg -{ - struct lua_mq_on_msg_arg *next; - struct lua_module_manage *module_manage; - int topic_id; - int lua_mq_on_msg_fn_ref_id; - int lua_mq_on_msg_arg_ref_id; -}; + /* ***** ***** ***** ***** ***** ***** */ + typedef int (*lua_cbind_func)(struct lua_state *state); + struct lua_state_cbind_func_spec + { + lua_cbind_func func; /* 注册函数原型 */ + char *func_name; /* 注册至lua中的函数名称 */ + char *space_name; /* 注册至lua中的命名空间名称 */ + }; -struct lua_on_packet_stage_callback_arg{ - struct lua_on_packet_stage_callback_arg * next; - struct lua_module_manage * module_manage; - int lua_on_packet_stage_fn_ref_id; - int lua_on_packet_stage_arg_ref_id; -}; + struct lua_state_cbind_data_spec + { + enum LUA_DATATYPE data_type; /* 注册的数据类型 */ + char *data_value; /* 注册数数据值 */ + char *data_name; /* 注册的数据名称 */ + char *space_name; /* 注册至lua中的命名空间名称 */ + }; -struct lua_on_session_callback_arg -{ - struct lua_on_session_callback_arg * next; - struct lua_module_manage * module_manage; - int lua_on_session_fn_ref_id; - int lua_on_session_arg_ref_id; -}; + /* ***** ***** ***** ***** ***** ***** */ + struct lua_state *lua_state_new(struct lua_module_manager *lua_mod_mgr); + void lua_state_free(struct lua_state *state); + struct lua_module_manager *lua_state_get_lua_module_manager(struct lua_state *state); + void *lua_state_get_lua_State(struct lua_state *state); + int lua_state_cbinding_function(struct lua_state *state, struct lua_state_cbind_func_spec *bind_func_array, size_t bind_func_num); + int lua_state_cbinding_data(struct lua_state *state, struct lua_state_cbind_data_spec *bind_data_array, size_t bind_data_num); + int lua_state_copy_ref_value(struct lua_state *to, struct lua_state *from); + int lua_state_execute_chunk(struct lua_state *state, int chunk_ref_id, struct lua_cdata *param_array, size_t param_num, struct lua_cdata *return_array, size_t return_num, char *err_log, size_t err_log_len); -struct lua_on_tcp_stream_callback_arg -{ - struct lua_on_tcp_stream_callback_arg * next; - struct lua_module_manage * module_manage; - int lua_on_tcp_stream_fn_ref_id; - int lua_on_tcp_stream_arg_ref_id; -}; -*/ + /* ***** ***** ***** ***** ***** ***** */ + struct lua_fn_arg_pair; + struct lua_fn_arg_pair *lua_fn_arg_pair_new(struct lua_module_manager *lua_mod_mgr, int fn_ref_id, int arg_ref_id); + void lua_fn_arg_pair_free(struct lua_fn_arg_pair *pair); + void lua_fn_arg_pair_insert(struct lua_fn_arg_pair *pair); + int lua_fn_arg_pair_get_fn_ref_id(struct lua_fn_arg_pair *pair); + int lua_fn_arg_pair_get_arg_ref_id(struct lua_fn_arg_pair *pair); + struct lua_module_manager *lua_fn_arg_pair_get_lua_mod_mgr(struct lua_fn_arg_pair *pair); -struct lua_module_manager -{ - struct stellar_module_manager *mod_mgr; - - size_t state_num; - struct lua_state **state_array; - size_t load_script_num; - // struct lua_module_spec *module_spec_array; - struct lua_load_script *load_script_array; - - struct lua_fn_arg_pair *mq_dispatch_list; - struct lua_fn_arg_pair *mq_msg_free_list; - struct lua_fn_arg_pair *mq_on_msg_list; - - struct lua_fn_arg_pair *on_packet_stage_list; - struct lua_fn_arg_pair *on_session_tcp_list; - struct lua_fn_arg_pair *on_session_udp_list; - struct lua_fn_arg_pair *on_session_control_packet_list; - struct lua_fn_arg_pair *on_tcp_stream_list; - /* - struct lua_mq_dispatch_arg *mq_dispatch_list; - struct lua_mq_msg_free_arg *mq_msg_free_list; - struct lua_mq_on_msg_arg *mq_on_msg_list; - - struct lua_on_packet_stage_callback_arg *on_packet_stage_list; - struct lua_on_session_callback_arg *on_session_tcp_list; - struct lua_on_session_callback_arg *on_session_udp_list; - struct lua_on_session_callback_arg *on_session_control_packet_list; - struct lua_on_tcp_stream_callback_arg * on_tcp_stream_list; - */ -}; + /* ***** ***** ***** ***** ***** ***** */ + struct lua_module_manager *lua_module_manager_new(struct stellar_module_manager *mod_mgr); + void lua_module_manager_free(struct lua_module_manager *lua_mod_mgr); + int lua_module_manager_state_create(struct lua_module_manager *lua_mod_mgr, struct lua_state_cbind_func_spec *bind_func_array, size_t bind_func_num, struct lua_state_cbind_data_spec *bind_data_array, size_t bind_data_num); + int lua_module_manager_load_config(struct lua_module_manager *lua_mod_mgr, const char *conf_file_path); + int lua_module_manager_call_init(struct lua_module_manager *lua_mod_mgr); + int lua_module_manager_duplicate_state(struct lua_module_manager *lua_mod_mgr); + void lua_module_manger_pair_list_insert(struct lua_module_manager *lua_mod_mgr, struct lua_fn_arg_pair *pair); + int lua_module_manager_call_exit(struct lua_module_manager *lua_mod_mgr); + struct lua_state *lua_module_manager_get_current_thread_state(struct lua_module_manager *lua_mod_mgr); + struct stellar_module_manager *lua_module_manager_get_stellar_module_manager(struct lua_module_manager *lua_mod_mgr); +#ifdef __cplusplus +} #endif \ No newline at end of file