From 5e0c012d677635e13cbfcf6730f2deafdc38c025 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 3 Jan 2014 15:57:52 +0000 Subject: - memory leak fixes - code cleaning git-svn-id: http://svn.miranda-ng.org/main/trunk@7479 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Variables/src/parse_variables.cpp | 147 ++++++++++++------------------ 1 file changed, 58 insertions(+), 89 deletions(-) (limited to 'plugins/Variables/src/parse_variables.cpp') diff --git a/plugins/Variables/src/parse_variables.cpp b/plugins/Variables/src/parse_variables.cpp index 2563d0e954..432d4eb0fd 100644 --- a/plugins/Variables/src/parse_variables.cpp +++ b/plugins/Variables/src/parse_variables.cpp @@ -2,7 +2,7 @@ Variables Plugin for Miranda-IM (www.miranda-im.org) Copyright 2003-2006 P. Boon - This program is mir_free software; you can redistribute it and/or modify + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -24,137 +24,106 @@ static CRITICAL_SECTION csVarRegister; static VARIABLEREGISTER *vr = NULL; static int vrCount = 0; -static int addToVariablesRegister(TCHAR *szName, TCHAR *szText) { - - int i; - - if ((szName == NULL) || (szText == NULL) || (_tcslen(szName) <= 0)) { +static int addToVariablesRegister(TCHAR *szName, TCHAR *szText) +{ + if ((szName == NULL) || (szText == NULL) || (_tcslen(szName) <= 0)) return -1; - } - EnterCriticalSection(&csVarRegister); - for (i=0;i 1) { - memcpy(&vr[i], &vr[vrCount-1], sizeof(VARIABLEREGISTER)); - vr = ( VARIABLEREGISTER* )mir_realloc(vr, (vrCount-1)*sizeof(VARIABLEREGISTER)); - if (vr == NULL) { - LeaveCriticalSection(&csVarRegister); - return -1; - } - vrCount -= 1; - } - else { - mir_free(vr); - vr = NULL; - vrCount = 0; - } - count += 1; +int clearVariableRegister(bool bAll) +{ + int count = 0; + mir_cslock lck(csVarRegister); + for (int i = 0; i < vrCount; i++) { + if (!bAll && vr[i].dwOwnerThread != GetCurrentThreadId()) + continue; + + mir_free(vr[i].szName); + mir_free(vr[i].szText); + if (vrCount > 1) { + memcpy(&vr[i], &vr[vrCount-1], sizeof(VARIABLEREGISTER)); + vr = (VARIABLEREGISTER*)mir_realloc(vr, (vrCount-1)*sizeof(VARIABLEREGISTER)); + if (vr == NULL) + return -1; + + vrCount--; } + else { + mir_free(vr); + vr = NULL; + vrCount = 0; + } + count += 1; } - LeaveCriticalSection(&csVarRegister); return count; } -static TCHAR *parsePut(ARGUMENTSINFO *ai) { - +static TCHAR *parsePut(ARGUMENTSINFO *ai) +{ FORMATINFO fi; - if (ai->argc != 3) { + if (ai->argc != 3) return NULL; - } -// ai->flags |= AIF_DONTPARSE; - if (addToVariablesRegister(ai->targv[1], ai->targv[2])) { + + // ai->flags |= AIF_DONTPARSE; + if (addToVariablesRegister(ai->targv[1], ai->targv[2])) return NULL; - } memcpy(&fi, ai->fi, sizeof(fi)); fi.tszFormat = ai->targv[2]; fi.flags |= FIF_TCHAR; - return formatString(&fi); } -static TCHAR *parsePuts(ARGUMENTSINFO *ai) { - - if (ai->argc != 3) { +static TCHAR *parsePuts(ARGUMENTSINFO *ai) +{ + if (ai->argc != 3) return NULL; - } -// ai->flags |= AIF_DONTPARSE; - if (addToVariablesRegister(ai->targv[1], ai->targv[2])) { + + if (addToVariablesRegister(ai->targv[1], ai->targv[2])) return NULL; - } return mir_tstrdup(_T("")); } - -static TCHAR *parseGet(ARGUMENTSINFO *ai) { - TCHAR *szText; - - if (ai->argc != 2) { - return NULL; - } -// ai->flags |= AIF_DONTPARSE; - szText = searchVariableRegister(ai->targv[1]); - if (szText == NULL) { +static TCHAR *parseGet(ARGUMENTSINFO *ai) +{ + if (ai->argc != 2) return NULL; - } - return szText; + return searchVariableRegister(ai->targv[1]); } int registerVariablesTokens() @@ -163,11 +132,11 @@ int registerVariablesTokens() registerIntToken(_T(PUT), parsePut, TRF_FUNCTION, LPGEN("Variables")"\t(x,y)\t"LPGEN("x, and stores y as variable named x"));//TRF_UNPARSEDARGS); registerIntToken(_T(PUTS), parsePuts, TRF_FUNCTION, LPGEN("Variables")"\t(x,y)\t"LPGEN("only stores y as variables x"));//TRF_UNPARSEDARGS); InitializeCriticalSection(&csVarRegister); - return 0; } void unregisterVariablesTokens() { + clearVariableRegister(true); DeleteCriticalSection(&csVarRegister); } -- cgit v1.2.3