[Pcsclite-cvs-commit] r2780 - in /trunk/PCSC/src: eventhandler.c eventhandler.h readerfactory.c readerfactory.h

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Fri Feb 1 09:48:25 UTC 2008


Author: rousseau
Date: Fri Feb  1 09:48:25 2008
New Revision: 2780

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=2780
Log:
add support of TAG_IFD_POLLING_THREAD to use an asynchronous card
movements detection instead of an active polling

Modified:
    trunk/PCSC/src/eventhandler.c
    trunk/PCSC/src/eventhandler.h
    trunk/PCSC/src/readerfactory.c
    trunk/PCSC/src/readerfactory.h

Modified: trunk/PCSC/src/eventhandler.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/eventhandler.c?rev=2780&op=diff
==============================================================================
--- trunk/PCSC/src/eventhandler.c (original)
+++ trunk/PCSC/src/eventhandler.c Fri Feb  1 09:48:25 2008
@@ -119,19 +119,16 @@
 
 	Log1(PCSC_LOG_INFO, "Stomping thread.");
 
-	do
-	{
-		/*
-		 * Wait 0.05 seconds for the child to respond
-		 */
-		SYS_USleep(50000);
-	}
-	while (rContext->dwLockId == 0xFFFF);
+	/* kill the "polling" thread */
+	SYS_ThreadCancel(rContext->pthThread);
+
+	/* wait for the thread to finish */
+	SYS_ThreadJoin(rContext->pthThread, NULL);
+
 	/*
 	 * Zero out the public status struct to allow it to be recycled and
 	 * used again
 	 */
-
 	memset(rContext->readerState->readerName, 0,
 		sizeof(rContext->readerState->readerName));
 	memset(rContext->readerState->cardAtr, 0,
@@ -150,7 +147,8 @@
 	return SCARD_S_SUCCESS;
 }
 
-LONG EHSpawnEventHandler(PREADER_CONTEXT rContext)
+LONG EHSpawnEventHandler(PREADER_CONTEXT rContext,
+	RESPONSECODE (*card_event)(DWORD))
 {
 	LONG rv;
 	DWORD dwStatus = 0;
@@ -190,6 +188,7 @@
 	rContext->readerState->cardAtrLength = dwAtrLen;
 	rContext->readerState->cardProtocol = SCARD_PROTOCOL_UNDEFINED;
 
+	rContext->pthCardEvent = card_event;
 	rv = SYS_ThreadCreate(&rContext->pthThread, THREAD_ATTR_DETACHED,
 		(PCSCLITE_THREAD_FUNCTION( ))EHStatusHandlerThread, (LPVOID) rContext);
 	if (rv == 1)
@@ -453,28 +452,38 @@
 			}
 		}
 
+		/*
+		 * Sharing may change w/o an event pass it on
+		 */
+
+		if (dwReaderSharing != rContext->dwContexts)
+		{
+			dwReaderSharing = rContext->dwContexts;
+			rContext->readerState->readerSharing = dwReaderSharing;
+			SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
+		}
+
+		if (rContext->pthCardEvent)
+		{
+			int ret;
+			
+			ret = rContext->pthCardEvent(rContext->dwSlot);
+			if (IFD_NO_SUCH_DEVICE == ret)
+				SYS_USleep(PCSCLITE_STATUS_POLL_RATE);
+		}
+		else
+			SYS_USleep(PCSCLITE_STATUS_POLL_RATE);
+
 		if (rContext->dwLockId == 0xFFFF)
 		{
 			/*
 			 * Exit and notify the caller
 			 */
+			Log1(PCSC_LOG_CRITICAL, "Die");
 			rContext->dwLockId = 0;
 			SYS_ThreadDetach(rContext->pthThread);
 			SYS_ThreadExit(NULL);
 		}
