mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 14:56:40 +08:00 
			
		
		
		
	assert/logging: Stop the logging thread and flush the backends before crashing
Co-Authored-By: SachinVin <26602104+SachinVin@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									05e3db3ac9
								
							
						
					
					
						commit
						4f569fd568
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user