summaryrefslogtreecommitdiff
path: root/src/lua_module_manage_internal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua_module_manage_internal.c')
-rw-r--r--src/lua_module_manage_internal.c310
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;
+}