1 /*++ 2 Copyright (c) 2006 Microsoft Corporation 3 4 Module Name: 5 6 trace.cpp 7 8 Abstract: 9 10 Trace message support. 11 12 Author: 13 14 Leonardo de Moura (leonardo) 2006-09-13. 15 16 Revision History: 17 18 --*/ 19 #include "util/trace.h" 20 #include "util/str_hashtable.h" 21 22 #ifndef SINGLE_THREAD 23 #include <mutex> 24 #include <thread> 25 26 static std::mutex g_verbose_mux; verbose_lock()27void verbose_lock() { g_verbose_mux.lock(); } verbose_unlock()28void verbose_unlock() { g_verbose_mux.unlock(); } 29 30 static std::thread::id g_thread_id = std::this_thread::get_id(); 31 static bool g_is_threaded = false; 32 is_threaded()33bool is_threaded() { 34 if (g_is_threaded) return true; 35 g_is_threaded = std::this_thread::get_id() != g_thread_id; 36 return g_is_threaded; 37 } 38 39 #endif 40 41 #ifdef _TRACE 42 43 std::ofstream tout(".z3-trace"); 44 45 static bool g_enable_all_trace_tags = false; 46 static str_hashtable* g_enabled_trace_tags = nullptr; 47 get_enabled_trace_tags()48static str_hashtable& get_enabled_trace_tags() { 49 if (!g_enabled_trace_tags) { 50 g_enabled_trace_tags = alloc(str_hashtable); 51 } 52 return *g_enabled_trace_tags; 53 } 54 finalize_trace()55void finalize_trace() { 56 dealloc(g_enabled_trace_tags); 57 g_enabled_trace_tags = nullptr; 58 } 59 enable_trace(const char * tag)60void enable_trace(const char * tag) { 61 get_enabled_trace_tags().insert(tag); 62 } 63 enable_all_trace(bool flag)64void enable_all_trace(bool flag) { 65 g_enable_all_trace_tags = flag; 66 } 67 disable_trace(const char * tag)68void disable_trace(const char * tag) { 69 get_enabled_trace_tags().erase(tag); 70 } 71 is_trace_enabled(const char * tag)72bool is_trace_enabled(const char * tag) { 73 return g_enable_all_trace_tags || 74 (g_enabled_trace_tags && get_enabled_trace_tags().contains(tag)); 75 } 76 close_trace()77void close_trace() { 78 tout.close(); 79 } 80 open_trace()81void open_trace() { 82 tout.open(".z3-trace"); 83 } 84 85 #endif 86