3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

fix crash on Mac due to different destruction order of globals

the mutex in memory_manager has to be destroyed after all mem deallocations happen
This commit is contained in:
Nuno Lopes 2019-06-13 11:22:18 +01:00
parent 2bee9a062f
commit cf3e649462
12 changed files with 80 additions and 120 deletions

View file

@ -16,9 +16,8 @@ Author:
#include "util/rlimit.h"
#include "util/gparams.h"
#include <signal.h>
#include <mutex>
extern std::mutex* g_stat_mux;
static std::mutex display_stats_mux;
static lp::lp_solver<double, double>* g_solver = nullptr;
@ -31,14 +30,14 @@ static void display_statistics() {
static void STD_CALL on_ctrl_c(int) {
signal (SIGINT, SIG_DFL);
{
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
}
raise(SIGINT);
}
static void on_timeout() {
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
exit(0);
}

View file

@ -18,7 +18,6 @@ Revision History:
--*/
#include<iostream>
#include<mutex>
#include "util/memory_manager.h"
#include "util/trace.h"
#include "util/debug.h"
@ -51,7 +50,6 @@ static char const * g_input_file = nullptr;
static bool g_standard_input = false;
static input_kind g_input_kind = IN_UNSPECIFIED;
bool g_display_statistics = false;
std::mutex* g_stat_mux = nullptr;
static bool g_display_istatistics = false;
static void error(const char * msg) {
@ -313,7 +311,6 @@ int STD_CALL main(int argc, char ** argv) {
unsigned return_value = 0;
memory::initialize(0);
memory::exit_when_out_of_memory(true, "ERROR: out of memory");
g_stat_mux = alloc(std::mutex);
parse_cmd_line_args(argc, argv);
env_params::updt_params();
@ -384,7 +381,6 @@ int STD_CALL main(int argc, char ** argv) {
default:
UNREACHABLE();
}
dealloc(g_stat_mux);
memory::finalize();
#ifdef _WINDOWS
_CrtDumpMemoryLeaks();

View file

@ -7,7 +7,6 @@ Copyright (c) 2015 Microsoft Corporation
#include<fstream>
#include<signal.h>
#include<time.h>
#include<mutex>
#include "util/gparams.h"
#include "util/timeout.h"
#include "util/cancel_eh.h"
@ -22,11 +21,11 @@ Copyright (c) 2015 Microsoft Corporation
#include "opt/opt_parse.h"
extern bool g_display_statistics;
extern std::mutex* g_stat_mux;
static bool g_first_interrupt = true;
static opt::context* g_opt = nullptr;
static double g_start_time = 0;
static unsigned_vector g_handles;
static std::mutex display_stats_mux;
@ -71,7 +70,7 @@ static void STD_CALL on_ctrl_c(int) {
else {
signal (SIGINT, SIG_DFL);
{
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
}
raise(SIGINT);
@ -80,7 +79,7 @@ static void STD_CALL on_ctrl_c(int) {
static void on_timeout() {
{
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
}
exit(0);
@ -134,7 +133,7 @@ static unsigned parse_opt(std::istream& in, opt_format f) {
std::cerr << ex.msg() << "\n";
}
{
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
register_on_timeout_proc(nullptr);
g_opt = nullptr;

View file

@ -21,8 +21,6 @@ Revision History:
#include<iostream>
#include<time.h>
#include<signal.h>
#include<mutex>
#include "util/timeout.h"
#include "parsers/smt2/smt2parser.h"
#include "muz/fp/dl_cmds.h"
@ -34,7 +32,8 @@ Revision History:
#include "tactic/portfolio/smt_strategic_solver.h"
#include "smt/smt_solver.h"
extern std::mutex* g_stat_mux;
static std::mutex display_stats_mux;
extern bool g_display_statistics;
static clock_t g_start_time;
static cmd_context * g_cmd_context = nullptr;
@ -52,7 +51,7 @@ static void display_statistics() {
}
static void on_timeout() {
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
exit(0);
}
@ -60,7 +59,7 @@ static void on_timeout() {
static void STD_CALL on_ctrl_c(int) {
signal (SIGINT, SIG_DFL);
{
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
}
raise(SIGINT);
@ -100,7 +99,7 @@ unsigned read_smtlib2_commands(char const * file_name) {
{
std::lock_guard<std::mutex> lock(*g_stat_mux);
std::lock_guard<std::mutex> lock(display_stats_mux);
display_statistics();
g_cmd_context = nullptr;
}