[Pcsclite-cvs-commit] PCSC/src readerfactory.c,1.25,1.26
sauveron-guest@quantz.debian.org
sauveron-guest@quantz.debian.org
Mon, 29 Sep 2003 15:35:47 +0200
Update of /cvsroot/pcsclite/PCSC/src
In directory quantz:/tmp/cvs-serv13017/src
Modified Files:
readerfactory.c
Log Message:
Clean up the mutex when a reader is removed if needed. This is a memory leak
Index: readerfactory.c
===================================================================
RCS file: /cvsroot/pcsclite/PCSC/src/readerfactory.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- readerfactory.c 29 Sep 2003 11:19:11 -0000 1.25
+++ readerfactory.c 29 Sep 2003 13:35:45 -0000 1.26
@@ -181,6 +181,8 @@
(sContexts[parentNode])->vHandle;
(sContexts[dwContext])->mMutex =
(sContexts[parentNode])->mMutex;
+ (sContexts[dwContext])->dwMutex =
+ (sContexts[parentNode])->dwMutex;
/*
* Call on the driver to see if it is thread safe
@@ -193,6 +195,11 @@
{
DebugLogA("Driver is thread safe");
(sContexts[dwContext])->mMutex = 0;
+ (sContexts[dwContext])->dwMutex = 0;
+ }
+ else
+ {
+ *(sContexts[dwContext])->dwMutex += 1;
}
}
@@ -216,6 +223,14 @@
SYS_MutexInit((sContexts[dwContext])->mMutex);
}
+ if ((sContexts[dwContext])->dwMutex == 0)
+ {
+ (sContexts[dwContext])->dwMutex =
+ (DWORD *)malloc(sizeof(DWORD));
+
+ *(sContexts[dwContext])->dwMutex = 1;
+ }
+
*dwNumContexts += 1;
rv = RFInitializeReader(sContexts[dwContext]);
@@ -325,6 +340,8 @@
(sContexts[dwContext])->vHandle;
(sContexts[dwContextB])->mMutex =
(sContexts[dwContext])->mMutex;
+ (sContexts[dwContextB])->dwMutex =
+ (sContexts[dwContext])->dwMutex;
/*
* Added by Dave - slots did not have a dwFeeds
@@ -363,7 +380,15 @@
(sContexts[dwContextB])->mMutex =
(PCSCLITE_MUTEX_T) malloc(sizeof(PCSCLITE_MUTEX));
SYS_MutexInit((sContexts[dwContextB])->mMutex);
- }
+
+ (sContexts[dwContextB])->dwMutex =
+ (DWORD *)malloc(sizeof(DWORD));
+ *(sContexts[dwContextB])->dwMutex = 1;
+ }
+ else
+ {
+ *(sContexts[dwContextB])->dwMutex += 1;
+ }
*dwNumContexts += 1;
@@ -434,10 +459,18 @@
/*
* Destroy and free the mutex
*/
- if (*sContext->dwFeeds == 1)
+ if (*sContext->dwMutex == 1)
{
SYS_MutexDestroy(sContext->mMutex);
free(sContext->mMutex);
+ }
+
+ *sContext->dwMutex -= 1;
+
+ if (*sContext->dwMutex == 0)
+ {
+ free(sContext->dwMutex);
+ sContext->dwMutex = 0;
}
*sContext->dwFeeds -= 1;