Redesign log_id_cache so that it doesn't keep IdString instances referenced, fixes...
authorClifford Wolf <clifford@clifford.at>
Mon, 15 Jul 2019 15:10:42 +0000 (17:10 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 15 Jul 2019 15:10:42 +0000 (17:10 +0200)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
kernel/log.cc

index 1a2c89a9c4c9a7c4cbd11b72fc680f29b8c4f303..08ebe7af797f352244ea05b64275fc964e85c64e 100644 (file)
@@ -61,7 +61,7 @@ int log_force_debug = 0;
 int log_debug_suppressed = 0;
 
 vector<int> header_count;
-pool<RTLIL::IdString> log_id_cache;
+vector<char*> log_id_cache;
 vector<shared_str> string_buf;
 int string_buf_index = -1;
 
@@ -69,6 +69,13 @@ static struct timeval initial_tv = { 0, 0 };
 static bool next_print_log = false;
 static int log_newline_count = 0;
 
+static void log_id_cache_clear()
+{
+       for (auto p : log_id_cache)
+               free(p);
+       log_id_cache.clear();
+}
+
 #if defined(_WIN32) && !defined(__MINGW32__)
 // this will get time information and return it in timeval, simulating gettimeofday()
 int gettimeofday(struct timeval *tv, struct timezone *tz)
@@ -414,7 +421,7 @@ void log_push()
 void log_pop()
 {
        header_count.pop_back();
-       log_id_cache.clear();
+       log_id_cache_clear();
        string_buf.clear();
        string_buf_index = -1;
        log_flush();
@@ -422,7 +429,7 @@ void log_pop()
 
 void log_checkpoint()
 {
-       log_id_cache.clear();
+       log_id_cache_clear();
        IdString::checkpoint();
        log_flush();
 }
@@ -528,7 +535,7 @@ void log_reset_stack()
 {
        while (header_count.size() > 1)
                header_count.pop_back();
-       log_id_cache.clear();
+       log_id_cache_clear();
        string_buf.clear();
        string_buf_index = -1;
        log_flush();
@@ -587,8 +594,8 @@ const char *log_const(const RTLIL::Const &value, bool autoint)
 
 const char *log_id(RTLIL::IdString str)
 {
-       log_id_cache.insert(str);
-       const char *p = str.c_str();
+       log_id_cache.push_back(strdup(str.c_str()));
+       const char *p = log_id_cache.back();
        if (p[0] != '\\')
                return p;
        if (p[1] == '$' || p[1] == '\\' || p[1] == 0)