From 5af52df55823cf3332895bad6e62000098ce9b10 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 27 Oct 2014 12:11:07 -0700 Subject: [PATCH 1/4] Put some debugging in to track down a streaming crash. --- assignment-client/src/metavoxels/MetavoxelServer.cpp | 5 +++++ libraries/metavoxels/src/MetavoxelClientManager.cpp | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/metavoxels/MetavoxelServer.cpp b/assignment-client/src/metavoxels/MetavoxelServer.cpp index 81e86dbf11..43fd5f5c16 100644 --- a/assignment-client/src/metavoxels/MetavoxelServer.cpp +++ b/assignment-client/src/metavoxels/MetavoxelServer.cpp @@ -223,7 +223,11 @@ void MetavoxelSession::update() { _sender->getData().writeDelta(sendRecord->getData(), sendRecord->getLOD(), out, _lod); out.flush(); int end = _sequencer.getOutputStream().getUnderlying().device()->pos(); + QDebug debug = qDebug() << "from" << sendRecord->getLOD().position.x << sendRecord->getLOD().position.y << sendRecord->getLOD().position.z << "to" << + _lod.position.x << _lod.position.y << _lod.position.z << _lodPacketNumber << (_sequencer.getOutgoingPacketNumber() + 1); if (end > _sequencer.getMaxPacketSize()) { + debug << "reliable" << (_reliableDeltaID + 1); + // we need to send the delta on the reliable channel _reliableDeltaChannel = _sequencer.getReliableOutputChannel(RELIABLE_DELTA_CHANNEL_INDEX); _reliableDeltaChannel->startMessage(); @@ -242,6 +246,7 @@ void MetavoxelSession::update() { _sequencer.endPacket(); } else { + debug << "unreliable"; _sequencer.endPacket(); } diff --git a/libraries/metavoxels/src/MetavoxelClientManager.cpp b/libraries/metavoxels/src/MetavoxelClientManager.cpp index cc5d7ef29d..af83fdc869 100644 --- a/libraries/metavoxels/src/MetavoxelClientManager.cpp +++ b/libraries/metavoxels/src/MetavoxelClientManager.cpp @@ -297,7 +297,10 @@ void MetavoxelClient::writeUpdateMessage(Bitstream& out) { void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) { int userType = message.userType(); if (userType == MetavoxelDeltaMessage::Type) { - if (_reliableDeltaChannel) { + if (_reliableDeltaChannel) { + qDebug() << "from" << _remoteDataLOD.position.x << _remoteDataLOD.position.y << _remoteDataLOD.position.z << + "to" << _reliableDeltaLOD.position.x << _reliableDeltaLOD.position.y << _reliableDeltaLOD.position.z << + _sequencer.getIncomingPacketNumber() << "reliable" << _reliableDeltaID; MetavoxelData reference = _remoteData; MetavoxelLOD referenceLOD = _remoteDataLOD; _remoteData.readDelta(reference, referenceLOD, in, _remoteDataLOD = _reliableDeltaLOD); @@ -307,6 +310,9 @@ void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) { } else { PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord(); + qDebug() << "from" << receiveRecord->getLOD().position.x << receiveRecord->getLOD().position.y << receiveRecord->getLOD().position.z << + "to" << getLastAcknowledgedSendRecord()->getLOD().position.x << getLastAcknowledgedSendRecord()->getLOD().position.y << getLastAcknowledgedSendRecord()->getLOD().position.z << + _sequencer.getIncomingPacketNumber() << "unreliable"; _remoteData.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, _remoteDataLOD = getLastAcknowledgedSendRecord()->getLOD()); in.reset(); From 15f8b3006b30146f0802f0fa3843957a46134649 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 27 Oct 2014 14:45:34 -0700 Subject: [PATCH 2/4] Remove debugging, fix streaming bug. --- assignment-client/src/metavoxels/MetavoxelServer.cpp | 5 ----- libraries/metavoxels/src/MetavoxelClientManager.cpp | 8 +------- libraries/metavoxels/src/MetavoxelData.cpp | 3 +++ 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/metavoxels/MetavoxelServer.cpp b/assignment-client/src/metavoxels/MetavoxelServer.cpp index 43fd5f5c16..81e86dbf11 100644 --- a/assignment-client/src/metavoxels/MetavoxelServer.cpp +++ b/assignment-client/src/metavoxels/MetavoxelServer.cpp @@ -223,11 +223,7 @@ void MetavoxelSession::update() { _sender->getData().writeDelta(sendRecord->getData(), sendRecord->getLOD(), out, _lod); out.flush(); int end = _sequencer.getOutputStream().getUnderlying().device()->pos(); - QDebug debug = qDebug() << "from" << sendRecord->getLOD().position.x << sendRecord->getLOD().position.y << sendRecord->getLOD().position.z << "to" << - _lod.position.x << _lod.position.y << _lod.position.z << _lodPacketNumber << (_sequencer.getOutgoingPacketNumber() + 1); if (end > _sequencer.getMaxPacketSize()) { - debug << "reliable" << (_reliableDeltaID + 1); - // we need to send the delta on the reliable channel _reliableDeltaChannel = _sequencer.getReliableOutputChannel(RELIABLE_DELTA_CHANNEL_INDEX); _reliableDeltaChannel->startMessage(); @@ -246,7 +242,6 @@ void MetavoxelSession::update() { _sequencer.endPacket(); } else { - debug << "unreliable"; _sequencer.endPacket(); } diff --git a/libraries/metavoxels/src/MetavoxelClientManager.cpp b/libraries/metavoxels/src/MetavoxelClientManager.cpp index af83fdc869..cc5d7ef29d 100644 --- a/libraries/metavoxels/src/MetavoxelClientManager.cpp +++ b/libraries/metavoxels/src/MetavoxelClientManager.cpp @@ -297,10 +297,7 @@ void MetavoxelClient::writeUpdateMessage(Bitstream& out) { void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) { int userType = message.userType(); if (userType == MetavoxelDeltaMessage::Type) { - if (_reliableDeltaChannel) { - qDebug() << "from" << _remoteDataLOD.position.x << _remoteDataLOD.position.y << _remoteDataLOD.position.z << - "to" << _reliableDeltaLOD.position.x << _reliableDeltaLOD.position.y << _reliableDeltaLOD.position.z << - _sequencer.getIncomingPacketNumber() << "reliable" << _reliableDeltaID; + if (_reliableDeltaChannel) { MetavoxelData reference = _remoteData; MetavoxelLOD referenceLOD = _remoteDataLOD; _remoteData.readDelta(reference, referenceLOD, in, _remoteDataLOD = _reliableDeltaLOD); @@ -310,9 +307,6 @@ void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) { } else { PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord(); - qDebug() << "from" << receiveRecord->getLOD().position.x << receiveRecord->getLOD().position.y << receiveRecord->getLOD().position.z << - "to" << getLastAcknowledgedSendRecord()->getLOD().position.x << getLastAcknowledgedSendRecord()->getLOD().position.y << getLastAcknowledgedSendRecord()->getLOD().position.z << - _sequencer.getIncomingPacketNumber() << "unreliable"; _remoteData.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, _remoteDataLOD = getLastAcknowledgedSendRecord()->getLOD()); in.reset(); diff --git a/libraries/metavoxels/src/MetavoxelData.cpp b/libraries/metavoxels/src/MetavoxelData.cpp index 2bd28de784..2f43f8f4ae 100644 --- a/libraries/metavoxels/src/MetavoxelData.cpp +++ b/libraries/metavoxels/src/MetavoxelData.cpp @@ -1040,6 +1040,9 @@ MetavoxelNode* MetavoxelNode::readSubdivision(MetavoxelStreamState& state) { } void MetavoxelNode::writeSubdivision(MetavoxelStreamState& state) const { + if (!state.shouldSubdivide()) { + return; + } bool leaf = isLeaf(); if (!state.shouldSubdivideReference()) { state.base.stream << leaf; From 7bcc267cb5c87d16a0e49e08ae7639f1061e666f Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 27 Oct 2014 15:01:06 -0700 Subject: [PATCH 3/4] Fix for crash on exit. --- interface/src/MetavoxelSystem.cpp | 6 ++++++ interface/src/MetavoxelSystem.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index a9bdad8148..8e5ae8d9b1 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -48,6 +48,12 @@ MetavoxelSystem::NetworkSimulation::NetworkSimulation(float dropRate, float repe bandwidthLimit(bandwidthLimit) { } +MetavoxelSystem::~MetavoxelSystem() { + // kill the updater before we delete our network simulation objects + _updater->thread()->quit(); + _updater->thread()->wait(); +} + void MetavoxelSystem::init() { MetavoxelClientManager::init(); DefaultMetavoxelRendererImplementation::init(); diff --git a/interface/src/MetavoxelSystem.h b/interface/src/MetavoxelSystem.h index 14a24eea59..08cc1098ca 100644 --- a/interface/src/MetavoxelSystem.h +++ b/interface/src/MetavoxelSystem.h @@ -43,6 +43,8 @@ public: int maximumDelay = 0, int bandwidthLimit = 0); }; + virtual ~MetavoxelSystem(); + virtual void init(); virtual MetavoxelLOD getLOD(); From 4ab90ce49ce81dd6f3e8b8ce88a19610f69779b5 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 27 Oct 2014 15:04:03 -0700 Subject: [PATCH 4/4] Avoid killing the updater twice. --- interface/src/MetavoxelSystem.cpp | 1 + libraries/metavoxels/src/MetavoxelClientManager.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 8e5ae8d9b1..20e05e779e 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -52,6 +52,7 @@ MetavoxelSystem::~MetavoxelSystem() { // kill the updater before we delete our network simulation objects _updater->thread()->quit(); _updater->thread()->wait(); + _updater = NULL; } void MetavoxelSystem::init() { diff --git a/libraries/metavoxels/src/MetavoxelClientManager.cpp b/libraries/metavoxels/src/MetavoxelClientManager.cpp index cc5d7ef29d..f1c086da67 100644 --- a/libraries/metavoxels/src/MetavoxelClientManager.cpp +++ b/libraries/metavoxels/src/MetavoxelClientManager.cpp @@ -27,8 +27,10 @@ MetavoxelClientManager::MetavoxelClientManager() : } MetavoxelClientManager::~MetavoxelClientManager() { - _updater->thread()->quit(); - _updater->thread()->wait(); + if (_updater) { + _updater->thread()->quit(); + _updater->thread()->wait(); + } } void MetavoxelClientManager::init() {