Пример #1
0
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;
}
Пример #2
0
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;
}