Bug#34424 query_cache_debug.test leads to valgrind warnings

Bug#34678 @@debug variable's incremental mode

The problem is that the per-thread debugging settings stack wasn't
being deallocated before the thread termination, leaking the stack
memory. The chosen solution is to push a new state if the current
is set to the initial settings and pop it (free) once the thread
finishes.
parent fd3bcbea
...@@ -412,15 +412,11 @@ void _db_process_(const char *name) ...@@ -412,15 +412,11 @@ void _db_process_(const char *name)
cs->process= name; cs->process= name;
} }
/* /*
* FUNCTION * FUNCTION
* *
* _db_set_ set current debugger settings * DbugParse parse control string and set current debugger setting
*
* SYNOPSIS
*
* VOID _db_set_(control)
* char *control;
* *
* DESCRIPTION * DESCRIPTION
* *
...@@ -444,7 +440,7 @@ void _db_process_(const char *name) ...@@ -444,7 +440,7 @@ void _db_process_(const char *name)
* *
*/ */
void _db_set_(CODE_STATE *cs, const char *control) static void DbugParse(CODE_STATE *cs, const char *control)
{ {
const char *end; const char *end;
int rel=0; int rel=0;
...@@ -671,6 +667,35 @@ void _db_set_(CODE_STATE *cs, const char *control) ...@@ -671,6 +667,35 @@ void _db_set_(CODE_STATE *cs, const char *control)
} }
/*
* FUNCTION
*
* _db_set_ set current debugger settings
*
* SYNOPSIS
*
* VOID _db_set_(control)
* char *control;
*
* DESCRIPTION
*
* Given pointer to a debug control string in "control",
* parses the control string, and sets up a current debug
* settings. Pushes a new debug settings if the current is
* set to the initial debugger settings.
*/
void _db_set_(CODE_STATE *cs, const char *control)
{
get_code_state_or_return;
if (cs->stack == &init_settings)
PushState(cs);
DbugParse(cs, control);
}
/* /*
* FUNCTION * FUNCTION
* *
...@@ -685,7 +710,7 @@ void _db_set_(CODE_STATE *cs, const char *control) ...@@ -685,7 +710,7 @@ void _db_set_(CODE_STATE *cs, const char *control)
* *
* Given pointer to a debug control string in "control", pushes * Given pointer to a debug control string in "control", pushes
* the current debug settings, parses the control string, and sets * the current debug settings, parses the control string, and sets
* up a new debug settings with _db_set_() * up a new debug settings with DbugParse()
* *
*/ */
...@@ -694,7 +719,7 @@ void _db_push_(const char *control) ...@@ -694,7 +719,7 @@ void _db_push_(const char *control)
CODE_STATE *cs=0; CODE_STATE *cs=0;
get_code_state_or_return; get_code_state_or_return;
PushState(cs); PushState(cs);
_db_set_(cs, control); DbugParse(cs, control);
} }
/* /*
...@@ -717,7 +742,7 @@ void _db_set_init_(const char *control) ...@@ -717,7 +742,7 @@ void _db_set_init_(const char *control)
CODE_STATE tmp_cs; CODE_STATE tmp_cs;
bzero((uchar*) &tmp_cs, sizeof(tmp_cs)); bzero((uchar*) &tmp_cs, sizeof(tmp_cs));
tmp_cs.stack= &init_settings; tmp_cs.stack= &init_settings;
_db_set_(&tmp_cs, control); DbugParse(&tmp_cs, control);
} }
/* /*
......
...@@ -730,8 +730,9 @@ warning will be given. The DBUG_POP macro has no arguments. ...@@ -730,8 +730,9 @@ warning will be given. The DBUG_POP macro has no arguments.
EX:\ \fCDBUG_POP\ ();\fR EX:\ \fCDBUG_POP\ ();\fR
.SP 1 .SP 1
.LI DBUG_SET\ .LI DBUG_SET\
Modifies the current debugger state on top of the stack using the Modifies the current debugger state on top of the stack or pushes
debug control string passed as the macro argument. Unless a new state if the current is set to the initial settings, using
the debug control string passed as the macro argument. Unless
.I incremental .I incremental
control string is used (see below), it's equivalent to a combination of control string is used (see below), it's equivalent to a combination of
DBUG_POP and DBUG_PUSH. DBUG_POP and DBUG_PUSH.
......
set debug= 'T';
select @@debug;
@@debug
T
set debug= '+P';
select @@debug;
@@debug
P:T
set debug= '-P';
select @@debug;
@@debug
T
...@@ -22,4 +22,3 @@ wait_timeout : Bug#32801 wait_timeout.test fails randomly ...@@ -22,4 +22,3 @@ wait_timeout : Bug#32801 wait_timeout.test fails randomly
ctype_create : Bug#32965 main.ctype_create fails ctype_create : Bug#32965 main.ctype_create fails
status : Bug#32966 main.status fails status : Bug#32966 main.status fails
ps_ddl : Bug#12093 2007-12-14 pending WL#4165 / WL#4166 ps_ddl : Bug#12093 2007-12-14 pending WL#4165 / WL#4166
query_cache_debug : Bug#34424: query_cache_debug.test leads to valgrind warnings
--source include/have_debug.inc
#
# Bug#34678 @@debug variable's incremental mode
#
set debug= 'T';
select @@debug;
set debug= '+P';
select @@debug;
set debug= '-P';
select @@debug;
...@@ -332,6 +332,7 @@ void my_thread_end(void) ...@@ -332,6 +332,7 @@ void my_thread_end(void)
/* tmp->dbug is allocated inside DBUG library */ /* tmp->dbug is allocated inside DBUG library */
if (tmp->dbug) if (tmp->dbug)
{ {
DBUG_POP();
free(tmp->dbug); free(tmp->dbug);
tmp->dbug=0; tmp->dbug=0;
} }
......
...@@ -3926,10 +3926,8 @@ bool sys_var_thd_dbug::update(THD *thd, set_var *var) ...@@ -3926,10 +3926,8 @@ bool sys_var_thd_dbug::update(THD *thd, set_var *var)
if (var->type == OPT_GLOBAL) if (var->type == OPT_GLOBAL)
DBUG_SET_INITIAL(var ? var->value->str_value.c_ptr() : ""); DBUG_SET_INITIAL(var ? var->value->str_value.c_ptr() : "");
else else
{ DBUG_SET(var ? var->value->str_value.c_ptr() : "");
DBUG_POP();
DBUG_PUSH(var ? var->value->str_value.c_ptr() : "");
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment