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:
parent
2bee9a062f
commit
cf3e649462
12 changed files with 80 additions and 120 deletions
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue