WL 2826: Eigth step

Inserted monty patch to allow for adding and dropping
DBUG keywords per thread
parent edb8811f
...@@ -249,6 +249,7 @@ typedef struct st_code_state { ...@@ -249,6 +249,7 @@ typedef struct st_code_state {
uint u_line; /* User source code line number */ uint u_line; /* User source code line number */
int locked; /* If locked with _db_lock_file */ int locked; /* If locked with _db_lock_file */
const char *u_keyword; /* Keyword for current macro */ const char *u_keyword; /* Keyword for current macro */
struct link *keywords; /* Thread specific, active keywords */
} CODE_STATE; } CODE_STATE;
/* Parse a debug command string */ /* Parse a debug command string */
...@@ -1252,7 +1253,9 @@ static BOOLEAN DoProfile () ...@@ -1252,7 +1253,9 @@ static BOOLEAN DoProfile ()
BOOLEAN _db_strict_keyword_ ( BOOLEAN _db_strict_keyword_ (
const char *keyword) const char *keyword)
{ {
if (stack -> keywords == NULL) CODE_STATE *state;
if (stack->keywords == NULL &&
(!(state= code_state()) || state->keywords == NULL))
return FALSE; return FALSE;
return _db_keyword_ (keyword); return _db_keyword_ (keyword);
} }
...@@ -1288,16 +1291,15 @@ const char *keyword) ...@@ -1288,16 +1291,15 @@ const char *keyword)
REGISTER BOOLEAN result; REGISTER BOOLEAN result;
CODE_STATE *state; CODE_STATE *state;
if (!init_done)
_db_push_ ("");
/* Sasha: pre-my_thread_init() safety */
if (!(state=code_state())) if (!(state=code_state()))
return FALSE; return FALSE;
result = FALSE; result = FALSE;
if (DEBUGGING && !state->disable_output && if (DEBUGGING && !state->disable_output &&
state->level <= stack -> maxdepth && state->level <= stack -> maxdepth &&
InList (stack -> functions, state->func) && InList (stack -> functions, state->func) &&
InList (stack -> keywords, keyword) && (InList (stack -> keywords, keyword) ||
(state -> keywords &&
InList (state -> keywords, keyword))) &&
InList (stack -> processes, _db_process_)) InList (stack -> processes, _db_process_))
result = TRUE; result = TRUE;
return (result); return (result);
...@@ -1373,6 +1375,81 @@ struct link *linkp) ...@@ -1373,6 +1375,81 @@ struct link *linkp)
} }
/*
* FUNCTION
*
* Add key word to _db_strict_keyword_ list
*
* SYNOPSIS
*
* VOID _db_add_strict_keyword(keyword)
* const char *keyword;
*
* DESCRIPTION
*
* Add key word to _db_strict_keyword_ to active DEBUG_EXECUTE_IF
* statements for this thread only
*
* Returns TRUE if keyword accepted, FALSE otherwise.
*
*/
BOOLEAN _db_add_strict_keyword_(const char *keyword)
{
CODE_STATE *state;
struct link *tmp;
uint length;
if (!(state=code_state()) ||
!(tmp= (struct link *) DbugMalloc(sizeof(struct link) +
(length= strlen(keyword)+1))))
return FALSE;
tmp->str= (char*) (tmp+1);
memcpy(tmp->str, keyword, length);
tmp->next_link= state->keywords;
state->keywords= tmp;
return TRUE;
}
/*
* FUNCTION
*
* Remove key word from thread specific _db_strict_keyword_ list
*
* SYNOPSIS
*
* VOID _db_del_strict_keyword_(keyword)
* const char *keyword;
*
* DESCRIPTION
*
* Delete key word from _db_strict_keyword_ to decative DEBUG_EXECUTE_IF
* statements for this thread only
*
* Returns TRUE if keyword deleted, FALSE otherwise.
*
*/
BOOLEAN _db_del_strict_keyword_(const char *keyword)
{
CODE_STATE *state;
struct link *link, **linkp;
if (!(state=code_state()))
return FALSE;
for (linkp= &state->keywords; (link= *linkp); linkp= &link->next_link)
{
if (STREQ(link->str, keyword))
{
*linkp= link->next_link;
free(link);
return TRUE;
}
}
return (FALSE);
}
/* /*
* FUNCTION * FUNCTION
* *
......
...@@ -24,8 +24,10 @@ extern "C" { ...@@ -24,8 +24,10 @@ extern "C" {
extern int _db_on_,_no_db_; extern int _db_on_,_no_db_;
extern FILE *_db_fp_; extern FILE *_db_fp_;
extern char *_db_process_; extern char *_db_process_;
extern int _db_keyword_(const char *keyword); extern int _db_keyword_(const char *keyword);
extern int _db_strict_keyword_(const char *keyword); extern int _db_strict_keyword_(const char *keyword);
extern int _db_add_strict_keyword_(const char *keyword);
extern int _db_del_strict_keyword_(const char *keyword);
extern void _db_setjmp_(void); extern void _db_setjmp_(void);
extern void _db_longjmp_(void); extern void _db_longjmp_(void);
extern void _db_push_(const char *control); extern void _db_push_(const char *control);
...@@ -76,6 +78,8 @@ extern void _db_unlock_file(void); ...@@ -76,6 +78,8 @@ extern void _db_unlock_file(void);
(_db_on_ ? ((_db_strict_keyword_ (keyword)) ? ((a1), 0) : 0) : 0) (_db_on_ ? ((_db_strict_keyword_ (keyword)) ? ((a1), 0) : 0) : 0)
#define DBUG_COND(keyword) \ #define DBUG_COND(keyword) \
((_db_on_ && _db_strict_keyword_ (keyword)) ? 1 : 0) ((_db_on_ && _db_strict_keyword_ (keyword)) ? 1 : 0)
#define DBUG_ADD_KEYWORD(key) _db_add_strict_keyword_(key)
#define DBUG_DEL_KEYWORD(key) _db_del_strict_keyword_(key)
#else /* No debugger */ #else /* No debugger */
#define DBUG_ENTER(a1) #define DBUG_ENTER(a1)
...@@ -85,6 +89,8 @@ extern void _db_unlock_file(void); ...@@ -85,6 +89,8 @@ extern void _db_unlock_file(void);
#define DBUG_EXECUTE_IF(keyword,a1) {} #define DBUG_EXECUTE_IF(keyword,a1) {}
#define DBUG_EXECUTE_COND(keyword, a1) 0 #define DBUG_EXECUTE_COND(keyword, a1) 0
#define DBUG_COND(keyword) 0 #define DBUG_COND(keyword) 0
#define DBUG_ADD_KEYWORD(key)
#define DBUG_DEL_KEYWORD(key)
#define DBUG_PRINT(keyword,arglist) {} #define DBUG_PRINT(keyword,arglist) {}
#define DBUG_PUSH(a1) {} #define DBUG_PUSH(a1) {}
#define DBUG_POP() {} #define DBUG_POP() {}
......
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