#pragma once #ifdef __cplusplus extern "C" { #endif #include #include "lua_module_manage.h" #include "stellar/mq.h" #include "stellar/module_manager.h" #include "stellar/packet.h" #include "stellar/packet_manager.h" #include "stellar/session.h" #include "stellar/session_manager.h" enum LUA_MODULE_ERR_CODE { /* 函数与全局变量操作错误码 */ CDATA_ERR = -300, CDATA_SET_VALUE_TYPE_UNSUPPORT, /* 使用了未识别的数据类型 */ CDATA_SET_VALUE_NULL_POINTER, 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, /* lua_State创建失败 */ LMM_LOAD_CONFIG_FILE_NOT_EXIST, /* 读取配置时配置文件不存在 */ LMM_LOAD_CONFIG_FILE_OPEN_ERR, /* 配置文件无法打开 */ LMM_LOAD_CONFIG_FILE_TOML_PARSE_ERR, /* 配置文件通过toml解析失败 */ LMM_LOAD_SCRIPT_FILE_OPEN_ERR, /* 加载配置过程中lua无法打开文件 */ LMM_LOAD_SCRIPT_FUNC_TYPE_ERR, /* lua获取得到的变量类型不是函数,无法完成初始化 */ /* 通用返回值 */ PARAM_ERR = -1, /* 传入参数错误, 可能是指针为空或类型不符合 */ SUCCESS = 0, /* 运行成功 */ }; struct lua_state; struct lua_module_manager; /* ***** ***** ***** ***** ***** ***** */ 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); /* ***** ***** ***** ***** ***** ***** */ 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_cdata; struct lua_cdata *lua_cdata_new(void); void lua_cdata_free(struct lua_cdata *cdata); struct lua_cdata *lua_cdata_array_new(size_t cdata_num); void lua_cdata_array_free(struct lua_cdata *cdata_array, size_t data_num); struct lua_cdata *lua_cdata_array_get_index(struct lua_cdata *data_array, size_t index); 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_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); /* ***** ***** ***** ***** ***** ***** */ 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_state_cbind_data_spec { enum LUA_DATATYPE data_type; /* 注册的数据类型 */ char *data_value; /* 注册数数据值 */ char *data_name; /* 注册的数据名称 */ char *space_name; /* 注册至lua中的命名空间名称 */ }; /* ***** ***** ***** ***** ***** ***** */ struct lua_state *lua_state_new(struct lua_module_manager *lua_mod_mgr); void lua_state_free(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_module_manager *lua_state_get_lua_module_manager(struct lua_state *state); /* ***** ***** ***** ***** ***** ***** */ 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 stellar_module_manager *lua_module_manager_get_stellar_module_manager(struct lua_module_manager *lua_mod_mgr); struct mq_schema *lua_module_manager_get_mq_schema(struct lua_module_manager *lua_mod_mgr); struct mq_runtime *lua_module_manager_get_mq_runtime(struct lua_module_manager *lua_mod_mgr); struct logger *lua_module_manager_get_logger(struct lua_module_manager *lua_mod_mgr); struct packet_manager *lua_module_manager_get_packet_manager(struct lua_module_manager *lua_mod_mgr); struct session_manager *lua_module_manager_get_session_manager(struct lua_module_manager *lua_mod_mgr); int lua_module_manager_get_current_thread_id(struct lua_module_manager *lua_mod_mgr); struct lua_state *lua_module_manager_get_current_thread_state(struct lua_module_manager *lua_mod_mgr); int lua_module_manager_get_max_thread_num(struct lua_module_manager *lua_mod_mgr); #ifdef __cplusplus } #endif