int DebuggerPort_Read( COM_HANDLE ComPortNum, char* Data, size_t size ) { NATIVE_PROFILE_PAL_COM(); int ret = 0; switch(ExtractTransport(ComPortNum)) { case USART_TRANSPORT: ret = USART_Read( ConvertCOM_ComPort( ComPortNum ), Data, size ); break; case USB_TRANSPORT: ret = USB_Read( ConvertCOM_UsbStream( ComPortNum ), Data, size ); break; case SOCKET_TRANSPORT: ret = SOCKETS_Read( ConvertCOM_SockPort(ComPortNum), Data, size ); break; } return ret; }
void *CLIENTS_SOCKETS_Select(void *lpParameter) { fd_set readFDs; char buf[MAX_DATA_SIZE] = { 0 }; PCLIENT_DATA pdata = (PCLIENT_DATA)lpParameter; //TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "CLIENTS_SOCKETS_Select entered. lpParameter address = %x", lpParameter); OSAL_set_event(pdata->threadEvent); for (;;) { if(OSAL_wait_event(pdata->quitEvent, 0) == 0 ){ //event is signaled - this means the thread should be killed... pdata->handleDisconnection(pdata->id, pdata->context); break; } FD_ZERO(&readFDs); FD_SET(pdata->socket, &readFDs); if (select (pdata->socket + 1, &readFDs, (fd_set *) 0, (fd_set *) 0, NULL) == -1) { SOCKETS_RESULT res; OSAL_lock_mutex(pdata->hMutex); if (pdata->socket != 0) { TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_ALERT, "select() failed."); if (pdata->socket != -1) { close(pdata->socket); // TODO - check result } pdata->socket = 0; res = SOCKETS_WSA_ERROR; } else { TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "The client disconnected."); res = SOCKETS_SUCCESS; } OSAL_unlock_mutex(pdata->hMutex); //TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "Calling the disconnection handler."); if (pdata->handleDisconnection != NULL) { pdata->handleDisconnection(pdata->id, pdata->context); } //TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "Exiting the thread."); return (void *)res; // thread function signature conformance } if (FD_ISSET(pdata->socket, &readFDs)) { int rv; // The only thing the main thread can change is the socket int readSock; OSAL_lock_mutex(pdata->hMutex); readSock = pdata->socket; OSAL_unlock_mutex(pdata->hMutex); rv = recv(readSock, buf, MAX_DATA_SIZE, 0); if (rv > 0) { TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "Received data from the server."); SOCKETS_Read(readSock, buf, rv, pdata->handleData, pdata->id, pdata->context); } else { TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "The client disconnected."); OSAL_lock_mutex(pdata->hMutex); if (pdata->socket != 0) { if (pdata->socket != -1) { close(pdata->socket); // TODO - check result } pdata->socket = 0; } OSAL_unlock_mutex(pdata->hMutex); //TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "Calling the disconnection handler."); if (pdata->handleDisconnection != NULL) { pdata->handleDisconnection(pdata->id, pdata-> context); } //TRACE(TR_MOD_CLIENT_SOCKET, TR_SEV_INFO, "Exiting the thread."); return (void *)SOCKETS_SUCCESS; } } } return (void *)SOCKETS_SUCCESS; }