OSDN Git Service

post WM_NULL to attached threads on yamy exit to unmap mayu{32,64}.dll
[yamy/yamy.git] / mayu.cpp
index 7654653..91653b8 100644 (file)
--- a/mayu.cpp
+++ b/mayu.cpp
@@ -224,6 +224,12 @@ private:
                        break;\r
                }\r
 \r
+               case Notify::Type_threadAttach: {\r
+                       NotifyThreadAttach *n = (NotifyThreadAttach *)cd->lpData;\r
+                       m_engine.threadAttachNotify(n->m_threadId);\r
+                       break;\r
+               }\r
+\r
                case Notify::Type_threadDetach: {\r
                        NotifyThreadDetach *n = (NotifyThreadDetach *)cd->lpData;\r
                        m_engine.threadDetachNotify(n->m_threadId);\r
@@ -1177,18 +1183,6 @@ public:
 \r
        ///\r
        ~Mayu() {\r
-               CancelIo(m_hNotifyMailslot);\r
-               SleepEx(0, TRUE);\r
-               CloseHandle(m_hNotifyMailslot);\r
-               CloseHandle(m_hNotifyEvent);\r
-               ReleaseMutex(m_mutex);\r
-               WaitForSingleObject(m_mutex, INFINITE);\r
-               // first, detach log from edit control to avoid deadlock\r
-               m_log.detach();\r
-#ifdef LOG_TO_FILE\r
-               m_logFile.close();\r
-#endif // LOG_TO_FILE\r
-\r
                // stop notify from mayu.dll\r
                g_hookData->m_hwndTaskTray = NULL;\r
                CHECK_FALSE( uninstallMessageHook() );\r
@@ -1201,10 +1195,18 @@ public:
                }\r
                CloseHandle(m_hMutexYamyd);\r
 #endif // _WIN64\r
-               if (!(m_sessionState & SESSION_END_QUERIED)) {\r
-                       DWORD_PTR result;\r
-                       SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 3000, &result);\r
-               }\r
+\r
+               CancelIo(m_hNotifyMailslot);\r
+               SleepEx(0, TRUE);\r
+               CloseHandle(m_hNotifyMailslot);\r
+               CloseHandle(m_hNotifyEvent);\r
+               ReleaseMutex(m_mutex);\r
+               WaitForSingleObject(m_mutex, INFINITE);\r
+               // first, detach log from edit control to avoid deadlock\r
+               m_log.detach();\r
+#ifdef LOG_TO_FILE\r
+               m_logFile.close();\r
+#endif // LOG_TO_FILE\r
 \r
                // destroy windows\r
                CHECK_TRUE( DestroyWindow(m_hwndVersion) );\r
@@ -1223,6 +1225,11 @@ public:
                // stop keyboard handler thread\r
                m_engine.stop();\r
 \r
+               if (!(m_sessionState & SESSION_END_QUERIED)) {\r
+                       DWORD_PTR result;\r
+                       SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, 0, 3000, &result);\r
+               }\r
+\r
                // remove setting;\r
                delete m_setting;\r
        }\r