mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 07:56:40 +00:00 
			
		
		
		
	Well... unless we fail to get the user profile directory.
Also put freeze dumps in a more appropriately-named file.
Discussed in https://gitlab.com/OpenMW/openmw/-/issues/7455
Manual rewrite of c21695c951
As well as that, I found a bug where the crash dump path was being converted from a std::filesystem::path to a utf8-encoded std::string, then passed to the crash catcher, which converted it to a std::filesystem::path implicitly, but using the system eight-bit code page, which wouldn't usually be UTF-8. That's now fixed by passing the function that expects a path a path instead of a string.
		
	
			
		
			
				
	
	
		
			63 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef WINDOWS_CRASHMONITOR_HPP
 | 
						|
#define WINDOWS_CRASHMONITOR_HPP
 | 
						|
 | 
						|
#include <components/windows.hpp>
 | 
						|
 | 
						|
#include <atomic>
 | 
						|
#include <unordered_map>
 | 
						|
 | 
						|
namespace Crash
 | 
						|
{
 | 
						|
 | 
						|
    struct CrashSHM;
 | 
						|
 | 
						|
    class CrashMonitor final
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        CrashMonitor(HANDLE shmHandle);
 | 
						|
 | 
						|
        ~CrashMonitor();
 | 
						|
 | 
						|
        void run();
 | 
						|
 | 
						|
    private:
 | 
						|
        HANDLE mAppProcessHandle = nullptr;
 | 
						|
        DWORD mAppMainThreadId = 0;
 | 
						|
        HWND mAppWindowHandle = nullptr;
 | 
						|
 | 
						|
        // triggered when the monitor process wants to wake the parent process (received via SHM)
 | 
						|
        HANDLE mSignalAppEvent = nullptr;
 | 
						|
        // triggered when the application wants to wake the monitor process (received via SHM)
 | 
						|
        HANDLE mSignalMonitorEvent = nullptr;
 | 
						|
 | 
						|
        CrashSHM* mShm = nullptr;
 | 
						|
        HANDLE mShmHandle = nullptr;
 | 
						|
        HANDLE mShmMutex = nullptr;
 | 
						|
 | 
						|
        DWORD mFreezeMessageBoxThreadId = 0;
 | 
						|
        std::atomic_bool mFreezeAbort;
 | 
						|
 | 
						|
        static std::unordered_map<HWINEVENTHOOK, CrashMonitor*> smEventHookOwners;
 | 
						|
 | 
						|
        void signalApp() const;
 | 
						|
 | 
						|
        bool waitApp() const;
 | 
						|
 | 
						|
        bool isAppAlive() const;
 | 
						|
 | 
						|
        bool isAppFrozen();
 | 
						|
 | 
						|
        void shmLock();
 | 
						|
 | 
						|
        void shmUnlock();
 | 
						|
 | 
						|
        void handleCrash(bool isFreeze);
 | 
						|
 | 
						|
        void showFreezeMessageBox();
 | 
						|
 | 
						|
        void hideFreezeMessageBox();
 | 
						|
    };
 | 
						|
 | 
						|
} // namespace Crash
 | 
						|
 | 
						|
#endif // WINDOWS_CRASHMONITOR_HPP
 |