3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-29 11:55:51 +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

@ -17,21 +17,10 @@ Notes:
--*/
#include "util/prime_generator.h"
#include "util/mutex.h"
#define PRIME_LIST_MAX_SIZE 1<<20
prime_generator::prime_generator() {
m_primes.push_back(2);
m_primes.push_back(3);
m_mux = alloc(mutex);
process_next_k_numbers(128);
}
prime_generator::~prime_generator() {
dealloc(m_mux);
m_mux = nullptr;
}
void prime_generator::process_next_k_numbers(uint64_t k) {
svector<uint64_t> todo;
uint64_t begin = m_primes.back() + 2;
@ -85,10 +74,14 @@ void prime_generator::process_next_k_numbers(uint64_t k) {
}
}
void prime_generator::initialize() {
m_primes.push_back(2);
m_primes.push_back(3);
process_next_k_numbers(128);
}
void prime_generator::finalize() {
m_primes.finalize();
dealloc(m_mux);
m_mux = nullptr;
}
uint64_t prime_generator::operator()(unsigned idx) {
@ -117,6 +110,8 @@ prime_iterator::prime_iterator(prime_generator * g):m_idx(0) {
}
}
static mutex g_prime_iterator;
uint64_t prime_iterator::next() {
unsigned idx = m_idx;
m_idx++;
@ -125,7 +120,7 @@ uint64_t prime_iterator::next() {
}
else {
uint64_t r;
lock_guard lock(*m_generator->m_mux);
lock_guard lock(g_prime_iterator);
{
r = (*m_generator)(idx);
}
@ -133,6 +128,10 @@ uint64_t prime_iterator::next() {
}
}
void prime_iterator::initialize() {
g_prime_generator.initialize();
}
void prime_iterator::finalize() {
g_prime_generator.finalize();
}