[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;