/** * Close a communication channel to the IFD. */ LONG IFDCloseIFD(PREADER_CONTEXT rContext) { RESPONSECODE rv = IFD_SUCCESS; #ifndef PCSCLITE_STATIC_DRIVER RESPONSECODE(*IO_close_channel) (void) = NULL; RESPONSECODE(*IFDH_close_channel) (DWORD) = NULL; if (rContext->dwVersion == IFD_HVERSION_1_0) IO_close_channel = rContext->psFunctions.psFunctions_v1.pvfCloseChannel; else IFDH_close_channel = rContext->psFunctions.psFunctions_v2.pvfCloseChannel; #endif /* LOCK THIS CODE REGION */ (void)SYS_MutexLock(rContext->mMutex); #ifndef PCSCLITE_STATIC_DRIVER if (rContext->dwVersion == IFD_HVERSION_1_0) rv = (*IO_close_channel) (); else rv = (*IFDH_close_channel) (rContext->dwSlot); #else if (rContext->dwVersion == IFD_HVERSION_1_0) rv = IO_Close_Channel(); else rv = IFDHCloseChannel(rContext->dwSlot); #endif /* END OF LOCKED REGION */ (void)SYS_MutexUnLock(rContext->mMutex); return rv; }
/** * Close a communication channel to the IFD. */ LONG IFDCloseIFD(PREADER_CONTEXT rContext) { RESPONSECODE rv = IFD_SUCCESS; int repeat; #ifndef PCSCLITE_STATIC_DRIVER RESPONSECODE(*IO_close_channel) (void) = NULL; RESPONSECODE(*IFDH_close_channel) (DWORD) = NULL; if (rContext->dwVersion == IFD_HVERSION_1_0) IO_close_channel = rContext->psFunctions.psFunctions_v1.pvfCloseChannel; else IFDH_close_channel = rContext->psFunctions.psFunctions_v2.pvfCloseChannel; #endif /* TRY TO LOCK THIS CODE REGION */ repeat = 5; again: rv = SYS_MutexTryLock(rContext->mMutex); if (EBUSY == rv) { Log1(PCSC_LOG_ERROR, "Locking failed"); repeat--; if (repeat) { (void)SYS_USleep(100*1000); /* 100 ms */ goto again; } } #ifndef PCSCLITE_STATIC_DRIVER if (rContext->dwVersion == IFD_HVERSION_1_0) rv = (*IO_close_channel) (); else rv = (*IFDH_close_channel) (rContext->dwSlot); #else if (rContext->dwVersion == IFD_HVERSION_1_0) rv = IO_Close_Channel(); else rv = IFDHCloseChannel(rContext->dwSlot); #endif /* END OF LOCKED REGION */ (void)SYS_MutexUnLock(rContext->mMutex); return rv; }