forked from eden-emu/eden
		
	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:
		
						commit
						f7725444ac
					
				
					 3 changed files with 23 additions and 0 deletions
				
			
		|  | @ -3,16 +3,19 @@ | ||||||
| 
 | 
 | ||||||
| #include "common/assert.h" | #include "common/assert.h" | ||||||
| #include "common/common_funcs.h" | #include "common/common_funcs.h" | ||||||
|  | #include "common/logging/backend.h" | ||||||
| 
 | 
 | ||||||
| #include "common/settings.h" | #include "common/settings.h" | ||||||
| 
 | 
 | ||||||
| void assert_fail_impl() { | void assert_fail_impl() { | ||||||
|     if (Settings::values.use_debug_asserts) { |     if (Settings::values.use_debug_asserts) { | ||||||
|  |         Common::Log::Stop(); | ||||||
|         Crash(); |         Crash(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| [[noreturn]] void unreachable_impl() { | [[noreturn]] void unreachable_impl() { | ||||||
|  |     Common::Log::Stop(); | ||||||
|     Crash(); |     Crash(); | ||||||
|     throw std::runtime_error("Unreachable code"); |     throw std::runtime_error("Unreachable code"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -208,6 +208,10 @@ public: | ||||||
|         instance->StartBackendThread(); |         instance->StartBackendThread(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     static void Stop() { | ||||||
|  |         instance->StopBackendThread(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     Impl(const Impl&) = delete; |     Impl(const Impl&) = delete; | ||||||
|     Impl& operator=(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, |     Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, | ||||||
|                       const char* function, std::string&& message) const { |                       const char* function, std::string&& message) const { | ||||||
|         using std::chrono::duration_cast; |         using std::chrono::duration_cast; | ||||||
|  | @ -313,6 +326,10 @@ void Start() { | ||||||
|     Impl::Start(); |     Impl::Start(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Stop() { | ||||||
|  |     Impl::Stop(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void DisableLoggingInTests() { | void DisableLoggingInTests() { | ||||||
|     initialization_in_progress_suppress_logging = true; |     initialization_in_progress_suppress_logging = true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -14,6 +14,9 @@ void Initialize(); | ||||||
| 
 | 
 | ||||||
| void Start(); | void Start(); | ||||||
| 
 | 
 | ||||||
|  | /// Explicitly stops the logger thread and flushes the buffers
 | ||||||
|  | void Stop(); | ||||||
|  | 
 | ||||||
| void DisableLoggingInTests(); | void DisableLoggingInTests(); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 liamwhite
						liamwhite