summaryrefslogtreecommitdiff
path: root/src/lua_module_manage_internal.h
blob: a758b2ba752ada92d18588e7bfa39776aa927b97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

#include <stddef.h>
#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