Merge pull request #12471 from FearlessTobi/port-7146
Port citra-emu/citra#7146: "assert/logging: Stop the logging thread and flush the backends before crashing"
This commit is contained in:
		@@ -3,16 +3,19 @@
 | 
			
		||||
 | 
			
		||||
#include "common/assert.h"
 | 
			
		||||
#include "common/common_funcs.h"
 | 
			
		||||
#include "common/logging/backend.h"
 | 
			
		||||
 | 
			
		||||
#include "common/settings.h"
 | 
			
		||||
 | 
			
		||||
void assert_fail_impl() {
 | 
			
		||||
    if (Settings::values.use_debug_asserts) {
 | 
			
		||||
        Common::Log::Stop();
 | 
			
		||||
        Crash();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[noreturn]] void unreachable_impl() {
 | 
			
		||||
    Common::Log::Stop();
 | 
			
		||||
    Crash();
 | 
			
		||||
    throw std::runtime_error("Unreachable code");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -208,6 +208,10 @@ public:
 | 
			
		||||
        instance->StartBackendThread();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void Stop() {
 | 
			
		||||
        instance->StopBackendThread();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Impl(const Impl&) = delete;
 | 
			
		||||
    Impl& operator=(const Impl&) = delete;
 | 
			
		||||
 | 
			
		||||
@@ -259,6 +263,15 @@ private:
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void StopBackendThread() {
 | 
			
		||||
        backend_thread.request_stop();
 | 
			
		||||
        if (backend_thread.joinable()) {
 | 
			
		||||
            backend_thread.join();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ForEachBackend([](Backend& backend) { backend.Flush(); });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
 | 
			
		||||
                      const char* function, std::string&& message) const {
 | 
			
		||||
        using std::chrono::duration_cast;
 | 
			
		||||
@@ -313,6 +326,10 @@ void Start() {
 | 
			
		||||
    Impl::Start();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Stop() {
 | 
			
		||||
    Impl::Stop();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DisableLoggingInTests() {
 | 
			
		||||
    initialization_in_progress_suppress_logging = true;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,9 @@ void Initialize();
 | 
			
		||||
 | 
			
		||||
void Start();
 | 
			
		||||
 | 
			
		||||
/// Explicitly stops the logger thread and flushes the buffers
 | 
			
		||||
void Stop();
 | 
			
		||||
 | 
			
		||||
void DisableLoggingInTests();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user