From c26becf6cbb11db30d5cb7b708da01dcd8a91446 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 26 Apr 2013 17:10:52 -0700 Subject: [PATCH] Added toggle for nonblocking networking; default to threaded for now, since we're seeing lower frame rates. --- interface/src/main.cpp | 81 +++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 7a7b4aa2ca..fa135bbd74 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -39,6 +39,8 @@ #include #endif +#include + #include #include #include @@ -85,6 +87,10 @@ using namespace std; void reshape(int width, int height); // will be defined below void loadViewFrustum(ViewFrustum& viewFrustum); // will be defined below +bool enableNetworkThread = true; +pthread_t networkReceiveThread; +bool stopNetworkReceiveThread = false; + unsigned char incomingPacket[MAX_PACKET_SIZE]; int packetCount = 0; int packetsPerSecond = 0; @@ -416,6 +422,11 @@ void terminate () { audio.terminate(); #endif + if (enableNetworkThread) { + stopNetworkReceiveThread = true; + pthread_join(networkReceiveThread, NULL); + } + exit(EXIT_SUCCESS); } @@ -1474,34 +1485,43 @@ void key(unsigned char k, int x, int y) } // Receive packets from other agents/servers and decide what to do with them! -void networkReceive() +void* networkReceive(void* args) { sockaddr senderAddress; ssize_t bytesReceived; - - while (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { - packetCount++; - bytesCount += bytesReceived; - - switch (incomingPacket[0]) { - case PACKET_HEADER_TRANSMITTER_DATA: - myAvatar.processTransmitterData(incomingPacket, bytesReceived); - break; - case PACKET_HEADER_VOXEL_DATA: - case PACKET_HEADER_Z_COMMAND: - case PACKET_HEADER_ERASE_VOXEL: - voxels.parseData(incomingPacket, bytesReceived); - break; - case PACKET_HEADER_BULK_AVATAR_DATA: - AgentList::getInstance()->processBulkAgentData(&senderAddress, - incomingPacket, - bytesReceived); - break; - default: - AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); - break; + + while (!stopNetworkReceiveThread) { + if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { + packetCount++; + bytesCount += bytesReceived; + + switch (incomingPacket[0]) { + case PACKET_HEADER_TRANSMITTER_DATA: + myAvatar.processTransmitterData(incomingPacket, bytesReceived); + break; + case PACKET_HEADER_VOXEL_DATA: + case PACKET_HEADER_Z_COMMAND: + case PACKET_HEADER_ERASE_VOXEL: + voxels.parseData(incomingPacket, bytesReceived); + break; + case PACKET_HEADER_BULK_AVATAR_DATA: + AgentList::getInstance()->processBulkAgentData(&senderAddress, + incomingPacket, + bytesReceived); + break; + default: + AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived); + break; + } + } else if (!enableNetworkThread) { + break; } } + + if (enableNetworkThread) { + pthread_exit(0); + } + return NULL; } void idle(void) { @@ -1536,7 +1556,9 @@ void idle(void) { updateAvatar(deltaTime); // read incoming packets from network - networkReceive(); + if (!enableNetworkThread) { + networkReceive(0); + } //loop through all the other avatars and simulate them... AgentList* agentList = AgentList::getInstance(); @@ -1680,7 +1702,10 @@ int main(int argc, const char * argv[]) listenPort = atoi(portStr); } AgentList::createInstance(AGENT_TYPE_AVATAR, listenPort); - AgentList::getInstance()->getAgentSocket().setBlocking(false); + enableNetworkThread = !cmdOptionExists(argc, argv, "--nonblocking"); + if (!enableNetworkThread) { + AgentList::getInstance()->getAgentSocket().setBlocking(false); + } gettimeofday(&applicationStartupTime, NULL); const char* domainIP = getCmdOption(argc, argv, "--domain"); @@ -1763,6 +1788,12 @@ int main(int argc, const char * argv[]) printLog("Local Voxel File loaded.\n"); } + // create thread for receipt of data via UDP + if (enableNetworkThread) { + pthread_create(&networkReceiveThread, NULL, networkReceive, NULL); + printLog("Network receive thread created.\n"); + } + glutTimerFunc(1000, Timer, 0); glutMainLoop();