diff options
Diffstat (limited to 'src/lua_module_manage_internal.c')
| -rw-r--r-- | src/lua_module_manage_internal.c | 310 |
1 files changed, 196 insertions, 114 deletions
diff --git a/src/lua_module_manage_internal.c b/src/lua_module_manage_internal.c index 6681b9d..aa0bcef 100644 --- a/src/lua_module_manage_internal.c +++ b/src/lua_module_manage_internal.c @@ -25,7 +25,7 @@ struct lua_context *lua_context_new(struct lua_state *state) { if (!state) return NULL; - lua_State *L = (lua_State *)lua_state_get_lua_State(state); + lua_State *L = (lua_State *)(state); lua_newtable(L); int ref_id = luaL_ref(L, LUA_REGISTRYINDEX); @@ -50,7 +50,7 @@ void lua_context_free(struct lua_context *context) { if (!context) return; - luaL_unref((lua_State *)lua_state_get_lua_State(context->state), LUA_REGISTRYINDEX, context->lua_context_ref_id); + luaL_unref((lua_State *)(context->state), LUA_REGISTRYINDEX, context->lua_context_ref_id); FREE(context); return; } @@ -58,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 *)lua_state_get_lua_State(context->state), LUA_REGISTRYINDEX, context->lua_context_ref_id); + lua_rawgeti((lua_State *)(context->state), LUA_REGISTRYINDEX, context->lua_context_ref_id); return; } @@ -88,6 +88,26 @@ struct lua_ctable struct lua_cnode **node_data; }; +struct lua_cdata +{ + enum LUA_DATATYPE type; + size_t data_len; /* 只有在类型为buff或function时使用此标识 */ + union + { + int bool; + int integer; + double number; + char *string; + + char *buff; + int table; + void *pointer; + struct lua_context *context; + void *function; + struct lua_ctable *ctable; + }; +}; + static struct lua_ctable *lua_ctable_new(void); static void lua_ctable_free(struct lua_ctable *ctable); static int lua_ctable_push_stack(struct lua_state *state, struct lua_ctable *ctable); @@ -104,9 +124,9 @@ struct lua_cdata *lua_cdata_new(void) return new_data; } -static void lua_cdata_inner_data_free(struct lua_cdata *cdata) +static void lua_cdata_inner_data_clean(struct lua_cdata *cdata) { - cdata->type = 0; + cdata->type = DATATYPE_BEGIN; cdata->data_len = 0; switch (cdata->type) { @@ -132,16 +152,42 @@ void lua_cdata_free(struct lua_cdata *cdata) { if (!cdata) return; - lua_cdata_inner_data_free(cdata); + lua_cdata_inner_data_clean(cdata); FREE(cdata); return; } +struct lua_cdata *lua_cdata_array_new(size_t cdata_num) +{ + if (cdata_num == 0) + return NULL; + struct lua_cdata *new_cdata = CALLOC(struct lua_cdata, cdata_num); + memset(new_cdata, 0, sizeof(struct lua_cdata) * cdata_num); + return new_cdata; +} + +void lua_cdata_array_free(struct lua_cdata *cdata_array, size_t data_num) +{ + if (!cdata_array || data_num == 0) + return; + for (size_t data_index = 0; data_index < data_num; ++data_index) + { + lua_cdata_inner_data_clean(&cdata_array[data_index]); + } + FREE(cdata_array); + return; +} + +struct lua_cdata *lua_cdata_array_get_index(struct lua_cdata *data_array, size_t index) +{ + return (struct lua_cdata *)(data_array + index); +} + int lua_cdata_data_set(struct lua_cdata *cdata, enum LUA_DATATYPE type, void *value_p, int value_i) { if (!cdata) return PARAM_ERR; - lua_cdata_inner_data_free(cdata); + lua_cdata_inner_data_clean(cdata); switch (type) { case DATATYPE_NIL: @@ -156,10 +202,15 @@ int lua_cdata_data_set(struct lua_cdata *cdata, enum LUA_DATATYPE type, void *va cdata->number = *(double *)value_p; break; case DATATYPE_STRING: + if (!value_p || value_i <= 0) + return CDATA_SET_VALUE_NULL_POINTER; cdata->string = CALLOC(char, value_i); memcpy(cdata->string, value_p, (size_t)value_i); + cdata->data_len = (size_t)value_i; break; case DATATYPE_BUFF: + if (!value_p || value_i <= 0) + return CDATA_SET_VALUE_NULL_POINTER; cdata->buff = CALLOC(char, value_i); memcpy(cdata->buff, value_p, (size_t)value_i); cdata->data_len = (size_t)value_i; @@ -184,7 +235,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 *)lua_state_get_lua_State(state); + lua_State *L = (lua_State *)(state); switch (cdata->type) { @@ -232,9 +283,9 @@ int lua_cdata_pop_stack(struct lua_state *state, struct lua_cdata *cdata) { if (!state || !cdata) return PARAM_ERR; - lua_State *L = (lua_State *)lua_state_get_lua_State(state); + lua_State *L = (lua_State *)(state); - lua_cdata_inner_data_free(cdata); + lua_cdata_inner_data_clean(cdata); switch (lua_type(L, -1)) { case LUA_TNIL: @@ -313,7 +364,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 *)lua_state_get_lua_State(state); + lua_State *L = (lua_State *)(state); lua_newtable(L); int push_ret = 0; for (unsigned array_index = 0; array_index < ctable->array_size; array_index++) @@ -349,7 +400,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 *)lua_state_get_lua_State(state); + lua_State *L = (lua_State *)(state); /* 获取table长度 */ ctable->array_size = (size_t)lua_rawlen(L, -1); @@ -446,6 +497,59 @@ static const char *lua_cdata_function_writer(lua_State *state __unused, void *ud } /* ***** ***** ***** ***** ***** ***** */ +/* lua fn arg pair */ +/* ***** ***** ***** ***** ***** ***** */ +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; +}; + +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) +{ + return lua_module_manger_pair_list_insert(pair->lua_mod_mgr, pair); +} + +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; +} + +/* ***** ***** ***** ***** ***** ***** */ /* lua state */ /* ***** ***** ***** ***** ***** ***** */ struct lua_state @@ -477,31 +581,17 @@ struct lua_state *lua_state_new(struct lua_module_manager *lua_mod_mgr) void lua_state_free(struct lua_state *state) { - lua_State *L = (lua_State *)state; - lua_close(L); + if (!state) + return; + lua_close((lua_State *)state); 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); + lua_State *L = (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) @@ -557,7 +647,7 @@ int lua_state_cbinding_data(struct lua_state *state, struct lua_state_cbind_data { if (!state || !bind_data_array) return PARAM_ERR; - lua_State *L = (lua_State *)lua_state_get_lua_State(state); + lua_State *L = (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) @@ -655,8 +745,8 @@ 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_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); @@ -752,59 +842,19 @@ int lua_state_execute_chunk( return SUCCESS; } -/* ***** ***** ***** ***** ***** ***** */ -/* lua module manager */ -/* ***** ***** ***** ***** ***** ***** */ -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; -}; - -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) +struct lua_module_manager *lua_state_get_lua_module_manager(struct lua_state *state) { - if (pair) - return pair->lua_arg_ref_id; - return 0; + 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; } -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; -} +/* ***** ***** ***** ***** ***** ***** */ +/* lua module manager */ +/* ***** ***** ***** ***** ***** ***** */ struct lua_load_script { @@ -849,22 +899,6 @@ struct lua_module_manager *lua_module_manager_new(struct stellar_module_manager 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) @@ -893,18 +927,9 @@ void lua_module_manager_free(struct lua_module_manager *lua_mod_mgr) while (free_pair) { next_pair = free_pair->next; - FREE(free_pair); + lua_fn_arg_pair_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; @@ -998,7 +1023,7 @@ int lua_module_manager_call_init(struct lua_module_manager *lua_mod_mgr) 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]); + lua_State *L = (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) { @@ -1069,17 +1094,74 @@ int lua_module_manager_call_exit(struct lua_module_manager *lua_mod_mgr) return SUCCESS; } +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; +} + +struct mq_schema *lua_module_manager_get_mq_schema(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + return stellar_module_manager_get_mq_schema(lua_mod_mgr->mod_mgr); + return NULL; +} + +struct mq_runtime *lua_module_manager_get_mq_runtime(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + return stellar_module_manager_get_mq_runtime(lua_mod_mgr->mod_mgr); + return NULL; +} + +struct logger *lua_module_manager_get_logger(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + return stellar_module_manager_get_logger(lua_mod_mgr->mod_mgr); + return NULL; +} + +struct packet_manager *lua_module_manager_get_packet_manager(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + { + struct stellar_module *pkt_module = stellar_module_manager_get_module(lua_mod_mgr->mod_mgr, PACKET_MANAGER_MODULE_NAME); + return (struct packet_manager *)stellar_module_get_ctx(pkt_module); + } + return NULL; +} + +struct session_manager *lua_module_manager_get_session_manager(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + { + struct stellar_module *sess_module = stellar_module_manager_get_module(lua_mod_mgr->mod_mgr, SESSION_MANAGER_MODULE_NAME); + return (struct session_manager *)stellar_module_get_ctx(sess_module); + } + return NULL; +} + +int lua_module_manager_get_current_thread_id(struct lua_module_manager *lua_mod_mgr) +{ + if (lua_mod_mgr) + return stellar_module_manager_get_thread_id(lua_mod_mgr->mod_mgr); + return -1; +} + 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); + if (thread_id < 0) + return NULL; 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) +int lua_module_manager_get_max_thread_num(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 + return stellar_module_manager_get_max_thread_num(lua_mod_mgr->mod_mgr); + return -1; +} |
