Ver Fonte

Fix crash on exit T3D when build with CMake.

Process::_signalProcess is destroyed first, and then Win32WindowManager::~Win32WindowManager() try to remove from deleted Signal causing a crash.

SlotSignal handle this automatically.
LuisAntonRebollo há 11 anos atrás
pai
commit
881d578aae

+ 5 - 0
Engine/source/core/util/journal/process.h

@@ -96,6 +96,11 @@ public:
       get()._signalProcess.notify(del,order);
    }
 
+   static void notify(SignalSlot<void()> &slot, F32 order = PROCESS_DEFAULT_ORDER) 
+   {
+      get()._signalProcess.notify(slot,order);
+   }
+
    template <class T>
    static void notify(T func, F32 order = PROCESS_DEFAULT_ORDER) 
    {

+ 2 - 4
Engine/source/windowManager/win32/win32WindowMgr.cpp

@@ -41,7 +41,8 @@ PlatformWindowManager * CreatePlatformWindowManager()
 Win32WindowManager::Win32WindowManager()
 {
    // Register in the process list.
-   Process::notify(this, &Win32WindowManager::_process, PROCESS_INPUT_ORDER);
+   mOnProcessSignalSlot.setDelegate( this, &Win32WindowManager::_process );
+   Process::notify( mOnProcessSignalSlot, PROCESS_INPUT_ORDER );
 
    // Init our list of allocated windows.
    mWindowListHead = NULL;
@@ -58,9 +59,6 @@ Win32WindowManager::Win32WindowManager()
 
 Win32WindowManager::~Win32WindowManager()
 {
-   // Get ourselves off the process list.
-   Process::remove(this, &Win32WindowManager::_process);
-
    // Kill all our windows first.
    while(mWindowListHead)
       // The destructors update the list, so this works just fine.

+ 2 - 0
Engine/source/windowManager/win32/win32WindowMgr.h

@@ -85,6 +85,8 @@ class Win32WindowManager : public PlatformWindowManager
    /// If a curtain window is present, then its HWND will be stored here.
    HWND mCurtainWindow;
 
+   SignalSlot<void()> mOnProcessSignalSlot;
+
 public:
    Win32WindowManager();
    ~Win32WindowManager();