summaryrefslogtreecommitdiff
path: root/src/lua_binding_cfunc.c
blob: 7ef4d336aab0db71f220106371b5fd11527a3854 (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
#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 = lua_fn_arg_pair_get_lua_mod_mgr(pair);
    return lua_module_manager_get_current_thread_state(lua_mod_mgr);
}

void lua_cfunc_mq_msg_free_cb_func(void *msg, void *msg_free_arg)
{
    if (!msg_free_arg)
        return;
    struct lua_fn_arg_pair *free_arg = (struct lua_fn_arg_pair *)msg_free_arg;
    struct lua_state *state = lua_fn_arg_pair_get_thread_state(free_arg);

    struct lua_cdata param[2];
    if (lua_context_check_if_context(msg))
        lua_cdata_data_set(&param[0], DATATYPE_CONTEXT, msg, 0);
    else
        lua_cdata_data_set(&param[0], DATATYPE_POINTER, msg, 0);
    lua_cdata_data_set(&param[1], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(free_arg));

    lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(free_arg), param, 2, NULL, 0, NULL, 0);
    return;
}

void lua_cfunc_mq_on_msg_cb_func(int topic_id, void *msg, void *on_msg_arg)
{
    if (!on_msg_arg)
        return;
    struct lua_fn_arg_pair *msg_arg = (struct lua_fn_arg_pair *)on_msg_arg;
    struct lua_state *state = lua_fn_arg_pair_get_thread_state(msg_arg);

    struct lua_cdata param[3];
    lua_cdata_data_set(&param[0], DATATYPE_INT, NULL, topic_id);
    if (lua_context_check_if_context(msg))
        lua_cdata_data_set(&param[1], DATATYPE_CONTEXT, msg, 0);
    else
        lua_cdata_data_set(&param[1], DATATYPE_POINTER, msg, 0);
    lua_cdata_data_set(&param[2], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(msg_arg));

    lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(msg_arg), param, 3, NULL, 0, NULL, 0);
    return;
}

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;
    struct lua_fn_arg_pair *dis_arg = (struct lua_fn_arg_pair *)dispatch_arg;
    struct lua_state *state = lua_fn_arg_pair_get_thread_state(dis_arg);

    struct lua_cdata param[4];
    struct lua_context *new_context = lua_context_new(state);
    lua_cdata_data_set(&param[0], DATATYPE_INT, NULL, topic_id);
    lua_cdata_data_set(&param[1], DATATYPE_CONTEXT, msg, 0);
    lua_cdata_data_set(&param[2], DATATYPE_TABLE, 0, lua_fn_arg_pair_get_arg_ref_id(dis_arg));
    lua_cdata_data_set(&param[3], DATATYPE_CONTEXT, (void *)new_context, 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_cfunc_packet_on_stage_callback(enum packet_stage stage, struct packet *pkt, void *args)
{
    if (!args)
        return;
    struct lua_fn_arg_pair *on_stage_callback = (struct lua_fn_arg_pair *)args;
    struct lua_state *state = lua_fn_arg_pair_get_thread_state(on_stage_callback);

    struct lua_cdata param[3];
    lua_cdata_data_set(&param[0], DATATYPE_INT, NULL, stage);
    lua_cdata_data_set(&param[1], DATATYPE_POINTER, pkt, 0);
    lua_cdata_data_set(&param[2], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(on_stage_callback));

    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_cfunc_session_callback(struct session *sess, struct packet *pkt, void *args)
{
    if (!args)
        return;
    struct lua_fn_arg_pair *sess_callback = (struct lua_fn_arg_pair *)args;
    struct lua_state *state = lua_fn_arg_pair_get_thread_state(sess_callback);

    struct lua_cdata param[3];
    lua_cdata_data_set(&param[0], DATATYPE_POINTER, sess, 0);
    lua_cdata_data_set(&param[1], DATATYPE_POINTER, pkt, 0);
    lua_cdata_data_set(&param[2], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(sess_callback));

    lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(sess_callback), param, 3, NULL, 0, NULL, 0);
    return;
}

void lua_cfunc_tcp_stream_callback(struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len, void *args)
{
    if (!args)
        return;
    struct lua_fn_arg_pair *tcp_stream_callback = (struct lua_fn_arg_pair *)args;
    struct lua_state *state = lua_fn_arg_pair_get_thread_state(tcp_stream_callback);

    struct lua_cdata param[4];
    lua_cdata_data_set(&param[0], DATATYPE_POINTER, sess, 0);
    lua_cdata_data_set(&param[1], DATATYPE_BUFF, (void *)tcp_payload, (int)tcp_payload_len);
    lua_cdata_data_set(&param[2], DATATYPE_INT, NULL, (int)tcp_payload_len);
    lua_cdata_data_set(&param[3], DATATYPE_TABLE, NULL, lua_fn_arg_pair_get_arg_ref_id(tcp_stream_callback));

    lua_state_execute_chunk(state, lua_fn_arg_pair_get_fn_ref_id(tcp_stream_callback), param, 4, NULL, 0, NULL, 0);
    return;
}