summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <acurtis/antony@xiphis.org/ltamd64.xiphis.org>2007-05-04 16:44:07 -0700
committerunknown <acurtis/antony@xiphis.org/ltamd64.xiphis.org>2007-05-04 16:44:07 -0700
commitcd3ced79e9670f3dead8d4613d697f8c01db3d48 (patch)
tree7061f187342359f206ee25a91963f721fa2a1999
parent5dee5507a51d3b00f30f81f2afab18845f4d0dce (diff)
downloadmariadb-git-cd3ced79e9670f3dead8d4613d697f8c01db3d48.tar.gz
WL#2936
Move copying of global variables into thd.variables into plugin_thdvar_init(). plugin_thdvar_init() may be called multiple times when THD::change_user() is called. This fixes a plugin ref-count leak when running the test mysql_client_test sql/sql_class.cc: wl2936 Initialize thd.variables to zero in constructor. Move copying of global variables into thd.variables into plugin_thdvar_init() sql/sql_plugin.cc: wl2936 Move copying of global variables into thd.variables into plugin_thdvar_init(). plugin_thdvar_init() may be called multiple times when THD::change_user() is called. This fixes a plugin ref-count leak when running the test mysql_client_test
-rw-r--r--sql/sql_class.cc3
-rw-r--r--sql/sql_plugin.cc16
2 files changed, 15 insertions, 4 deletions
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index b29cfb8fcaf..87cf9b16d24 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -345,6 +345,7 @@ THD::THD()
time_after_lock=(time_t) 0;
current_linfo = 0;
slave_thread = 0;
+ bzero(&variables, sizeof(variables));
thread_id= variables.pseudo_thread_id= 0;
one_shot_set= 0;
file_id = 0;
@@ -455,8 +456,6 @@ void THD::pop_internal_handler()
void THD::init(void)
{
pthread_mutex_lock(&LOCK_global_system_variables);
- variables= global_system_variables;
- variables.table_plugin= NULL;
plugin_thdvar_init(this);
variables.time_format= date_time_format_copy((THD*) 0,
variables.time_format);
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 590fee82027..66b6cb5d9eb 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -2303,14 +2303,26 @@ static byte *mysql_sys_var_ptr(void* a_thd, int offset)
void plugin_thdvar_init(THD *thd)
{
+ plugin_ref old_table_plugin= thd->variables.table_plugin;
+ DBUG_ENTER("plugin_thdvar_init");
+
+ thd->variables.table_plugin= NULL;
+ cleanup_variables(thd, &thd->variables);
+
+ thd->variables= global_system_variables;
+ thd->variables.table_plugin= NULL;
+
/* we are going to allocate these lazily */
thd->variables.dynamic_variables_version= 0;
thd->variables.dynamic_variables_size= 0;
thd->variables.dynamic_variables_ptr= 0;
- DBUG_ASSERT(!(thd->variables.table_plugin));
+ pthread_mutex_lock(&LOCK_plugin);
thd->variables.table_plugin=
- my_plugin_lock(NULL, &global_system_variables.table_plugin);
+ my_intern_plugin_lock(NULL, global_system_variables.table_plugin);
+ intern_plugin_unlock(NULL, old_table_plugin);
+ pthread_mutex_unlock(&LOCK_plugin);
+ DBUG_VOID_RETURN;
}