From fad3a5957d78b5295a7742bdac42a82fcd52b963 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 4 Dec 2013 17:50:42 -0800 Subject: [PATCH] removing dead code --- .../src/VoxelNodeData.cpp | 281 ------------------ .../src/VoxelPersistThread.cpp | 93 ------ .../src/VoxelPersistThread.h | 49 --- .../src/VoxelSendThread.h | 53 ---- .../voxel-server-library/src/VoxelServer.h | 3 - .../src/VoxelServerPacketProcessor.cpp | 226 -------------- .../src/VoxelServerPacketProcessor.h | 89 ------ 7 files changed, 794 deletions(-) delete mode 100644 libraries/voxel-server-library/src/VoxelNodeData.cpp delete mode 100644 libraries/voxel-server-library/src/VoxelPersistThread.cpp delete mode 100644 libraries/voxel-server-library/src/VoxelPersistThread.h delete mode 100644 libraries/voxel-server-library/src/VoxelSendThread.h delete mode 100644 libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp delete mode 100644 libraries/voxel-server-library/src/VoxelServerPacketProcessor.h diff --git a/libraries/voxel-server-library/src/VoxelNodeData.cpp b/libraries/voxel-server-library/src/VoxelNodeData.cpp deleted file mode 100644 index 2df418c82f..0000000000 --- a/libraries/voxel-server-library/src/VoxelNodeData.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/*** - - -// -// VoxelNodeData.cpp -// hifi -// -// Created by Stephen Birarda on 3/21/13. -// -// - -#include "PacketHeaders.h" -#include "SharedUtil.h" -#include "VoxelNodeData.h" -#include -#include -#include "VoxelSendThread.h" - -VoxelNodeData::VoxelNodeData(Node* owningNode) : - VoxelQuery(owningNode), - _viewSent(false), - _voxelPacketAvailableBytes(MAX_PACKET_SIZE), - _maxSearchLevel(1), - _maxLevelReachedInLastSearch(1), - _lastTimeBagEmpty(0), - _viewFrustumChanging(false), - _viewFrustumJustStoppedChanging(true), - _currentPacketIsColor(true), - _currentPacketIsCompressed(false), - _voxelSendThread(NULL), - _lastClientBoundaryLevelAdjust(0), - _lastClientVoxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE), - _lodChanged(false), - _lodInitialized(false) -{ - _voxelPacket = new unsigned char[MAX_PACKET_SIZE]; - _voxelPacketAt = _voxelPacket; - _lastVoxelPacket = new unsigned char[MAX_PACKET_SIZE]; - _lastVoxelPacketLength = 0; - _duplicatePacketCount = 0; - _sequenceNumber = 0; - resetVoxelPacket(true); // don't bump sequence -} - -void VoxelNodeData::initializeVoxelSendThread(VoxelServer* voxelServer) { - // Create voxel sending thread... - QUuid nodeUUID = getOwningNode()->getUUID(); - _voxelSendThread = new VoxelSendThread(nodeUUID, voxelServer); - _voxelSendThread->initialize(true); -} - -bool VoxelNodeData::packetIsDuplicate() const { - // since our packets now include header information, like sequence number, and createTime, we can't just do a memcmp - // of the entire packet, we need to compare only the packet content... - if (_lastVoxelPacketLength == getPacketLength()) { - return memcmp(_lastVoxelPacket + VOXEL_PACKET_HEADER_SIZE, - _voxelPacket+VOXEL_PACKET_HEADER_SIZE , getPacketLength() - VOXEL_PACKET_HEADER_SIZE) == 0; - } - return false; -} - -bool VoxelNodeData::shouldSuppressDuplicatePacket() { - bool shouldSuppress = false; // assume we won't suppress - - // only consider duplicate packets - if (packetIsDuplicate()) { - _duplicatePacketCount++; - - // If this is the first suppressed packet, remember our time... - if (_duplicatePacketCount == 1) { - _firstSuppressedPacket = usecTimestampNow(); - } - - // How long has it been since we've sent one, if we're still under our max time, then keep considering - // this packet for suppression - uint64_t now = usecTimestampNow(); - long sinceFirstSuppressedPacket = now - _firstSuppressedPacket; - const long MAX_TIME_BETWEEN_DUPLICATE_PACKETS = 1000 * 1000; // 1 second. - - if (sinceFirstSuppressedPacket < MAX_TIME_BETWEEN_DUPLICATE_PACKETS) { - // Finally, if we know we've sent at least one duplicate out, then suppress the rest... - if (_duplicatePacketCount >= 1) { - shouldSuppress = true; - } - } else { - // Reset our count, we've reached our maximum time. - _duplicatePacketCount = 0; - } - } else { - // Reset our count, it wasn't a duplicate - _duplicatePacketCount = 0; - } - return shouldSuppress; -} - -void VoxelNodeData::resetVoxelPacket(bool lastWasSurpressed) { - // Whenever we call this, we will keep a copy of the last packet, so we can determine if the last packet has - // changed since we last reset it. Since we know that no two packets can ever be identical without being the same - // scene information, (e.g. the root node packet of a static scene), we can use this as a strategy for reducing - // packet send rate. - _lastVoxelPacketLength = getPacketLength(); - memcpy(_lastVoxelPacket, _voxelPacket, _lastVoxelPacketLength); - - // If we're moving, and the client asked for low res, then we force monochrome, otherwise, use - // the clients requested color state. - _currentPacketIsColor = getWantColor(); - _currentPacketIsCompressed = getWantCompression(); - VOXEL_PACKET_FLAGS flags = 0; - if (_currentPacketIsColor) { - setAtBit(flags,PACKET_IS_COLOR_BIT); - } - if (_currentPacketIsCompressed) { - setAtBit(flags,PACKET_IS_COMPRESSED_BIT); - } - - _voxelPacketAvailableBytes = MAX_PACKET_SIZE; - int numBytesPacketHeader = populateTypeAndVersion(_voxelPacket, PACKET_TYPE_VOXEL_DATA); - _voxelPacketAt = _voxelPacket + numBytesPacketHeader; - _voxelPacketAvailableBytes -= numBytesPacketHeader; - - // pack in flags - VOXEL_PACKET_FLAGS* flagsAt = (VOXEL_PACKET_FLAGS*)_voxelPacketAt; - *flagsAt = flags; - _voxelPacketAt += sizeof(VOXEL_PACKET_FLAGS); - _voxelPacketAvailableBytes -= sizeof(VOXEL_PACKET_FLAGS); - - // pack in sequence number - VOXEL_PACKET_SEQUENCE* sequenceAt = (VOXEL_PACKET_SEQUENCE*)_voxelPacketAt; - *sequenceAt = _sequenceNumber; - _voxelPacketAt += sizeof(VOXEL_PACKET_SEQUENCE); - _voxelPacketAvailableBytes -= sizeof(VOXEL_PACKET_SEQUENCE); - if (!(lastWasSurpressed || _lastVoxelPacketLength == VOXEL_PACKET_HEADER_SIZE)) { - _sequenceNumber++; - } - - // pack in timestamp - VOXEL_PACKET_SENT_TIME now = usecTimestampNow(); - VOXEL_PACKET_SENT_TIME* timeAt = (VOXEL_PACKET_SENT_TIME*)_voxelPacketAt; - *timeAt = now; - _voxelPacketAt += sizeof(VOXEL_PACKET_SENT_TIME); - _voxelPacketAvailableBytes -= sizeof(VOXEL_PACKET_SENT_TIME); - - _voxelPacketWaiting = false; -} - -void VoxelNodeData::writeToPacket(const unsigned char* buffer, int bytes) { - // compressed packets include lead bytes which contain compressed size, this allows packing of - // multiple compressed portions together - if (_currentPacketIsCompressed) { - *(VOXEL_PACKET_INTERNAL_SECTION_SIZE*)_voxelPacketAt = bytes; - _voxelPacketAt += sizeof(VOXEL_PACKET_INTERNAL_SECTION_SIZE); - _voxelPacketAvailableBytes -= sizeof(VOXEL_PACKET_INTERNAL_SECTION_SIZE); - } - if (bytes <= _voxelPacketAvailableBytes) { - memcpy(_voxelPacketAt, buffer, bytes); - _voxelPacketAvailableBytes -= bytes; - _voxelPacketAt += bytes; - _voxelPacketWaiting = true; - } -} - -VoxelNodeData::~VoxelNodeData() { - delete[] _voxelPacket; - delete[] _lastVoxelPacket; - - if (_voxelSendThread) { - _voxelSendThread->terminate(); - delete _voxelSendThread; - } -} - -bool VoxelNodeData::updateCurrentViewFrustum() { - bool currentViewFrustumChanged = false; - ViewFrustum newestViewFrustum; - // get position and orientation details from the camera - newestViewFrustum.setPosition(getCameraPosition()); - newestViewFrustum.setOrientation(getCameraOrientation()); - - // Also make sure it's got the correct lens details from the camera - float originalFOV = getCameraFov(); - float wideFOV = originalFOV + VIEW_FRUSTUM_FOV_OVERSEND; - - newestViewFrustum.setFieldOfView(wideFOV); // hack - newestViewFrustum.setAspectRatio(getCameraAspectRatio()); - newestViewFrustum.setNearClip(getCameraNearClip()); - newestViewFrustum.setFarClip(getCameraFarClip()); - newestViewFrustum.setEyeOffsetPosition(getCameraEyeOffsetPosition()); - - // if there has been a change, then recalculate - if (!newestViewFrustum.isVerySimilar(_currentViewFrustum)) { - _currentViewFrustum = newestViewFrustum; - _currentViewFrustum.calculate(); - currentViewFrustumChanged = true; - } - - // Also check for LOD changes from the client - if (_lodInitialized) { - if (_lastClientBoundaryLevelAdjust != getBoundaryLevelAdjust()) { - _lastClientBoundaryLevelAdjust = getBoundaryLevelAdjust(); - _lodChanged = true; - } - if (_lastClientVoxelSizeScale != getOctreeSizeScale()) { - _lastClientVoxelSizeScale = getOctreeSizeScale(); - _lodChanged = true; - } - } else { - _lodInitialized = true; - _lastClientVoxelSizeScale = getOctreeSizeScale(); - _lastClientBoundaryLevelAdjust = getBoundaryLevelAdjust(); - _lodChanged = false; - } - - // When we first detect that the view stopped changing, we record this. - // but we don't change it back to false until we've completely sent this - // scene. - if (_viewFrustumChanging && !currentViewFrustumChanged) { - _viewFrustumJustStoppedChanging = true; - } - _viewFrustumChanging = currentViewFrustumChanged; - return currentViewFrustumChanged; -} - -void VoxelNodeData::setViewSent(bool viewSent) { - _viewSent = viewSent; - if (viewSent) { - _viewFrustumJustStoppedChanging = false; - _lodChanged = false; - } -} - -void VoxelNodeData::updateLastKnownViewFrustum() { - bool frustumChanges = !_lastKnownViewFrustum.isVerySimilar(_currentViewFrustum); - - if (frustumChanges) { - // save our currentViewFrustum into our lastKnownViewFrustum - _lastKnownViewFrustum = _currentViewFrustum; - } - - // save that we know the view has been sent. - uint64_t now = usecTimestampNow(); - setLastTimeBagEmpty(now); // is this what we want? poor names -} - - -bool VoxelNodeData::moveShouldDump() const { - glm::vec3 oldPosition = _lastKnownViewFrustum.getPosition(); - glm::vec3 newPosition = _currentViewFrustum.getPosition(); - - // theoretically we could make this slightly larger but relative to avatar scale. - const float MAXIMUM_MOVE_WITHOUT_DUMP = 0.0f; - if (glm::distance(newPosition, oldPosition) > MAXIMUM_MOVE_WITHOUT_DUMP) { - return true; - } - return false; -} - -void VoxelNodeData::dumpOutOfView() { - int stillInView = 0; - int outOfView = 0; - OctreeElementBag tempBag; - while (!nodeBag.isEmpty()) { - OctreeElement* node = nodeBag.extract(); - if (node->isInView(_currentViewFrustum)) { - tempBag.insert(node); - stillInView++; - } else { - outOfView++; - } - } - if (stillInView > 0) { - while (!tempBag.isEmpty()) { - OctreeElement* node = tempBag.extract(); - if (node->isInView(_currentViewFrustum)) { - nodeBag.insert(node); - } - } - } -} - - -**/ diff --git a/libraries/voxel-server-library/src/VoxelPersistThread.cpp b/libraries/voxel-server-library/src/VoxelPersistThread.cpp deleted file mode 100644 index 13176857a1..0000000000 --- a/libraries/voxel-server-library/src/VoxelPersistThread.cpp +++ /dev/null @@ -1,93 +0,0 @@ - -/***** - -// -// VoxelPersistThread.cpp -// voxel-server -// -// Created by Brad Hefta-Gaub on 8/21/13 -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// Threaded or non-threaded voxel persistence -// - -#include -#include -#include -#include - -#include "VoxelPersistThread.h" -#include "VoxelServer.h" - -VoxelPersistThread::VoxelPersistThread(VoxelTree* tree, const char* filename, int persistInterval) : - _tree(tree), - _filename(filename), - _persistInterval(persistInterval), - _initialLoadComplete(false), - _loadTimeUSecs(0) { -} - -bool VoxelPersistThread::process() { - - if (!_initialLoadComplete) { - uint64_t loadStarted = usecTimestampNow(); - qDebug("loading voxels from file: %s...\n", _filename); - - bool persistantFileRead; - - _tree->lockForWrite(); - { - PerformanceWarning warn(true, "Loading Voxel File", true); - persistantFileRead = _tree->readFromSVOFile(_filename); - } - _tree->unlock(); - - _loadCompleted = time(0); - uint64_t loadDone = usecTimestampNow(); - _loadTimeUSecs = loadDone - loadStarted; - - _tree->clearDirtyBit(); // the tree is clean since we just loaded it - qDebug("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead)); - - unsigned long nodeCount = OctreeElement::getNodeCount(); - unsigned long internalNodeCount = OctreeElement::getInternalNodeCount(); - unsigned long leafNodeCount = OctreeElement::getLeafNodeCount(); - qDebug("Nodes after loading scene %lu nodes %lu internal %lu leaves\n", nodeCount, internalNodeCount, leafNodeCount); - - double usecPerGet = (double)OctreeElement::getGetChildAtIndexTime() / (double)OctreeElement::getGetChildAtIndexCalls(); - qDebug("getChildAtIndexCalls=%llu getChildAtIndexTime=%llu perGet=%lf \n", - OctreeElement::getGetChildAtIndexTime(), OctreeElement::getGetChildAtIndexCalls(), usecPerGet); - - double usecPerSet = (double)OctreeElement::getSetChildAtIndexTime() / (double)OctreeElement::getSetChildAtIndexCalls(); - qDebug("setChildAtIndexCalls=%llu setChildAtIndexTime=%llu perSet=%lf\n", - OctreeElement::getSetChildAtIndexTime(), OctreeElement::getSetChildAtIndexCalls(), usecPerSet); - - _initialLoadComplete = true; - _lastCheck = usecTimestampNow(); // we just loaded, no need to save again - } - - if (isStillRunning()) { - uint64_t MSECS_TO_USECS = 1000; - uint64_t USECS_TO_SLEEP = 100 * MSECS_TO_USECS; // every 100ms - usleep(USECS_TO_SLEEP); - uint64_t now = usecTimestampNow(); - uint64_t sinceLastSave = now - _lastCheck; - uint64_t intervalToCheck = _persistInterval * MSECS_TO_USECS; - - if (sinceLastSave > intervalToCheck) { - // check the dirty bit and persist here... - _lastCheck = usecTimestampNow(); - if (_tree->isDirty()) { - qDebug("saving voxels to file %s...\n",_filename); - _tree->writeToSVOFile(_filename); - _tree->clearDirtyBit(); // tree is clean after saving - qDebug("DONE saving voxels to file...\n"); - } - } - } - return isStillRunning(); // keep running till they terminate us -} - - - -****/ \ No newline at end of file diff --git a/libraries/voxel-server-library/src/VoxelPersistThread.h b/libraries/voxel-server-library/src/VoxelPersistThread.h deleted file mode 100644 index 68d0efa86d..0000000000 --- a/libraries/voxel-server-library/src/VoxelPersistThread.h +++ /dev/null @@ -1,49 +0,0 @@ -/**** - -// -// VoxelPersistThread.h -// voxel-server -// -// Created by Brad Hefta-Gaub on 8/21/13 -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// Threaded or non-threaded voxel persistence -// - -#ifndef __voxel_server__VoxelPersistThread__ -#define __voxel_server__VoxelPersistThread__ - -#include -#include -#include - -/// Generalized threaded processor for handling received inbound packets. -class VoxelPersistThread : public virtual GenericThread { -public: - static const int DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 seconds - - VoxelPersistThread(VoxelTree* tree, const char* filename, int persistInterval = DEFAULT_PERSIST_INTERVAL); - - bool isInitialLoadComplete() const { return _initialLoadComplete; } - - time_t* getLoadCompleted() { return &_loadCompleted; } - uint64_t getLoadElapsedTime() const { return _loadTimeUSecs; } - -protected: - /// Implements generic processing behavior for this thread. - virtual bool process(); -private: - VoxelTree* _tree; - const char* _filename; - int _persistInterval; - bool _initialLoadComplete; - - time_t _loadCompleted; - uint64_t _loadTimeUSecs; - uint64_t _lastCheck; -}; - -#endif // __voxel_server__VoxelPersistThread__ - - -***/ \ No newline at end of file diff --git a/libraries/voxel-server-library/src/VoxelSendThread.h b/libraries/voxel-server-library/src/VoxelSendThread.h deleted file mode 100644 index 797eb142fa..0000000000 --- a/libraries/voxel-server-library/src/VoxelSendThread.h +++ /dev/null @@ -1,53 +0,0 @@ -/**** - -// -// VoxelSendThread.h -// voxel-server -// -// Created by Brad Hefta-Gaub on 8/21/13 -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// Threaded or non-threaded object for sending voxels to a client -// - -#ifndef __voxel_server__VoxelSendThread__ -#define __voxel_server__VoxelSendThread__ - -#include -#include -#include -#include -#include "VoxelNodeData.h" -#include "VoxelServer.h" - -/// Threaded processor for sending voxel packets to a single client -class VoxelSendThread : public virtual GenericThread { -public: - VoxelSendThread(const QUuid& nodeUUID, VoxelServer* myServer); - - static uint64_t _totalBytes; - static uint64_t _totalWastedBytes; - static uint64_t _totalPackets; - - static uint64_t _usleepTime; - static uint64_t _usleepCalls; - -protected: - /// Implements generic processing behavior for this thread. - virtual bool process(); - -private: - QUuid _nodeUUID; - VoxelServer* _myServer; - - int handlePacketSend(Node* node, VoxelNodeData* nodeData, int& trueBytesSent, int& truePacketsSent); - int deepestLevelVoxelDistributor(Node* node, VoxelNodeData* nodeData, bool viewFrustumChanged); - - unsigned char _tempOutputBuffer[MAX_VOXEL_PACKET_SIZE]; // used by environment sending code - VoxelPacketData _packetData; -}; - -#endif // __voxel_server__VoxelSendThread__ - - -****/ \ No newline at end of file diff --git a/libraries/voxel-server-library/src/VoxelServer.h b/libraries/voxel-server-library/src/VoxelServer.h index a456d3c38f..3c20cf6d9a 100644 --- a/libraries/voxel-server-library/src/VoxelServer.h +++ b/libraries/voxel-server-library/src/VoxelServer.h @@ -21,10 +21,7 @@ #include "civetweb.h" -#include "VoxelPersistThread.h" -#include "VoxelSendThread.h" #include "VoxelServerConsts.h" -#include "VoxelServerPacketProcessor.h" /// Handles assignments of type VoxelServer - sending voxels to various clients. class VoxelServer : public OctreeServer { diff --git a/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp b/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp deleted file mode 100644 index ac303d3c89..0000000000 --- a/libraries/voxel-server-library/src/VoxelServerPacketProcessor.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/****** - -// -// VoxelServerPacketProcessor.cpp -// voxel-server -// -// Created by Brad Hefta-Gaub on 8/21/13 -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// Threaded or non-threaded network packet processor for the voxel-server -// - -#include -#include - -#include "VoxelServer.h" -#include "VoxelServerConsts.h" -#include "VoxelServerPacketProcessor.h" - -static QUuid DEFAULT_NODE_ID_REF; - -VoxelServerPacketProcessor::VoxelServerPacketProcessor(VoxelServer* myServer) : - _myServer(myServer), - _receivedPacketCount(0), - _totalTransitTime(0), - _totalProcessTime(0), - _totalLockWaitTime(0), - _totalVoxelsInPacket(0), - _totalPackets(0) -{ -} - -void VoxelServerPacketProcessor::resetStats() { - _totalTransitTime = 0; - _totalProcessTime = 0; - _totalLockWaitTime = 0; - _totalVoxelsInPacket = 0; - _totalPackets = 0; - - _singleSenderStats.clear(); -} - - -void VoxelServerPacketProcessor::processPacket(const HifiSockAddr& senderSockAddr, - unsigned char* packetData, ssize_t packetLength) { - - bool debugProcessPacket = _myServer->wantsVerboseDebug(); - - if (debugProcessPacket) { - printf("VoxelServerPacketProcessor::processPacket() packetData=%p packetLength=%ld\n", packetData, packetLength); - } - - int numBytesPacketHeader = numBytesForPacketHeader(packetData); - - if (packetData[0] == PACKET_TYPE_SET_VOXEL || packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE) { - bool destructive = (packetData[0] == PACKET_TYPE_SET_VOXEL_DESTRUCTIVE); - PerformanceWarning warn(_myServer->wantShowAnimationDebug(), - destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", - _myServer->wantShowAnimationDebug()); - - _receivedPacketCount++; - - unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); - uint64_t sentAt = (*((uint64_t*)(packetData + numBytesPacketHeader + sizeof(sequence)))); - uint64_t arrivedAt = usecTimestampNow(); - uint64_t transitTime = arrivedAt - sentAt; - int voxelsInPacket = 0; - uint64_t processTime = 0; - uint64_t lockWaitTime = 0; - - if (_myServer->wantShowAnimationDebug() || _myServer->wantsDebugVoxelReceiving()) { - printf("PROCESSING THREAD: got %s - %d command from client receivedBytes=%ld sequence=%d transitTime=%llu usecs\n", - destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", - _receivedPacketCount, packetLength, sequence, transitTime); - } - int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); - unsigned char* voxelData = (unsigned char*)&packetData[atByte]; - while (atByte < packetLength) { - int maxSize = packetLength - atByte; - - if (debugProcessPacket) { - printf("VoxelServerPacketProcessor::processPacket() %s packetData=%p packetLength=%ld voxelData=%p atByte=%d maxSize=%d\n", - destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", - packetData, packetLength, voxelData, atByte, maxSize); - } - - int octets = numberOfThreeBitSectionsInCode(voxelData, maxSize); - - if (octets == OVERFLOWED_OCTCODE_BUFFER) { - printf("WARNING! Got voxel edit record that would overflow buffer in numberOfThreeBitSectionsInCode(), "); - printf("bailing processing of packet!\n"); - break; - } - - const int COLOR_SIZE_IN_BYTES = 3; - int voxelDataSize = bytesRequiredForCodeLength(octets) + COLOR_SIZE_IN_BYTES; - int voxelCodeSize = bytesRequiredForCodeLength(octets); - - if (atByte + voxelDataSize <= packetLength) { - if (_myServer->wantShowAnimationDebug()) { - int red = voxelData[voxelCodeSize + RED_INDEX]; - int green = voxelData[voxelCodeSize + GREEN_INDEX]; - int blue = voxelData[voxelCodeSize + BLUE_INDEX]; - - float* vertices = firstVertexForCode(voxelData); - printf("inserting voxel: %f,%f,%f r=%d,g=%d,b=%d\n", vertices[0], vertices[1], vertices[2], red, green, blue); - delete[] vertices; - } - - uint64_t startLock = usecTimestampNow(); - _myServer->getServerTree().lockForWrite(); - uint64_t startProcess = usecTimestampNow(); - _myServer->getServerTree().readCodeColorBufferToTree(voxelData, destructive); - _myServer->getServerTree().unlock(); - uint64_t endProcess = usecTimestampNow(); - - voxelsInPacket++; - - uint64_t thisProcessTime = endProcess - startProcess; - uint64_t thisLockWaitTime = startProcess - startLock; - - processTime += thisProcessTime; - lockWaitTime += thisLockWaitTime; - - // skip to next voxel edit record in the packet - voxelData += voxelDataSize; - atByte += voxelDataSize; - } else { - printf("WARNING! Got voxel edit record that would overflow buffer, bailing processing of packet!\n"); - break; - } - } - - if (debugProcessPacket) { - printf("VoxelServerPacketProcessor::processPacket() DONE LOOPING FOR %s packetData=%p packetLength=%ld voxelData=%p atByte=%d\n", - destructive ? "PACKET_TYPE_SET_VOXEL_DESTRUCTIVE" : "PACKET_TYPE_SET_VOXEL", - packetData, packetLength, voxelData, atByte); - } - - // Make sure our Node and NodeList knows we've heard from this node. - Node* senderNode = NodeList::getInstance()->nodeWithAddress(senderSockAddr); - QUuid& nodeUUID = DEFAULT_NODE_ID_REF; - if (senderNode) { - senderNode->setLastHeardMicrostamp(usecTimestampNow()); - nodeUUID = senderNode->getUUID(); - if (debugProcessPacket) { - qDebug() << "sender has uuid=" << nodeUUID << "\n"; - } - } else { - if (debugProcessPacket) { - qDebug() << "sender has no known nodeUUID.\n"; - } - } - trackInboundPackets(nodeUUID, sequence, transitTime, voxelsInPacket, processTime, lockWaitTime); - - } else if (packetData[0] == PACKET_TYPE_ERASE_VOXEL) { - - _receivedPacketCount++; - - unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); - uint64_t sentAt = (*((uint64_t*)(packetData + numBytesPacketHeader + sizeof(sequence)))); - uint64_t arrivedAt = usecTimestampNow(); - uint64_t transitTime = arrivedAt - sentAt; - - if (_myServer->wantShowAnimationDebug() || _myServer->wantsDebugVoxelReceiving()) { - printf("PROCESSING THREAD: got PACKET_TYPE_ERASE_VOXEL - %d command from client receivedBytes=%ld sequence=%d transitTime=%llu usecs\n", - _receivedPacketCount, packetLength, sequence, transitTime); - } - - // Send these bits off to the VoxelTree class to process them - _myServer->getServerTree().lockForWrite(); - _myServer->getServerTree().processRemoveOctreeElementsBitstream((unsigned char*)packetData, packetLength); - _myServer->getServerTree().unlock(); - - // Make sure our Node and NodeList knows we've heard from this node. - Node* node = NodeList::getInstance()->nodeWithAddress(senderSockAddr); - if (node) { - node->setLastHeardMicrostamp(usecTimestampNow()); - } - } else { - printf("unknown packet ignored... packetData[0]=%c\n", packetData[0]); - } -} - -void VoxelServerPacketProcessor::trackInboundPackets(const QUuid& nodeUUID, int sequence, uint64_t transitTime, - int voxelsInPacket, uint64_t processTime, uint64_t lockWaitTime) { - - _totalTransitTime += transitTime; - _totalProcessTime += processTime; - _totalLockWaitTime += lockWaitTime; - _totalVoxelsInPacket += voxelsInPacket; - _totalPackets++; - - // find the individual senders stats and track them there too... - // see if this is the first we've heard of this node... - if (_singleSenderStats.find(nodeUUID) == _singleSenderStats.end()) { - SingleSenderStats stats; - - stats._totalTransitTime += transitTime; - stats._totalProcessTime += processTime; - stats._totalLockWaitTime += lockWaitTime; - stats._totalVoxelsInPacket += voxelsInPacket; - stats._totalPackets++; - - _singleSenderStats[nodeUUID] = stats; - } else { - SingleSenderStats& stats = _singleSenderStats[nodeUUID]; - stats._totalTransitTime += transitTime; - stats._totalProcessTime += processTime; - stats._totalLockWaitTime += lockWaitTime; - stats._totalVoxelsInPacket += voxelsInPacket; - stats._totalPackets++; - } -} - - -SingleSenderStats::SingleSenderStats() { - _totalTransitTime = 0; - _totalProcessTime = 0; - _totalLockWaitTime = 0; - _totalVoxelsInPacket = 0; - _totalPackets = 0; -} - - -****/ \ No newline at end of file diff --git a/libraries/voxel-server-library/src/VoxelServerPacketProcessor.h b/libraries/voxel-server-library/src/VoxelServerPacketProcessor.h deleted file mode 100644 index 7249fff4ca..0000000000 --- a/libraries/voxel-server-library/src/VoxelServerPacketProcessor.h +++ /dev/null @@ -1,89 +0,0 @@ -/****** - - -// -// VoxelServerPacketProcessor.h -// voxel-server -// -// Created by Brad Hefta-Gaub on 8/21/13 -// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// -// Threaded or non-threaded network packet processor for the voxel-server -// - -#ifndef __voxel_server__VoxelServerPacketProcessor__ -#define __voxel_server__VoxelServerPacketProcessor__ - -#include - -#include -class VoxelServer; - -class SingleSenderStats { -public: - SingleSenderStats(); - - uint64_t getAverageTransitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalTransitTime / _totalPackets; } - uint64_t getAverageProcessTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalProcessTime / _totalPackets; } - uint64_t getAverageLockWaitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalLockWaitTime / _totalPackets; } - uint64_t getTotalVoxelsProcessed() const { return _totalVoxelsInPacket; } - uint64_t getTotalPacketsProcessed() const { return _totalPackets; } - uint64_t getAverageProcessTimePerVoxel() const - { return _totalVoxelsInPacket == 0 ? 0 : _totalProcessTime / _totalVoxelsInPacket; } - uint64_t getAverageLockWaitTimePerVoxel() const - { return _totalVoxelsInPacket == 0 ? 0 : _totalLockWaitTime / _totalVoxelsInPacket; } - - uint64_t _totalTransitTime; - uint64_t _totalProcessTime; - uint64_t _totalLockWaitTime; - uint64_t _totalVoxelsInPacket; - uint64_t _totalPackets; -}; - -typedef std::map NodeToSenderStatsMap; -typedef std::map::iterator NodeToSenderStatsMapIterator; - - -/// Handles processing of incoming network packets for the voxel-server. As with other ReceivedPacketProcessor classes -/// the user is responsible for reading inbound packets and adding them to the processing queue by calling queueReceivedPacket() -class VoxelServerPacketProcessor : public ReceivedPacketProcessor { - -public: - VoxelServerPacketProcessor(VoxelServer* myServer); - - uint64_t getAverageTransitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalTransitTime / _totalPackets; } - uint64_t getAverageProcessTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalProcessTime / _totalPackets; } - uint64_t getAverageLockWaitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalLockWaitTime / _totalPackets; } - uint64_t getTotalVoxelsProcessed() const { return _totalVoxelsInPacket; } - uint64_t getTotalPacketsProcessed() const { return _totalPackets; } - uint64_t getAverageProcessTimePerVoxel() const - { return _totalVoxelsInPacket == 0 ? 0 : _totalProcessTime / _totalVoxelsInPacket; } - uint64_t getAverageLockWaitTimePerVoxel() const - { return _totalVoxelsInPacket == 0 ? 0 : _totalLockWaitTime / _totalVoxelsInPacket; } - - void resetStats(); - - NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; } - -protected: - virtual void processPacket(const HifiSockAddr& senderSockAddr, unsigned char* packetData, ssize_t packetLength); - -private: - void trackInboundPackets(const QUuid& nodeUUID, int sequence, uint64_t transitTime, - int voxelsInPacket, uint64_t processTime, uint64_t lockWaitTime); - - VoxelServer* _myServer; - int _receivedPacketCount; - - uint64_t _totalTransitTime; - uint64_t _totalProcessTime; - uint64_t _totalLockWaitTime; - uint64_t _totalVoxelsInPacket; - uint64_t _totalPackets; - - NodeToSenderStatsMap _singleSenderStats; -}; -#endif // __voxel_server__VoxelServerPacketProcessor__ - - -***/