[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