From 481fdcdb42e01422b33aad54dd1671cea705ce22 Mon Sep 17 00:00:00 2001
From: George Hazan <george.hazan@gmail.com>
Date: Mon, 22 Dec 2014 16:16:05 +0000
Subject: - fix for _AniAva_AnimationTreadProc; - another CRITICAL_SECTION died

git-svn-id: http://svn.miranda-ng.org/main/trunk@11585 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp |   5 +-
 plugins/Clist_modern/src/modern_aniavatars.cpp     | 133 +++++++++++----------
 2 files changed, 71 insertions(+), 67 deletions(-)

(limited to 'plugins')

diff --git a/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp b/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp
index d0a47d304f..d9ed922105 100644
--- a/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp
+++ b/plugins/Clist_modern/src/CLUIFrames/cluiframes.cpp
@@ -34,6 +34,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 static const int UNCOLLAPSED_FRAME_SIZE = 0;
 static const int DEFAULT_TITLEBAR_HEIGHT = 18;
 
+void _AniAva_OnModulesUnload();
+
 //GLOBALS
 FRAMEWND *g_pfwFrames = NULL;
 int g_nFramesCount = 0;
@@ -3607,8 +3609,9 @@ int CLUIFrameOnModulesUnload(WPARAM, LPARAM)
 	CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiBorder, 0);
 	CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiAlignRoot, 0);
 	CallService(MO_REMOVEMENUITEM, (LPARAM)_hmiPosRoot, 0);
-
 	_hmiVisible = 0;
+
+	_AniAva_OnModulesUnload();
 	return 0;
 }
 
diff --git a/plugins/Clist_modern/src/modern_aniavatars.cpp b/plugins/Clist_modern/src/modern_aniavatars.cpp
index a60083a7e7..3ed2d22c71 100644
--- a/plugins/Clist_modern/src/modern_aniavatars.cpp
+++ b/plugins/Clist_modern/src/modern_aniavatars.cpp
@@ -24,8 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 // File contains implementation of animated avatars in contact list
 
-*************************************************************************** /
-
 #include "hdr/modern_commonheaders.h"
 
 #define IMMEDIATE_DRAW (!s_bSeparateWindow)
@@ -127,7 +125,7 @@ struct ANIAVATARIMAGEINFO
 
 //protection
 static BOOL s_bModuleStarted;
-static CRITICAL_SECTION s_CS;
+static mir_cs s_CS;
 
 //options
 static BYTE s_bFlags;				// 0x1 has border, 0x2 has round corners, 0x4 has overlay, 0x8 background color
@@ -168,13 +166,8 @@ static HWND _AniAva_CreateAvatarWindowSync(TCHAR *szFileName);
 
 static LRESULT CALLBACK _AniAva_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
