LPCUSBSIO_API int32_t I2C_Close(LPC_HANDLE handle) { LPCUSBSIO_I2C_Ctrl_t *dev = (LPCUSBSIO_I2C_Ctrl_t *) handle; uint8_t inPacket[HID_I2C_PACKET_SZ + 1]; if (validHandle(handle) == 0) { return LPCUSBSIO_ERR_BAD_HANDLE; } I2C_SendRequest(dev, HID_I2C_REQ_DEINIT_PORT, NULL, 0, inPacket, sizeof(inPacket)); /*Shutdown reader thread*/ dev->thread_exit = 0x01; /*Close remote dev handle : all pending request are canceled*/ hid_close(dev->hidDev); /*Wait End of reader thread & clean up*/ framework_JoinThread(dev->ResponsethreadHandle); framework_DeleteThread(dev->ResponsethreadHandle); dev->ResponsethreadHandle = NULL; /*redaer thread is not running so we notify all pending request*/ I2C_CancelAllRequest(handle); g_Ctrl.devInfoList = NULL; ReleaseNotifier(dev); framework_DeleteMutex(dev->NotifierContainerLock); dev->NotifierContainerLock = NULL; framework_LockMutex(dev->RequestMapLock); map_destroy(dev->request_map); dev->request_map = NULL; framework_UnlockMutex(dev->RequestMapLock); framework_DeleteMutex(dev->RequestMapLock); dev->RequestMapLock = NULL; framework_DeleteMutex(dev->SendLock); dev->SendLock = NULL; freeDevice(dev); return LPCUSBSIO_OK; }
eResult framework_CreateThread(void** threadHandle, void * (* threadedFunc)(void *) , void * ctx) { tLinuxThread_t *linuxThread = (tLinuxThread_t *)framework_AllocMem(sizeof(tLinuxThread_t)); linuxThread->ctx = ctx; linuxThread->threadedFunc = threadedFunc; framework_CreateMutex(&(linuxThread->mutexCanDelete)); if (pthread_create(&(linuxThread->thread), NULL, thread_object_func, linuxThread)) { printf("Cannot create Thread\n"); framework_DeleteMutex(linuxThread->mutexCanDelete); framework_FreeMem(linuxThread); return FRAMEWORK_FAILED; } pthread_detach(linuxThread->thread); *threadHandle = linuxThread; return FRAMEWORK_SUCCESS; }
void ReleaseNotifier(LPCUSBSIO_I2C_Ctrl_t * dev) { void* Notifier = NULL; if(NULL != dev) { framework_LockMutex(dev->NotifierContainerLock); if(NULL != dev->NotifierContainer) { do { container_remove(dev->NotifierContainer, 0x00, &Notifier); if(NULL != Notifier) { framework_DeleteMutex(Notifier); Notifier = NULL; } }while(NULL != Notifier); container_delete(dev->NotifierContainer); dev->NotifierContainer = NULL; } framework_UnlockMutex(dev->NotifierContainerLock); } }
void framework_DeleteThread(void * threadHandle) { tLinuxThread_t *linuxThread = (tLinuxThread_t*)threadHandle; framework_DeleteMutex(linuxThread->mutexCanDelete); framework_FreeMem(linuxThread); }