-
-		/*
-		 * Sharing may change w/o an event pass it on
-		 */
-
-		if (dwReaderSharing != rContext->dwContexts)
-		{
-			dwReaderSharing = rContext->dwContexts;
-			rContext->readerState->readerSharing = dwReaderSharing;
-			SYS_MMapSynchronize((void *) rContext->readerState, pageSize);
-		}
-
-		SYS_USleep(PCSCLITE_STATUS_POLL_RATE);
 	}
 }
 

Modified: trunk/PCSC/src/eventhandler.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/eventhandler.h?rev=2780&op=diff
==============================================================================
--- trunk/PCSC/src/eventhandler.h (original)
+++ trunk/PCSC/src/eventhandler.h Fri Feb  1 09:48:25 2008
@@ -43,7 +43,7 @@
 	READER_STATE, *PREADER_STATE;
 
 	LONG EHInitializeEventStructures(void);
-	LONG EHSpawnEventHandler(PREADER_CONTEXT);
+	LONG EHSpawnEventHandler(PREADER_CONTEXT, RESPONSECODE (*)(DWORD));
 	LONG EHDestroyEventHandler(PREADER_CONTEXT);
 
 #ifdef __cplusplus

Modified: trunk/PCSC/src/readerfactory.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/readerfactory.c?rev=2780&op=diff
==============================================================================
--- trunk/PCSC/src/readerfactory.c (original)
+++ trunk/PCSC/src/readerfactory.c Fri Feb  1 09:48:25 2008
@@ -289,9 +289,23 @@
 		return rv;
 	}
 
-	rv = EHSpawnEventHandler(sReadersContexts[dwContext]);
-	if (rv != SCARD_S_SUCCESS)
-		return rv;
+	/*
+	 * asynchronous card movement?
+	 */
+	{
+		RESPONSECODE (*fct)(DWORD) = NULL;
+
+		dwGetSize = sizeof(fct);
+
+		rv = IFDGetCapabilities((sReadersContexts[dwContext]),
+			TAG_IFD_POLLING_THREAD, &dwGetSize, (PUCHAR)&fct);
+		if (rv != SCARD_S_SUCCESS)
+			fct = NULL;
+
+		rv = EHSpawnEventHandler(sReadersContexts[dwContext], fct);
+		if (rv != SCARD_S_SUCCESS)
+			return rv;
+	}
 
 	/*
 	 * Call on the driver to see if there are multiple slots
@@ -466,7 +480,7 @@
 			return rv;
 		}
 
-		EHSpawnEventHandler(sReadersContexts[dwContextB]);
+		EHSpawnEventHandler(sReadersContexts[dwContextB], NULL);
 	}
 
 	return SCARD_S_SUCCESS;
@@ -1596,7 +1610,7 @@
 			}
 
 
-			EHSpawnEventHandler(sReadersContexts[i]);
+			EHSpawnEventHandler(sReadersContexts[i], NULL);
 			RFSetReaderEventState(sReadersContexts[i], SCARD_RESET);
 		}
 	}

Modified: trunk/PCSC/src/readerfactory.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/readerfactory.h?rev=2780&op=diff
==============================================================================
--- trunk/PCSC/src/readerfactory.h (original)
+++ trunk/PCSC/src/readerfactory.h Fri Feb  1 09:48:25 2008
@@ -146,6 +146,7 @@
 		char lpcLibrary[MAX_LIBNAME];	/* Library Path */
 		char lpcDevice[MAX_DEVICENAME];	/* Device Name */
 		PCSCLITE_THREAD_T pthThread;	/* Event polling thread */
+		RESPONSECODE (*pthCardEvent)(DWORD);	/* Card Event sync */
 		PCSCLITE_MUTEX_T mMutex;	/* Mutex for this connection */
 		RDR_CLIHANDLES psHandles[PCSCLITE_MAX_READER_CONTEXT_CHANNELS];
                                          /* Structure of connected handles */




More information about the Pcsclite-cvs-commit mailing list