mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.3 KiB
C++
64 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();
|
|
|
|
void showFreezeMessageBox();
|
|
|
|
void hideFreezeMessageBox();
|
|
};
|
|
|
|
} // namespace Crash
|
|
|
|
#endif // WINDOWS_CRASHMONITOR_HPP
|