-///	IMPLEMENTATION
-
-int _AniAva_OnModulesUnload(WPARAM, LPARAM)
-{
-	SetEvent(s_hExitEvent);
-	return 0;
-}
+/////////////////////////////////////////////////////////////////////////////////////////
+/// IMPLEMENTATION
 
 static void _AniAva_AnimationTreadProc(void*)
 {
@@ -188,6 +181,9 @@ static void _AniAva_AnimationTreadProc(void*)
 	SetThreadPriority(hThread, THREAD_PRIORITY_LOWEST);
 	for (;;) {
 		DWORD rc = MsgWaitForMultipleObjectsEx(1, &s_hExitEvent, INFINITE, QS_ALLINPUT, MWMO_ALERTABLE);
+		if (MirandaExiting())
+			break;
+		
 		ResetEvent(s_hExitEvent);
 		if (rc == WAIT_OBJECT_0 + 1) {
 			MSG msg;
@@ -204,60 +200,11 @@ static void _AniAva_AnimationTreadProc(void*)
 	Netlib_Logf(NULL, "AnimationTreadProc thread end");
 	CloseHandle(s_AnimationThreadHandle);
 	s_AnimationThreadHandle = NULL;
-}
-
-// Init AniAva module
-int AniAva_InitModule()
-{
-	if (!(db_get_b(NULL, "CList", "AvatarsAnimated", ServiceExists(MS_AV_GETAVATARBITMAP)) &&
-		db_get_b(NULL, "CList", "AvatarsShow", SETTINGS_SHOWAVATARS_DEFAULT)))
-		return 0;
-
-	WNDCLASSEX wc = { sizeof(wc) };
-	wc.lpszClassName = ANIAVAWINDOWCLASS;
-	wc.lpfnWndProc = _AniAva_WndProc;
-	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-	wc.cbWndExtra = sizeof(ANIAVA_WINDOWINFO*);
-	wc.style = CS_GLOBALCLASS;
-	RegisterClassEx(&wc);
-
-	InitializeCriticalSection(&s_CS);
-	s_bModuleStarted = TRUE;
-	s_hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	mir_forkthread(_AniAva_AnimationTreadProc, NULL);
-	HookEvent(ME_SYSTEM_PRESHUTDOWN, _AniAva_OnModulesUnload);
 
-	_AniAva_LoadOptions();
-	return 1;
+	CloseHandle(s_hExitEvent);
+	s_hExitEvent = NULL;
 }
 
-// Unload AniAva module
-int AniAva_UnloadModule()
-{
-	aacheck 0;
-	{
-		mir_cslock lck(s_CS);
-		int i;
-		s_bModuleStarted = FALSE;
-		for (i = 0; i < s_Objects.getCount(); i++) {
-			_AniAva_DestroyAvatarWindow(s_Objects[i]->hWindow);
-			mir_free(s_Objects[i]);
-		}
-
-		for (i = 0; i < s_AniAvatarList.getCount(); i++) {
-			ANIAVA_INFO *aai = s_AniAvatarList[i];
-			mir_free(aai->tcsFilename);
-			free(aai->pFrameDelays);
-			mir_free(aai);
-		}
-
-		_AniAva_RemoveAniAvaDC();
-		SetEvent(s_hExitEvent);
-		CloseHandle(s_hExitEvent);
-	}
-	DeleteCriticalSection(&s_CS);
-	return 1;
-}
 // Update options
 int AniAva_UpdateOptions()
 {
@@ -372,8 +319,6 @@ int AniAva_SetAvatarPos(MCONTACT hContact, RECT *rc, int overlayIdx, BYTE bAlpha
 {
 	aacheck 0;
 	mir_cslock lck(s_CS);
-	if (s_CS.LockCount > 0)
-		return 0;
 
 	ANIAVA_OBJECT *pai = FindAvatarByContact(hContact);
 	if (pai) {
@@ -401,6 +346,7 @@ int AniAva_SetAvatarPos(MCONTACT hContact, RECT *rc, int overlayIdx, BYTE bAlpha
 	}
 	return 1;
 }
+
 // remove avatar
 int AniAva_RemoveAvatar(MCONTACT hContact)
 {
@@ -416,6 +362,7 @@ int AniAva_RemoveAvatar(MCONTACT hContact)
 	}
 	return 1;
 }
+
 // reset positions of avatars to be drawn (still be painted at same place)
 int AniAva_InvalidateAvatarPositions(MCONTACT hContact)
 {
@@ -431,6 +378,7 @@ int AniAva_InvalidateAvatarPositions(MCONTACT hContact)
 	}
 	return 1;
 }
+
 // all avatars without validated position will be stop painted and probably removed
 int AniAva_RemoveInvalidatedAvatars()
 {
@@ -1064,6 +1012,59 @@ static LRESULT CALLBACK _AniAva_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
 	return DefWindowProc(hwnd, msg, wParam, lParam);
 }
 
-#undef aacheck
-#undef aalock
-#undef aaunlock
+/////////////////////////////////////////////////////////////////////////////////////////
+// Init AniAva module
+
+int AniAva_InitModule()
+{
+	if (!(db_get_b(NULL, "CList", "AvatarsAnimated", ServiceExists(MS_AV_GETAVATARBITMAP)) &&
+		db_get_b(NULL, "CList", "AvatarsShow", SETTINGS_SHOWAVATARS_DEFAULT)))
+		return 0;
+
+	WNDCLASSEX wc = { sizeof(wc) };
+	wc.lpszClassName = ANIAVAWINDOWCLASS;
+	wc.lpfnWndProc = _AniAva_WndProc;
+	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+	wc.cbWndExtra = sizeof(ANIAVA_WINDOWINFO*);
+	wc.style = CS_GLOBALCLASS;
+	RegisterClassEx(&wc);
+
+	s_bModuleStarted = TRUE;
+
+	_AniAva_LoadOptions();
+
+	s_hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+	mir_forkthread(_AniAva_AnimationTreadProc, NULL);
+	return 1;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Unload AniAva module
+
+void _AniAva_OnModulesUnload()
+{
+	SetEvent(s_hExitEvent);
+}
+
+int AniAva_UnloadModule()
+{
+	aacheck 0;
+	{
+		mir_cslock lck(s_CS);
+		s_bModuleStarted = FALSE;
+		for (int i = 0; i < s_Objects.getCount(); i++) {
+			_AniAva_DestroyAvatarWindow(s_Objects[i]->hWindow);
+			mir_free(s_Objects[i]);
+		}
+
+		for (int i = 0; i < s_AniAvatarList.getCount(); i++) {
+			ANIAVA_INFO *aai = s_AniAvatarList[i];
+			mir_free(aai->tcsFilename);
+			free(aai->pFrameDelays);
+			mir_free(aai);
+		}
+
+		_AniAva_RemoveAniAvaDC();
+	}
+	return 1;
+}
-- 
cgit v1.2.3