Protect against dying twice

Cleanup exit handling
parent c159836f
......@@ -792,27 +792,65 @@ void free_used_memory()
}
static void cleanup_and_exit(int exit_code)
{
free_used_memory();
my_end(MY_CHECK_ERROR);
if (!silent)
{
switch (exit_code)
{
case 1:
printf("not ok\n");
break;
case 0:
printf("ok\n");
break;
case 62:
printf("skipped\n");
break;
default:
printf("unknown exit code: %d\n", exit_code);
DBUG_ASSERT(0);
}
}
exit(exit_code);
}
void die(const char *fmt, ...)
{
static int dying= 0;
va_list args;
DBUG_ENTER("die");
DBUG_PRINT("enter", ("start_lineno: %d", start_lineno));
/*
Protect against dying twice
first time 'die' is called, try to write log files
second time, just exit
*/
if (dying)
cleanup_and_exit(1);
/* Print the error message */
va_start(args, fmt);
fprintf(stderr, "mysqltest: ");
if (cur_file && cur_file != file_stack)
fprintf(stderr, "In included file \"%s\": ",
cur_file->file_name);
if (start_lineno > 0)
fprintf(stderr, "At line %u: ", start_lineno);
if (fmt)
{
fprintf(stderr, "mysqltest: ");
if (cur_file && cur_file != file_stack)
fprintf(stderr, "In included file \"%s\": ",
cur_file->file_name);
if (start_lineno > 0)
fprintf(stderr, "At line %u: ", start_lineno);
va_start(args, fmt);
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
fflush(stderr);
va_end(args);
}
va_end(args);
else
fprintf(stderr, "unknown error");
fprintf(stderr, "\n");
fflush(stderr);
/* Dump the result that has been accumulated so far to .log file */
if (result_file_name && ds_res.length)
......@@ -822,14 +860,7 @@ void die(const char *fmt, ...)
if (result_file_name && ds_warning_messages.length)
dump_warning_messages();
/* Clean up and exit */
free_used_memory();
my_end(MY_CHECK_ERROR);
if (!silent)
printf("not ok\n");
exit(1);
cleanup_and_exit(1);
}
......@@ -862,14 +893,7 @@ void abort_not_supported_test(const char *fmt, ...)
}
va_end(args);
/* Clean up and exit */
free_used_memory();
my_end(MY_CHECK_ERROR);
if (!silent)
printf("skipped\n");
exit(62);
cleanup_and_exit(62);
}
......@@ -6375,14 +6399,9 @@ int main(int argc, char **argv)
dynstr_free(&ds_res);
timer_output();
free_used_memory();
my_end(MY_CHECK_ERROR);
/* Yes, if we got this far the test has suceeded! Sakila smiles */
if (!silent)
printf("ok\n");
exit(0);
return 0; /* Keep compiler happy */
cleanup_and_exit(0);
return 0; /* Keep compiler happy too */
}
......
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