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()27 void verbose_lock() { g_verbose_mux.lock(); }
verbose_unlock()28 void 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()33 bool 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()48 static 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()55 void finalize_trace() {
56     dealloc(g_enabled_trace_tags);
57     g_enabled_trace_tags = nullptr;
58 }
59 
enable_trace(const char * tag)60 void enable_trace(const char * tag) {
61     get_enabled_trace_tags().insert(tag);
62 }
63 
enable_all_trace(bool flag)64 void enable_all_trace(bool flag) {
65     g_enable_all_trace_tags = flag;
66 }
67 
disable_trace(const char * tag)68 void disable_trace(const char * tag) {
69     get_enabled_trace_tags().erase(tag);
70 }
71 
is_trace_enabled(const char * tag)72 bool 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()77 void close_trace() {
78     tout.close();
79 }
80 
open_trace()81 void open_trace() {
82     tout.open(".z3-trace");
83 }
84 
85 #endif
86