feat(frontends/lean/elaborator): do not populate info_manager during thread finalization

This commit is contained in:
Leonardo de Moura 2016-11-30 17:14:15 -08:00
parent 73e5367fb6
commit d454cc8bcd
3 changed files with 11 additions and 1 deletions

View file

@ -6,6 +6,7 @@ Author: Leonardo de Moura
*/
#include <string>
#include "util/flet.h"
#include "util/thread.h"
#include "kernel/find_fn.h"
#include "kernel/for_each_fn.h"
#include "kernel/replace_fn.h"
@ -119,7 +120,7 @@ elaborator::elaborator(environment const & env, options const & opts, metavar_co
elaborator::~elaborator() {
try {
if (m_uses_infom && get_global_info_manager()) {
if (m_uses_infom && get_global_info_manager() && !in_thread_finalization()) {
m_info.instantiate_mvars(m_ctx.mctx());
get_global_info_manager()->merge(m_info);
}

View file

@ -31,9 +31,16 @@ void initialize_thread() {}
void finalize_thread() {}
#endif
LEAN_THREAD_VALUE(bool, g_finalizing, false);
bool in_thread_finalization() {
return g_finalizing;
}
typedef std::vector<std::pair<thread_finalizer, void*>> thread_finalizers;
void run_thread_finalizers_core(thread_finalizers & fns) {
g_finalizing = true;
unsigned i = fns.size();
while (i > 0) {
--i;

View file

@ -223,4 +223,6 @@ void register_thread_finalizer(thread_finalizer fn, void * p);
void run_thread_finalizers();
void run_post_thread_finalizers();
void delete_thread_finalizer_manager();
bool in_thread_finalization();
}