Commit a729d7fc authored by knielsen@mysql.com's avatar knielsen@mysql.com

Merge mysql.com:/usr/local/mysql/mysql-5.0-vgfix

into  mysql.com:/usr/local/mysql/tmp-5.1
parents 2abf957c fc16aff7
...@@ -815,7 +815,8 @@ static void die(const char* fmt, ...) ...@@ -815,7 +815,8 @@ static void die(const char* fmt, ...)
fprintf(stderr, "\n"); fprintf(stderr, "\n");
va_end(args); va_end(args);
cleanup(); cleanup();
my_end(0); /* We cannot free DBUG, it is used in global destructors after exit(). */
my_end(MY_DONT_FREE_DBUG);
exit(1); exit(1);
} }
...@@ -1487,7 +1488,8 @@ int main(int argc, char** argv) ...@@ -1487,7 +1488,8 @@ int main(int argc, char** argv)
cleanup(); cleanup();
free_defaults(defaults_argv); free_defaults(defaults_argv);
my_free_open_file_info(); my_free_open_file_info();
my_end(0); /* We cannot free DBUG, it is used in global destructors after exit(). */
my_end(MY_DONT_FREE_DBUG);
exit(exit_value); exit(exit_value);
DBUG_RETURN(exit_value); // Keep compilers happy DBUG_RETURN(exit_value); // Keep compilers happy
} }
......
...@@ -255,6 +255,8 @@ static void DBUGOpenFile(CODE_STATE *,const char *, const char *, int); ...@@ -255,6 +255,8 @@ static void DBUGOpenFile(CODE_STATE *,const char *, const char *, int);
static void DBUGCloseFile(CODE_STATE *cs, FILE *fp); static void DBUGCloseFile(CODE_STATE *cs, FILE *fp);
/* Push current debug settings */ /* Push current debug settings */
static void PushState(CODE_STATE *cs); static void PushState(CODE_STATE *cs);
/* Free memory associated with debug state. */
static void FreeState (struct state *state);
/* Test for tracing enabled */ /* Test for tracing enabled */
static BOOLEAN DoTrace(CODE_STATE *cs); static BOOLEAN DoTrace(CODE_STATE *cs);
...@@ -742,19 +744,7 @@ void _db_pop_() ...@@ -742,19 +744,7 @@ void _db_pop_()
if (discard->next != NULL) if (discard->next != NULL)
{ {
cs->stack= discard->next; cs->stack= discard->next;
if (!is_shared(discard, keywords)) FreeState(discard);
FreeList(discard->keywords);
if (!is_shared(discard, functions))
FreeList(discard->functions);
if (!is_shared(discard, processes))
FreeList(discard->processes);
if (!is_shared(discard, p_functions))
FreeList(discard->p_functions);
if (!is_shared(discard, out_file))
DBUGCloseFile(cs, discard->out_file);
if (discard->prof_file)
DBUGCloseFile(cs, discard->prof_file);
free((char *) discard);
} }
} }
...@@ -1425,6 +1415,68 @@ static void PushState(CODE_STATE *cs) ...@@ -1425,6 +1415,68 @@ static void PushState(CODE_STATE *cs)
cs->stack= new_malloc; cs->stack= new_malloc;
} }
/*
* FUNCTION
*
* FreeState Free memory associated with a struct state.
*
* SYNOPSIS
*
* static void FreeState (state)
* struct state *state;
*
* DESCRIPTION
*
* Deallocates the memory allocated for various information in a
* state.
*
*/
static void FreeState (
struct state *state)
{
if (!is_shared(state, keywords))
FreeList(state->keywords);
if (!is_shared(state, functions))
FreeList(state->functions);
if (!is_shared(state, processes))
FreeList(state->processes);
if (!is_shared(state, p_functions))
FreeList(state->p_functions);
if (!is_shared(state, out_file))
DBUGCloseFile(cs, state->out_file);
if (state->prof_file)
DBUGCloseFile(cs, state->prof_file);
free((char *) state);
}
/*
* FUNCTION
*
* _db_end_ End debugging, freeing state stack memory.
*
* SYNOPSIS
*
* static VOID _db_end_ ()
*
* DESCRIPTION
*
* Ends debugging, de-allocating the memory allocated to the
* state stack.
*
* To be called at the very end of the program.
*
*/
void _db_end_ ()
{
reg1 struct state *discard;
while((discard= stack) != NULL) {
stack= discard -> next_state;
FreeState (discard);
}
_db_on_=0;
}
/* /*
* FUNCTION * FUNCTION
......
...@@ -42,6 +42,7 @@ extern void _db_pargs_(uint _line_,const char *keyword); ...@@ -42,6 +42,7 @@ extern void _db_pargs_(uint _line_,const char *keyword);
extern void _db_doprnt_ _VARARGS((const char *format,...)); extern void _db_doprnt_ _VARARGS((const char *format,...));
extern void _db_dump_(uint _line_,const char *keyword,const char *memory, extern void _db_dump_(uint _line_,const char *keyword,const char *memory,
uint length); uint length);
extern void _db_end_(void);
extern void _db_lock_file_(void); extern void _db_lock_file_(void);
extern void _db_unlock_file_(void); extern void _db_unlock_file_(void);
extern FILE *_db_fp_(void); extern FILE *_db_fp_(void);
...@@ -73,6 +74,7 @@ extern FILE *_db_fp_(void); ...@@ -73,6 +74,7 @@ extern FILE *_db_fp_(void);
#define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1)) #define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1))
#define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2)) #define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2))
#define DBUG_DUMP(keyword,a1,a2) _db_dump_(__LINE__,keyword,a1,a2) #define DBUG_DUMP(keyword,a1,a2) _db_dump_(__LINE__,keyword,a1,a2)
#define DBUG_END() _db_end_ ()
#define DBUG_LOCK_FILE _db_lock_file_() #define DBUG_LOCK_FILE _db_lock_file_()
#define DBUG_UNLOCK_FILE _db_unlock_file_() #define DBUG_UNLOCK_FILE _db_unlock_file_()
#define DBUG_ASSERT(A) assert(A) #define DBUG_ASSERT(A) assert(A)
...@@ -97,6 +99,7 @@ extern FILE *_db_fp_(void); ...@@ -97,6 +99,7 @@ extern FILE *_db_fp_(void);
#define DBUG_SETJMP(a1) setjmp(a1) #define DBUG_SETJMP(a1) setjmp(a1)
#define DBUG_LONGJMP(a1) longjmp(a1) #define DBUG_LONGJMP(a1) longjmp(a1)
#define DBUG_DUMP(keyword,a1,a2) #define DBUG_DUMP(keyword,a1,a2)
#define DBUG_END()
#define DBUG_ASSERT(A) #define DBUG_ASSERT(A)
#define DBUG_LOCK_FILE #define DBUG_LOCK_FILE
#define DBUG_FILE (stderr) #define DBUG_FILE (stderr)
......
...@@ -75,6 +75,7 @@ extern int NEAR my_errno; /* Last error in mysys */ ...@@ -75,6 +75,7 @@ extern int NEAR my_errno; /* Last error in mysys */
#define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */ #define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */
#define MY_GIVE_INFO 2 /* Give time info about process*/ #define MY_GIVE_INFO 2 /* Give time info about process*/
#define MY_DONT_FREE_DBUG 4 /* Do not call DBUG_END() in my_end() */
#define ME_HIGHBYTE 8 /* Shift for colours */ #define ME_HIGHBYTE 8 /* Shift for colours */
#define ME_NOCUR 1 /* Don't use curses message */ #define ME_NOCUR 1 /* Don't use curses message */
......
...@@ -178,7 +178,7 @@ void STDCALL mysql_server_end() ...@@ -178,7 +178,7 @@ void STDCALL mysql_server_end()
/* If library called my_init(), free memory allocated by it */ /* If library called my_init(), free memory allocated by it */
if (!org_my_init_done) if (!org_my_init_done)
{ {
my_end(0); my_end(MY_DONT_FREE_DBUG);
/* Remove TRACING, if enabled by mysql_debug() */ /* Remove TRACING, if enabled by mysql_debug() */
DBUG_POP(); DBUG_POP();
} }
......
...@@ -197,8 +197,10 @@ Voluntary context switches %ld, Involuntary context switches %ld\n", ...@@ -197,8 +197,10 @@ Voluntary context switches %ld, Involuntary context switches %ld\n",
_CrtDumpMemoryLeaks(); _CrtDumpMemoryLeaks();
#endif #endif
} }
if (!(infoflag & MY_DONT_FREE_DBUG))
DBUG_END(); /* Must be done before my_thread_end */
#ifdef THREAD #ifdef THREAD
DBUG_POP(); /* Must be done before my_thread_end */
my_thread_end(); my_thread_end();
my_thread_global_end(); my_thread_global_end();
#if defined(SAFE_MUTEX) #if defined(SAFE_MUTEX)
......
...@@ -1075,6 +1075,10 @@ static void __cdecl kill_server(int sig_ptr) ...@@ -1075,6 +1075,10 @@ static void __cdecl kill_server(int sig_ptr)
pthread_join(select_thread, NULL); // wait for main thread pthread_join(select_thread, NULL); // wait for main thread
#endif /* __NETWARE__ */ #endif /* __NETWARE__ */
#if defined(__NETWARE__) || (defined(USE_ONE_SIGNAL_HAND) && !defined(__WIN__) && !defined(OS2))
my_thread_end();
#endif
pthread_exit(0); /* purecov: deadcode */ pthread_exit(0); /* purecov: deadcode */
#endif /* EMBEDDED_LIBRARY */ #endif /* EMBEDDED_LIBRARY */
......
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