summaryrefslogtreecommitdiff
path: root/src/lua_plugin_cfunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua_plugin_cfunc.c')
-rw-r--r--src/lua_plugin_cfunc.c141
1 files changed, 133 insertions, 8 deletions
diff --git a/src/lua_plugin_cfunc.c b/src/lua_plugin_cfunc.c
index 2ea5fb7..9fbb646 100644
--- a/src/lua_plugin_cfunc.c
+++ b/src/lua_plugin_cfunc.c
@@ -12,6 +12,14 @@
* 1. 实现函数
* void *lpm_ctx_new_func;
* void lpm_ctx_free_func;
+ *
+ * 08-13
+ * 1. 由于context结构体修改, 部分函数调用及处理逻辑需要同步修改
+ *
+ * 08-15
+ * 1. 实现函数
+ * void lpm_message_free_func
+ * void lpm_on_session_msg_func
************************************************************************/
#include "lua_plugin_manage_internal.h"
@@ -48,9 +56,9 @@ void *lpm_ctx_new_func(
/* 获取当前的线程id并找到该线程对应的state */
int thread_id = session_get_threadid(sess);
- if ( thread_id > global_schema->state_count )
+ if (thread_id > global_schema->state_count)
return NULL;
- lua_State * state = global_schema->thread_state[thread_id - 1];
+ lua_State *state = global_schema->thread_state[thread_id];
struct lua_context *new_context = lua_context_new(state);
if (__glibc_unlikely(!new_context))
/* 创建新的context失败 */
@@ -67,7 +75,7 @@ void *lpm_ctx_new_func(
if (lua_chunk_execute(state, plugin->ctx_new_ref, 3, param, 0, NULL))
{
/* 脚本执行失败 */
- free(new_context);
+ lua_context_free(state, new_context);
return NULL;
}
@@ -90,7 +98,6 @@ void lpm_ctx_free_func(
{
if (__glibc_unlikely(!sess || !sess_ctx || !plugin_env))
return;
- struct lua_context *context = (struct lua_context *)sess_ctx;
struct lua_model *env = (struct lua_model *)plugin_env;
/* 获取插件ID并找到该插件 */
@@ -107,20 +114,138 @@ void lpm_ctx_free_func(
return;
int thread_id = session_get_threadid(sess);
- if ( thread_id > global_schema->state_count )
+ if (thread_id > global_schema->state_count)
return;
- lua_State * state = global_schema->thread_state[thread_id];
+ lua_State *state = global_schema->thread_state[thread_id];
struct lua_cdata param[3] = {0};
param[0].cdata_type = DATATYPE_POINTER;
param[0].cdata_pointer = sess;
param[1].cdata_type = DATATYPE_CONTEXT;
- param[1].cdata_context = context;
+ param[1].cdata_context = (struct lua_context *)sess_ctx;
param[2].cdata_type = DATATYPE_TABLE;
param[2].cdata_table = env->private_env_ref;
lua_chunk_execute(state, plugin->ctx_free_ref, 3, param, 0, NULL);
- lua_context_free(state, context);
+ lua_context_free(state, (struct lua_context *)sess_ctx);
return;
}
+
+/*
+ * Function: lpm_message_free_func
+ * Input: | struct session * | sess | 释放message对应的session
+ * | void * | msg | 需要释放的message消息
+ * | void * | msg_free_arg | 释放函数需要存储的私有数据
+ * Output:
+ * Return:
+ * Description: 与C插件保持一致的session_msg_free_cb_func, 作为lua插件实现对应功能的通用函数
+ */
+void lpm_message_free_func(
+ struct session *sess,
+ void *msg,
+ void *msg_free_arg)
+{
+ if (__glibc_unlikely(!sess || !msg || !msg_free_arg))
+ return;
+ struct lua_message_mq *plugin_mq = (struct lua_message_mq *)msg_free_arg;
+
+ int thread_id = session_get_threadid(sess);
+ if (thread_id > global_schema->state_count)
+ return;
+ lua_State *state = global_schema->thread_state[thread_id];
+
+ struct lua_cdata param[3] = {0};
+ param[0].cdata_type = DATATYPE_POINTER;
+ param[0].cdata_pointer = sess;
+ param[1].cdata_type = DATATYPE_CONTEXT;
+ param[1].cdata_context = (struct lua_context *)msg;
+ param[2].cdata_type = DATATYPE_TABLE;
+ param[2].cdata_table = plugin_mq->mq_private_ref;
+
+ lua_chunk_execute(state, plugin_mq->freemessage_ref, 3, param, 0, NULL);
+ lua_context_free(state, (struct lua_context *)msg);
+
+ return;
+}
+
+/*
+ * Function: lpm_on_session_msg_func
+ * Input: | struct session * | sess | 会话信息
+ * | int | topic_id | 处理的message topic id
+ * | const void * | msg | 需要处理的消息信息
+ * | void * | sess_ctx | 会话中的私有数据
+ * | void * | plugin_env | 插件运行环境
+ * Output:
+ * Return:
+ * Description: 与C插件管理器保持一致的ctx_free_func
+ */
+void lpm_on_session_msg_func(
+ struct session *sess,
+ int topic_id,
+ const void *msg,
+ void *sess_ctx,
+ void *plugin_env)
+{
+ if (__glibc_unlikely(!sess || !sess || !plugin_env))
+ return;
+
+ struct lua_context *sess_context = (struct lua_context *)sess_ctx;
+ struct lua_model *env = (struct lua_model *)plugin_env;
+
+ /* 获取插件ID并找到该插件 */
+ int plugin_id = session_get_pluginid(sess);
+ // int plugin_id = 1;
+ struct lua_plugin *plugin = NULL;
+ while ((plugin = utarray_next(env->plugin_array, plugin)))
+ {
+ if (plugin->plugin_id == plugin_id)
+ break;
+ }
+ if (!plugin || plugin->plugin_id != plugin_id || !plugin->sub_topic_array)
+ /* 未找到该插件, 或者在该插件中未发现注册的topic_id */
+ return;
+ struct lua_plugin_mq *mq = NULL;
+ while ((mq = utarray_next(plugin->sub_topic_array, mq)))
+ {
+ if (mq->topic_id == topic_id)
+ break;
+ }
+ if (!mq || mq->topic_id != topic_id)
+ /* 未找到对应的消息处理函数 */
+ return;
+
+ /* 判断该消息是由C端插件产生的还是由Lua插件产生的 */
+ struct lua_message_mq *message_mq = search_message_mq_by_id(topic_id);
+
+ int thread_id = session_get_threadid(sess);
+ if (thread_id > global_schema->state_count)
+ return;
+ lua_State *state = global_schema->thread_state[thread_id];
+
+ struct lua_cdata params[5] = {0};
+ params[0].cdata_type = DATATYPE_POINTER;
+ params[0].cdata_pointer = sess;
+ params[1].cdata_type = DATATYPE_INT;
+ params[1].cdata_int = topic_id;
+ if (!message_mq)
+ {
+ /* C端产生的直接使用指针 */
+ params[2].cdata_type = DATATYPE_POINTER;
+ params[2].cdata_pointer = (void *)msg;
+ }
+ else
+ {
+ /* lua端产生的为一个context结构 */
+ params[2].cdata_type = DATATYPE_CONTEXT;
+ params[2].cdata_context = (struct lua_context *)msg;
+ }
+ params[3].cdata_type = DATATYPE_CONTEXT;
+ params[3].cdata_context = sess_context;
+ params[4].cdata_type = DATATYPE_TABLE;
+ params[4].cdata_table = env->private_env_ref;
+
+ lua_chunk_execute(state, mq->onmessage_ref, 5, params, 0, NULL);
+
+ return;
+} \ No newline at end of file