/*++ Copyright (c) 2006 Microsoft Corporation Module Name: trace.cpp Abstract: Trace message support. Author: Leonardo de Moura (leonardo) 2006-09-13. Revision History: --*/ #include "util/trace.h" #include "util/str_hashtable.h" #ifndef SINGLE_THREAD #include #include static std::mutex g_verbose_mux; void verbose_lock() { g_verbose_mux.lock(); } void verbose_unlock() { g_verbose_mux.unlock(); } static std::thread::id g_thread_id = std::this_thread::get_id(); static bool g_is_threaded = false; bool is_threaded() { if (g_is_threaded) return true; g_is_threaded = std::this_thread::get_id() != g_thread_id; return g_is_threaded; } #endif #ifdef _TRACE std::ofstream tout(".z3-trace"); static bool g_enable_all_trace_tags = false; static str_hashtable* g_enabled_trace_tags = nullptr; static str_hashtable& get_enabled_trace_tags() { if (!g_enabled_trace_tags) { g_enabled_trace_tags = alloc(str_hashtable); } return *g_enabled_trace_tags; } void finalize_trace() { dealloc(g_enabled_trace_tags); g_enabled_trace_tags = nullptr; } void enable_trace(const char * tag) { get_enabled_trace_tags().insert(tag); } void enable_all_trace(bool flag) { g_enable_all_trace_tags = flag; } void disable_trace(const char * tag) { get_enabled_trace_tags().erase(tag); } bool is_trace_enabled(const char * tag) { return g_enable_all_trace_tags || (g_enabled_trace_tags && get_enabled_trace_tags().contains(tag)); } void close_trace() { tout.close(); } void open_trace() { tout.open(".z3-trace"); } #endif