Improve handling of warning messages
authorClifford Wolf <clifford@clifford.at>
Sun, 4 Mar 2018 21:35:59 +0000 (22:35 +0100)
committerClifford Wolf <clifford@clifford.at>
Sun, 4 Mar 2018 21:35:59 +0000 (22:35 +0100)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
kernel/driver.cc
kernel/log.cc
kernel/log.h

index f49f6023bbde6f0858ce5790a303299361dfd5ef..97a78cd16c4fd06de3bed395a7d74e97f64a2501 100644 (file)
@@ -480,6 +480,8 @@ int main(int argc, char **argv)
                if (mode_v && !mode_q)
                        log_files.push_back(stderr);
 
+               if (log_warnings_count)
+                       log("Warnings: %d unique messages, %d total\n", GetSize(log_warnings), log_warnings_count);
 #ifdef _WIN32
                log("End of script. Logfile hash: %s\n", hash.c_str());
 #else
index 8b12008bc77dd63bcc6a023a8709737853dcabfe..de564cb362dac18caf6ec8ce14a458933e43a5bb 100644 (file)
@@ -42,6 +42,8 @@ std::vector<FILE*> log_files;
 std::vector<std::ostream*> log_streams;
 std::map<std::string, std::set<std::string>> log_hdump;
 std::vector<std::regex> log_warn_regexes, log_nowarn_regexes;
+std::set<std::string> log_warnings;
+int log_warnings_count = 0;
 bool log_hdump_all = false;
 FILE *log_errfile = NULL;
 SHA1 *log_hasher = NULL;
@@ -216,14 +218,26 @@ void logv_warning(const char *format, va_list ap)
        }
        else
        {
-               if (log_errfile != NULL && !log_quiet_warnings)
-                       log_files.push_back(log_errfile);
+               if (log_warnings.count(message))
+               {
+                       log("Warning: %s", message.c_str());
+                       log_flush();
+               }
+               else
+               {
+                       if (log_errfile != NULL && !log_quiet_warnings)
+                               log_files.push_back(log_errfile);
 
-               log("Warning: %s", message.c_str());
-               log_flush();
+                       log("Warning: %s", message.c_str());
+                       log_flush();
 
-               if (log_errfile != NULL && !log_quiet_warnings)
-                       log_files.pop_back();
+                       if (log_errfile != NULL && !log_quiet_warnings)
+                               log_files.pop_back();
+
+                       log_warnings.insert(message);
+               }
+
+               log_warnings_count++;
        }
 }
 
@@ -242,14 +256,26 @@ void logv_warning_noprefix(const char *format, va_list ap)
        }
        else
        {
-               if (log_errfile != NULL && !log_quiet_warnings)
-                       log_files.push_back(log_errfile);
+               if (log_warnings.count(message))
+               {
+                       log("%s", message.c_str());
+                       log_flush();
+               }
+               else
+               {
+                       if (log_errfile != NULL && !log_quiet_warnings)
+                               log_files.push_back(log_errfile);
 
-               log("%s", message.c_str());
-               log_flush();
+                       log("%s", message.c_str());
+                       log_flush();
+
+                       if (log_errfile != NULL && !log_quiet_warnings)
+                               log_files.pop_back();
+
+                       log_warnings.insert(message);
+               }
 
-               if (log_errfile != NULL && !log_quiet_warnings)
-                       log_files.pop_back();
+               log_warnings_count++;
        }
 }
 
index e27dafab9343b594094d2703372570b04d203da4..a8aa58a9e5ac7276fc7fb424e31afc61ddca405e 100644 (file)
@@ -50,6 +50,8 @@ extern std::vector<FILE*> log_files;
 extern std::vector<std::ostream*> log_streams;
 extern std::map<std::string, std::set<std::string>> log_hdump;
 extern std::vector<std::regex> log_warn_regexes, log_nowarn_regexes;
+extern std::set<std::string> log_warnings;
+extern int log_warnings_count;
 extern bool log_hdump_all;
 extern FILE *log_errfile;
 extern SHA1 *log_hasher;