【修改】修改schema设计思路,将线程与插件作为数组进行管理,节约运行内存

This commit is contained in:
niubinghui
2024-08-13 17:22:10 +08:00
parent d3810797af
commit 0649e332db
6 changed files with 581 additions and 939 deletions

View File

@@ -30,22 +30,28 @@ void *lpm_ctx_new_func(
{
if (__glibc_unlikely(!sess || !plugin_env))
return NULL;
struct lua_plugin_env *env = (struct lua_plugin_env *)plugin_env;
struct lua_model *env = (struct lua_model *)plugin_env;
/* 获取插件ID并找到该插件 */
int plugin_id = session_get_pluginid(sess);
// int plugin_id = 1;
struct lua_session_plugin *plugin = NULL;
while ((plugin = utarray_next(env->plugin_env_plugin_array, plugin)))
struct lua_plugin *plugin = NULL;
while ((plugin = utarray_next(env->plugin_array, plugin)))
{
if (plugin->plugin_id == plugin_id)
break;
}
// LOGDEBUG("%d call plugin id %d, ref %d\n", plugin_id, plugin->plugin_id, plugin->ctx_new_ref);
if (!plugin || plugin->plugin_id != plugin_id)
/* 未找到该插件 */
return NULL;
struct lua_context *new_context = lua_context_new(env->plugin_env_state);
/* 获取当前的线程id并找到该线程对应的state */
int thread_id = session_get_threadid(sess);
if ( thread_id > global_schema->state_count )
return NULL;
lua_State * state = global_schema->thread_state[thread_id - 1];
struct lua_context *new_context = lua_context_new(state);
if (__glibc_unlikely(!new_context))
/* 创建新的context失败 */
return NULL;
@@ -54,11 +60,11 @@ void *lpm_ctx_new_func(
param[0].cdata_type = DATATYPE_POINTER;
param[0].cdata_pointer = sess;
param[1].cdata_type = DATATYPE_TABLE;
param[1].cdata_table = env->plugin_env_ref_id;
param[1].cdata_table = env->private_env_ref;
param[2].cdata_type = DATATYPE_CONTEXT;
param[2].cdata_context = new_context;
if (script_execute(&plugin->plugin_ctx_new_script, 3, param, 0, NULL))
if (lua_chunk_execute(state, plugin->ctx_new_ref, 3, param, 0, NULL))
{
/* 脚本执行失败 */
free(new_context);
@@ -85,13 +91,13 @@ 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_plugin_env *env = (struct lua_plugin_env *)plugin_env;
struct lua_model *env = (struct lua_model *)plugin_env;
/* 获取插件ID并找到该插件 */
int plugin_id = session_get_pluginid(sess);
// int plugin_id = 1;
struct lua_session_plugin *plugin = NULL;
while ((plugin = utarray_next(env->plugin_env_plugin_array, plugin)))
struct lua_plugin *plugin = NULL;
while ((plugin = utarray_next(env->plugin_array, plugin)))
{
if (plugin->plugin_id == plugin_id)
break;
@@ -100,16 +106,21 @@ void lpm_ctx_free_func(
/* 未找到该插件 */
return;
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 = context;
param[2].cdata_type = DATATYPE_TABLE;
param[2].cdata_table = env->plugin_env_ref_id;
param[2].cdata_table = env->private_env_ref;
script_execute(&plugin->plugin_ctx_free_script, 3, param, 0, NULL);
lua_context_free(context);
lua_chunk_execute(state, plugin->ctx_free_ref, 3, param, 0, NULL);
lua_context_free(state, context);
return;
}