Skip to content

Commit 87a96d7

Browse files
committed
fix mutexes hanging due to access to free'd memory
Thanks to Kevin de Vos for reporting the bug & testing the fix
1 parent cb75326 commit 87a96d7

File tree

8 files changed

+27
-8
lines changed

8 files changed

+27
-8
lines changed

src/util/gparams.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,11 +575,12 @@ void gparams::display_parameter(std::ostream & out, char const * name) {
575575

576576
void gparams::init() {
577577
TRACE("gparams", tout << "gparams::init()\n";);
578+
ALLOC_MUTEX(gparams_mux);
578579
g_imp = alloc(imp);
579580
}
580581

581582
void gparams::finalize() {
582583
TRACE("gparams", tout << "gparams::finalize()\n";);
583584
dealloc(g_imp);
584-
delete gparams_mux;
585+
DEALLOC_MUTEX(gparams_mux);
585586
}

src/util/memory_manager.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ out_of_memory_error::out_of_memory_error():z3_error(ERR_MEMOUT) {
3535
}
3636

3737

38-
static DECLARE_MUTEX(g_memory_mux);
38+
static DECLARE_INIT_MUTEX(g_memory_mux);
3939
static atomic<bool> g_memory_out_of_memory(false);
4040
static bool g_memory_initialized = false;
4141
static long long g_memory_alloc_size = 0;
@@ -134,7 +134,9 @@ void memory::finalize() {
134134
if (g_memory_initialized) {
135135
g_finalizing = true;
136136
mem_finalize();
137-
delete g_memory_mux;
137+
// we leak the mutex since we need it to be always live since memory may
138+
// be reinitialized again
139+
//delete g_memory_mux;
138140
g_memory_initialized = false;
139141
g_finalizing = false;
140142
}

src/util/mutex.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ struct lock_guard {
2626
};
2727

2828
#define DECLARE_MUTEX(name) mutex *name = nullptr
29+
#define DECLARE_INIT_MUTEX(name) mutex *name = nullptr
30+
#define ALLOC_MUTEX(name) (void)
31+
#define DEALLOC_MUTEX(name) (void)
2932

3033
#else
3134
#include <atomic>
@@ -35,5 +38,9 @@ template<typename T> using atomic = std::atomic<T>;
3538
typedef std::mutex mutex;
3639
typedef std::lock_guard<std::mutex> lock_guard;
3740

38-
#define DECLARE_MUTEX(name) mutex *name = new mutex
41+
#define DECLARE_MUTEX(name) mutex *name = nullptr
42+
#define DECLARE_INIT_MUTEX(name) mutex *name = new mutex
43+
#define ALLOC_MUTEX(name) name = alloc(mutex)
44+
#define DEALLOC_MUTEX(name) dealloc(name)
45+
3946
#endif

src/util/prime_generator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,11 @@ uint64_t prime_iterator::next() {
129129
}
130130

131131
void prime_iterator::initialize() {
132+
ALLOC_MUTEX(g_prime_iterator);
132133
g_prime_generator.initialize();
133134
}
134135

135136
void prime_iterator::finalize() {
136137
g_prime_generator.finalize();
137-
delete g_prime_iterator;
138+
DEALLOC_MUTEX(g_prime_iterator);
138139
}

src/util/rational.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void finalize_inf_int_rational();
6363

6464
void rational::initialize() {
6565
if (!g_mpq_manager) {
66+
ALLOC_MUTEX(g_powers_of_two);
6667
g_mpq_manager = alloc(synch_mpq_manager);
6768
m().set(m_zero.m_val, 0);
6869
m().set(m_one.m_val, 1);
@@ -81,6 +82,6 @@ void rational::finalize() {
8182
m_minus_one.~rational();
8283
dealloc(g_mpq_manager);
8384
g_mpq_manager = nullptr;
84-
delete g_powers_of_two;
85+
DEALLOC_MUTEX(g_powers_of_two);
8586
}
8687

src/util/rlimit.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@ Revision History:
2323

2424
static DECLARE_MUTEX(g_rlimit_mux);
2525

26+
void initialize_rlimit() {
27+
ALLOC_MUTEX(g_rlimit_mux);
28+
}
29+
2630
void finalize_rlimit() {
27-
delete g_rlimit_mux;
31+
DEALLOC_MUTEX(g_rlimit_mux);
2832
}
2933

3034
reslimit::reslimit():

src/util/rlimit.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ Revision History:
2020

2121
#include "util/vector.h"
2222

23+
void initialize_rlimit();
2324
void finalize_rlimit();
2425
/*
26+
ADD_INITIALIZER('initialize_rlimit();')
2527
ADD_FINALIZER('finalize_rlimit();')
2628
*/
2729

src/util/symbol.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ static internal_symbol_table* g_symbol_table = nullptr;
6464

6565
void initialize_symbols() {
6666
if (!g_symbol_table) {
67+
ALLOC_MUTEX(g_symbol_lock);
6768
g_symbol_table = alloc(internal_symbol_table);
6869
}
6970
}
7071

7172
void finalize_symbols() {
72-
delete g_symbol_lock;
73+
DEALLOC_MUTEX(g_symbol_lock);
7374
dealloc(g_symbol_table);
7475
g_symbol_table = nullptr;
7576
}

0 commit comments

Comments
 (0)