diff options
author | George Hazan <george.hazan@gmail.com> | 2013-08-06 18:52:28 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2013-08-06 18:52:28 +0000 |
commit | 90fc3521557ae33352dcc7baa87828b6bb0ca2b9 (patch) | |
tree | 8e0891cca3e94e348ee32e81d54d6da9d5b151d7 | |
parent | 7ebc990573da8a08c58c1092ed126357c44804f5 (diff) |
fix for very rare crash on slow machines
git-svn-id: http://svn.miranda-ng.org/main/trunk@5604 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r-- | plugins/SeenPlugin/src/main.cpp | 4 | ||||
-rw-r--r-- | plugins/SeenPlugin/src/seen.h | 3 | ||||
-rw-r--r-- | plugins/SeenPlugin/src/utils.cpp | 24 |
3 files changed, 15 insertions, 16 deletions
diff --git a/plugins/SeenPlugin/src/main.cpp b/plugins/SeenPlugin/src/main.cpp index 4cd3e6b492..8468421e53 100644 --- a/plugins/SeenPlugin/src/main.cpp +++ b/plugins/SeenPlugin/src/main.cpp @@ -48,6 +48,8 @@ DBVTranslation idleTr[TRANSNUMBER]={ BOOL includeIdle;
LIST<logthread_info> arContacts(16, HandleKeySortT);
+CRITICAL_SECTION csContacts;
+
int MainInit(WPARAM,LPARAM)
{
@@ -97,6 +99,7 @@ extern "C" __declspec(dllexport) int Load(void) mir_getLP(&pluginInfo);
g_hShutdownEvent = CreateEvent(0, TRUE, FALSE, 0);
+ InitializeCriticalSection(&csContacts);
HookEvent(ME_SYSTEM_MODULESLOADED, MainInit);
HookEvent(ME_SYSTEM_PRESHUTDOWN, OnShutdown);
@@ -114,6 +117,7 @@ extern "C" __declspec(dllexport) int Unload(void) UnhookEvent(ehmissed);
arContacts.destroy();
+ DeleteCriticalSection(&csContacts);
CloseHandle(g_hShutdownEvent);
return 0;
}
diff --git a/plugins/SeenPlugin/src/seen.h b/plugins/SeenPlugin/src/seen.h index 34d70efe26..e9846be1ce 100644 --- a/plugins/SeenPlugin/src/seen.h +++ b/plugins/SeenPlugin/src/seen.h @@ -123,4 +123,5 @@ extern HANDLE ehuserinfo, ehmissed_proto; extern HGENMENU hmenuitem;
extern DWORD dwmirver;
-extern LIST<logthread_info> arContacts;
\ No newline at end of file +extern LIST<logthread_info> arContacts;
+extern CRITICAL_SECTION csContacts;
\ No newline at end of file diff --git a/plugins/SeenPlugin/src/utils.cpp b/plugins/SeenPlugin/src/utils.cpp index 66fe989393..c7e0705a7d 100644 --- a/plugins/SeenPlugin/src/utils.cpp +++ b/plugins/SeenPlugin/src/utils.cpp @@ -516,17 +516,6 @@ void myPlaySound(HANDLE hcontact, WORD newStatus, WORD oldStatus) }
//will add hContact to queue and will return position;
-static logthread_info* addContactToQueue(HANDLE hContact)
-{
- if (!hContact)
- return NULL;
-
- logthread_info *p = (logthread_info*)mir_calloc(sizeof(logthread_info));
- p->hContact = hContact;
- arContacts.insert(p);
- return p;
-}
-
static void waitThread(void *param)
{
logthread_info* infoParam = (logthread_info*)param;
@@ -547,8 +536,10 @@ static void waitThread(void *param) db_set_w(infoParam->hContact,S_MOD,"StatusTriger",infoParam->currStatus);
}
}
-
- arContacts.remove(infoParam);
+ {
+ mir_cslock lck(csContacts);
+ arContacts.remove(infoParam);
+ }
mir_free(infoParam);
}
@@ -626,13 +617,16 @@ int UpdateValues(WPARAM wparam,LPARAM lparam) db_set_b(hContact, S_MOD, "Offline", 0);
}
}
- else if (IsWatchedProtocol(cws->szModule)) {
+ else if (hContact && IsWatchedProtocol(cws->szModule)) {
//here we will come when <User>/<module>/Status is changed or it is idle event and if <module> is watched
if ( CallProtoService(cws->szModule,PS_GETSTATUS,0,0) > ID_STATUS_OFFLINE){
+ mir_cslock lck(csContacts);
logthread_info *p = arContacts.find((logthread_info*)&hContact);
if (p == NULL) {
- p = addContactToQueue(hContact);
+ p = (logthread_info*)mir_calloc(sizeof(logthread_info));
+ p->hContact = hContact;
strncpy(p->sProtoName, cws->szModule, MAXMODULELABELLENGTH);
+ arContacts.insert(p);
mir_forkthread(waitThread, p);
}
p->currStatus = isIdleEvent ? db_get_w(hContact, cws->szModule, "Status", ID_STATUS_OFFLINE) : cws->value.wVal;
|