【修改】修改schema设计思路,将线程与插件作为数组进行管理,节约运行内存
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user