From 186035dc5d1b1a5f9a36f0d18cb7662e73469df3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Aug 2017 11:57:55 -0700 Subject: [PATCH 1/3] adjust various things that cause a crash-on-exit on Linux --- assignment-client/src/audio/AudioMixer.cpp | 2 +- .../src/audio/AudioMixerClientData.cpp | 4 +- assignment-client/src/avatars/AvatarMixer.cpp | 4 +- libraries/networking/src/LimitedNodeList.cpp | 14 +++--- libraries/networking/src/NLPacket.cpp | 11 ++-- libraries/networking/src/Node.cpp | 8 +-- libraries/networking/src/Node.h | 5 ++ libraries/networking/src/PacketReceiver.cpp | 4 +- .../networking/src/udt/PacketHeaders.cpp | 32 ------------ libraries/networking/src/udt/PacketHeaders.h | 50 +++++++++++++++++-- .../ui/src/ui/TabletScriptingInterface.cpp | 4 -- tests/render-texture-load/src/GLIHelpers.h | 1 + 12 files changed, 75 insertions(+), 64 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 93b9b10eb7..9ed6c7fdbc 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -127,7 +127,7 @@ void AudioMixer::queueReplicatedAudioPacket(QSharedPointer mess // construct a "fake" audio received message from the byte array and packet list information auto audioData = message->getMessage().mid(NUM_BYTES_RFC4122_UUID); - PacketType rewrittenType = REPLICATED_PACKET_MAPPING.key(message->getType()); + PacketType rewrittenType = PacketTypeEnum::getReplicatedPacketMapping().key(message->getType()); if (rewrittenType == PacketType::Unknown) { qDebug() << "Cannot unwrap replicated packet type not present in REPLICATED_PACKET_WRAPPING"; diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 408ddf038c..9bba9c7f30 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -125,11 +125,11 @@ void AudioMixerClientData::optionallyReplicatePacket(ReceivedMessage& message, c // now make sure it's a packet type that we want to replicate // first check if it is an original type that we should replicate - PacketType mirroredType = REPLICATED_PACKET_MAPPING.value(message.getType()); + PacketType mirroredType = PacketTypeEnum::getReplicatedPacketMapping().value(message.getType()); if (mirroredType == PacketType::Unknown) { // if it wasn't check if it is a replicated type that we should re-replicate - if (REPLICATED_PACKET_MAPPING.key(message.getType()) != PacketType::Unknown) { + if (PacketTypeEnum::getReplicatedPacketMapping().key(message.getType()) != PacketType::Unknown) { mirroredType = message.getType(); } else { qDebug() << "Packet passed to optionallyReplicatePacket was not a replicatable type - returning"; diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index eea44f031e..c67e998dd4 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -144,10 +144,10 @@ void AvatarMixer::optionallyReplicatePacket(ReceivedMessage& message, const Node // check if this is a packet type we replicate // which means it must be a packet type present in REPLICATED_PACKET_MAPPING or must be the // replicated version of one of those packet types - PacketType replicatedType = REPLICATED_PACKET_MAPPING.value(message.getType()); + PacketType replicatedType = PacketTypeEnum::getReplicatedPacketMapping().value(message.getType()); if (replicatedType == PacketType::Unknown) { - if (REPLICATED_PACKET_MAPPING.key(message.getType()) != PacketType::Unknown) { + if (PacketTypeEnum::getReplicatedPacketMapping().key(message.getType()) != PacketType::Unknown) { replicatedType = message.getType(); } else { qDebug() << __FUNCTION__ << "called without replicatable packet type - returning"; diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index eab0e5e41f..e03ec5e771 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -220,7 +220,7 @@ bool LimitedNodeList::packetVersionMatch(const udt::Packet& packet) { const HifiSockAddr& senderSockAddr = packet.getSenderSockAddr(); QUuid sourceID; - if (NON_SOURCED_PACKETS.contains(headerType)) { + if (PacketTypeEnum::getNonSourcedPackets().contains(headerType)) { hasBeenOutput = versionDebugSuppressMap.contains(senderSockAddr, headerType); if (!hasBeenOutput) { @@ -256,8 +256,8 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe PacketType headerType = NLPacket::typeInHeader(packet); - if (NON_SOURCED_PACKETS.contains(headerType)) { - if (REPLICATED_PACKET_MAPPING.key(headerType) != PacketType::Unknown) { + if (PacketTypeEnum::getNonSourcedPackets().contains(headerType)) { + if (PacketTypeEnum::getReplicatedPacketMapping().key(headerType) != PacketType::Unknown) { // this is a replicated packet type - make sure the socket that sent it to us matches // one from one of our current upstream nodes @@ -298,7 +298,7 @@ bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packe SharedNodePointer matchingNode = nodeWithUUID(sourceID); if (matchingNode) { - if (!NON_VERIFIED_PACKETS.contains(headerType)) { + if (!PacketTypeEnum::getNonVerifiedPackets().contains(headerType)) { QByteArray packetHeaderHash = NLPacket::verificationHashInHeader(packet); QByteArray expectedHash = NLPacket::hashForPacketAndSecret(packet, matchingNode->getConnectionSecret()); @@ -345,13 +345,13 @@ void LimitedNodeList::collectPacketStats(const NLPacket& packet) { } void LimitedNodeList::fillPacketHeader(const NLPacket& packet, const QUuid& connectionSecret) { - if (!NON_SOURCED_PACKETS.contains(packet.getType())) { + if (!PacketTypeEnum::getNonSourcedPackets().contains(packet.getType())) { packet.writeSourceID(getSessionUUID()); } if (!connectionSecret.isNull() - && !NON_SOURCED_PACKETS.contains(packet.getType()) - && !NON_VERIFIED_PACKETS.contains(packet.getType())) { + && !PacketTypeEnum::getNonSourcedPackets().contains(packet.getType()) + && !PacketTypeEnum::getNonVerifiedPackets().contains(packet.getType())) { packet.writeVerificationHashGivenSecret(connectionSecret); } } diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index a11dd69753..5c5077691b 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -12,8 +12,8 @@ #include "NLPacket.h" int NLPacket::localHeaderSize(PacketType type) { - bool nonSourced = NON_SOURCED_PACKETS.contains(type); - bool nonVerified = NON_VERIFIED_PACKETS.contains(type); + bool nonSourced = PacketTypeEnum::getNonSourcedPackets().contains(type); + bool nonVerified = PacketTypeEnum::getNonVerifiedPackets().contains(type); qint64 optionalSize = (nonSourced ? 0 : NUM_BYTES_RFC4122_UUID) + ((nonSourced || nonVerified) ? 0 : NUM_BYTES_MD5_HASH); return sizeof(PacketType) + sizeof(PacketVersion) + optionalSize; } @@ -198,13 +198,13 @@ void NLPacket::readVersion() { } void NLPacket::readSourceID() { - if (!NON_SOURCED_PACKETS.contains(_type)) { + if (!PacketTypeEnum::getNonSourcedPackets().contains(_type)) { _sourceID = sourceIDInHeader(*this); } } void NLPacket::writeSourceID(const QUuid& sourceID) const { - Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type)); + Q_ASSERT(!PacketTypeEnum::getNonSourcedPackets().contains(_type)); auto offset = Packet::totalHeaderSize(isPartOfMessage()) + sizeof(PacketType) + sizeof(PacketVersion); memcpy(_packet.get() + offset, sourceID.toRfc4122().constData(), NUM_BYTES_RFC4122_UUID); @@ -213,7 +213,8 @@ void NLPacket::writeSourceID(const QUuid& sourceID) const { } void NLPacket::writeVerificationHashGivenSecret(const QUuid& connectionSecret) const { - Q_ASSERT(!NON_SOURCED_PACKETS.contains(_type) && !NON_VERIFIED_PACKETS.contains(_type)); + Q_ASSERT(!PacketTypeEnum::getNonSourcedPackets().contains(_type) && + !PacketTypeEnum::getNonVerifiedPackets().contains(_type)); auto offset = Packet::totalHeaderSize(isPartOfMessage()) + sizeof(PacketType) + sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index d7f8f404e6..25eef38dbd 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -29,11 +29,9 @@ int NodePtrMetaTypeId = qRegisterMetaType("Node*"); int sharedPtrNodeMetaTypeId = qRegisterMetaType>("QSharedPointer"); int sharedNodePtrMetaTypeId = qRegisterMetaType("SharedNodePointer"); -namespace NodeType { - QHash TypeNameHash; -} - void NodeType::init() { + QHash& TypeNameHash = Node::getTypeNameHash(); + TypeNameHash.insert(NodeType::DomainServer, "Domain Server"); TypeNameHash.insert(NodeType::EntityServer, "Entity Server"); TypeNameHash.insert(NodeType::Agent, "Agent"); @@ -50,6 +48,7 @@ void NodeType::init() { } const QString& NodeType::getNodeTypeName(NodeType_t nodeType) { + QHash& TypeNameHash = Node::getTypeNameHash(); QHash::iterator matchedTypeName = TypeNameHash.find(nodeType); return matchedTypeName != TypeNameHash.end() ? matchedTypeName.value() : UNKNOWN_NodeType_t_NAME; } @@ -85,6 +84,7 @@ NodeType_t NodeType::downstreamType(NodeType_t primaryType) { } NodeType_t NodeType::fromString(QString type) { + QHash& TypeNameHash = Node::getTypeNameHash(); return TypeNameHash.key(type, NodeType::Unassigned); } diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index c20ff5a395..4d09f077bd 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -86,6 +86,11 @@ public: bool isIgnoreRadiusEnabled() const { return _ignoreRadiusEnabled; } + static QHash& getTypeNameHash() { + static QHash TypeNameHash; + return TypeNameHash; + } + private: // privatize copy and assignment operator to disallow Node copying Node(const Node &otherNode); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 21db207375..556e55beb2 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -32,7 +32,7 @@ bool PacketReceiver::registerListenerForTypes(PacketTypeList types, QObject* lis // Partition types based on whether they are sourced or not (non sourced in front) auto middle = std::partition(std::begin(types), std::end(types), [](PacketType type) { - return NON_SOURCED_PACKETS.contains(type); + return PacketTypeEnum::getNonSourcedPackets().contains(type); }); QMetaMethod nonSourcedMethod, sourcedMethod; @@ -123,7 +123,7 @@ QMetaMethod PacketReceiver::matchingMethodForListener(PacketType type, QObject* SIGNATURE_TEMPLATE.arg(slot, NON_SOURCED_MESSAGE_LISTENER_PARAMETERS) }; - if (!NON_SOURCED_PACKETS.contains(type)) { + if (!PacketTypeEnum::getNonSourcedPackets().contains(type)) { static const QString SOURCED_MESSAGE_LISTENER_PARAMETERS = "QSharedPointer,QSharedPointer"; static const QString TYPEDEF_SOURCED_MESSAGE_LISTENER_PARAMETERS = "QSharedPointer,SharedNodePointer"; diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index d2500196d9..241ccaf5d6 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -22,38 +22,6 @@ Q_DECLARE_METATYPE(PacketType); int packetTypeMetaTypeId = qRegisterMetaType(); -const QSet NON_VERIFIED_PACKETS = QSet() - << PacketType::NodeJsonStats << PacketType::EntityQuery - << PacketType::OctreeDataNack << PacketType::EntityEditNack - << PacketType::DomainListRequest << PacketType::StopNode - << PacketType::DomainDisconnectRequest << PacketType::UsernameFromIDRequest - << PacketType::NodeKickRequest << PacketType::NodeMuteRequest; - -const QSet NON_SOURCED_PACKETS = QSet() - << PacketType::StunResponse << PacketType::CreateAssignment << PacketType::RequestAssignment - << PacketType::DomainServerRequireDTLS << PacketType::DomainConnectRequest - << PacketType::DomainList << PacketType::DomainConnectionDenied - << PacketType::DomainServerPathQuery << PacketType::DomainServerPathResponse - << PacketType::DomainServerAddedNode << PacketType::DomainServerConnectionToken - << PacketType::DomainSettingsRequest << PacketType::DomainSettings - << PacketType::ICEServerPeerInformation << PacketType::ICEServerQuery << PacketType::ICEServerHeartbeat - << PacketType::ICEServerHeartbeatACK << PacketType::ICEPing << PacketType::ICEPingReply - << PacketType::ICEServerHeartbeatDenied << PacketType::AssignmentClientStatus << PacketType::StopNode - << PacketType::DomainServerRemovedNode << PacketType::UsernameFromIDReply << PacketType::OctreeFileReplacement - << PacketType::ReplicatedMicrophoneAudioNoEcho << PacketType::ReplicatedMicrophoneAudioWithEcho - << PacketType::ReplicatedInjectAudio << PacketType::ReplicatedSilentAudioFrame - << PacketType::ReplicatedAvatarIdentity << PacketType::ReplicatedKillAvatar << PacketType::ReplicatedBulkAvatarData; - -const QHash REPLICATED_PACKET_MAPPING { - { PacketType::MicrophoneAudioNoEcho, PacketType::ReplicatedMicrophoneAudioNoEcho }, - { PacketType::MicrophoneAudioWithEcho, PacketType::ReplicatedMicrophoneAudioWithEcho }, - { PacketType::InjectAudio, PacketType::ReplicatedInjectAudio }, - { PacketType::SilentAudioFrame, PacketType::ReplicatedSilentAudioFrame }, - { PacketType::AvatarIdentity, PacketType::ReplicatedAvatarIdentity }, - { PacketType::KillAvatar, PacketType::ReplicatedKillAvatar }, - { PacketType::BulkAvatarData, PacketType::ReplicatedBulkAvatarData } -}; - PacketVersion versionForPacketType(PacketType packetType) { switch (packetType) { case PacketType::DomainList: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index cb3db791b4..8ed0966291 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -123,19 +123,59 @@ public: ReplicatedBulkAvatarData, NUM_PACKET_TYPE }; + + const static QHash getReplicatedPacketMapping() { + const QHash REPLICATED_PACKET_MAPPING { + { PacketTypeEnum::Value::MicrophoneAudioNoEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho }, + { PacketTypeEnum::Value::MicrophoneAudioWithEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho }, + { PacketTypeEnum::Value::InjectAudio, PacketTypeEnum::Value::ReplicatedInjectAudio }, + { PacketTypeEnum::Value::SilentAudioFrame, PacketTypeEnum::Value::ReplicatedSilentAudioFrame }, + { PacketTypeEnum::Value::AvatarIdentity, PacketTypeEnum::Value::ReplicatedAvatarIdentity }, + { PacketTypeEnum::Value::KillAvatar, PacketTypeEnum::Value::ReplicatedKillAvatar }, + { PacketTypeEnum::Value::BulkAvatarData, PacketTypeEnum::Value::ReplicatedBulkAvatarData } + }; + + return REPLICATED_PACKET_MAPPING; + } + + const static QSet getNonVerifiedPackets() { + const QSet NON_VERIFIED_PACKETS = QSet() + << PacketTypeEnum::Value::NodeJsonStats << PacketTypeEnum::Value::EntityQuery + << PacketTypeEnum::Value::OctreeDataNack << PacketTypeEnum::Value::EntityEditNack + << PacketTypeEnum::Value::DomainListRequest << PacketTypeEnum::Value::StopNode + << PacketTypeEnum::Value::DomainDisconnectRequest << PacketTypeEnum::Value::UsernameFromIDRequest + << PacketTypeEnum::Value::NodeKickRequest << PacketTypeEnum::Value::NodeMuteRequest; + return NON_VERIFIED_PACKETS; + } + + const static QSet getNonSourcedPackets() { + const QSet NON_SOURCED_PACKETS = QSet() + << PacketTypeEnum::Value::StunResponse << PacketTypeEnum::Value::CreateAssignment + << PacketTypeEnum::Value::RequestAssignment << PacketTypeEnum::Value::DomainServerRequireDTLS + << PacketTypeEnum::Value::DomainConnectRequest << PacketTypeEnum::Value::DomainList + << PacketTypeEnum::Value::DomainConnectionDenied << PacketTypeEnum::Value::DomainServerPathQuery + << PacketTypeEnum::Value::DomainServerPathResponse << PacketTypeEnum::Value::DomainServerAddedNode + << PacketTypeEnum::Value::DomainServerConnectionToken << PacketTypeEnum::Value::DomainSettingsRequest + << PacketTypeEnum::Value::DomainSettings << PacketTypeEnum::Value::ICEServerPeerInformation + << PacketTypeEnum::Value::ICEServerQuery << PacketTypeEnum::Value::ICEServerHeartbeat + << PacketTypeEnum::Value::ICEServerHeartbeatACK << PacketTypeEnum::Value::ICEPing + << PacketTypeEnum::Value::ICEPingReply << PacketTypeEnum::Value::ICEServerHeartbeatDenied + << PacketTypeEnum::Value::AssignmentClientStatus << PacketTypeEnum::Value::StopNode + << PacketTypeEnum::Value::DomainServerRemovedNode << PacketTypeEnum::Value::UsernameFromIDReply + << PacketTypeEnum::Value::OctreeFileReplacement << PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho + << PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho << PacketTypeEnum::Value::ReplicatedInjectAudio + << PacketTypeEnum::Value::ReplicatedSilentAudioFrame << PacketTypeEnum::Value::ReplicatedAvatarIdentity + << PacketTypeEnum::Value::ReplicatedKillAvatar << PacketTypeEnum::Value::ReplicatedBulkAvatarData; + return NON_SOURCED_PACKETS; + } }; using PacketType = PacketTypeEnum::Value; -extern const QHash REPLICATED_PACKET_MAPPING; - const int NUM_BYTES_MD5_HASH = 16; typedef char PacketVersion; -extern const QSet NON_VERIFIED_PACKETS; -extern const QSet NON_SOURCED_PACKETS; - PacketVersion versionForPacketType(PacketType packetType); QByteArray protocolVersionsSignature(); /// returns a unqiue signature for all the current protocols QString protocolVersionsSignatureBase64(); diff --git a/libraries/ui/src/ui/TabletScriptingInterface.cpp b/libraries/ui/src/ui/TabletScriptingInterface.cpp index 0fd32b42e6..984d743ebf 100644 --- a/libraries/ui/src/ui/TabletScriptingInterface.cpp +++ b/libraries/ui/src/ui/TabletScriptingInterface.cpp @@ -28,11 +28,9 @@ const QString SYSTEM_TOOLBAR = "com.highfidelity.interface.toolbar.system"; const QString SYSTEM_TABLET = "com.highfidelity.interface.tablet.system"; TabletScriptingInterface::TabletScriptingInterface() { - qCDebug(uiLogging) << "Building tablet scripting interface"; } TabletScriptingInterface::~TabletScriptingInterface() { - qCDebug(uiLogging) << "Destroying tablet scripting interface"; } ToolbarProxy* TabletScriptingInterface::getSystemToolbarProxy() { @@ -191,7 +189,6 @@ TabletProxy::TabletProxy(QObject* parent, const QString& name) : QObject(parent) } TabletProxy::~TabletProxy() { - qCDebug(uiLogging) << "Destroying tablet proxy " << _name; if (QThread::currentThread() != thread()) { qCWarning(uiLogging) << "Destroying tablet proxy on wrong thread" << _name; } @@ -846,7 +843,6 @@ TabletButtonProxy::TabletButtonProxy(const QVariantMap& properties) : } TabletButtonProxy::~TabletButtonProxy() { - qCDebug(uiLogging) << "Destroying tablet button proxy " ; if (QThread::currentThread() != thread()) { qCWarning(uiLogging) << "Destroying tablet button proxy on wrong thread"; } diff --git a/tests/render-texture-load/src/GLIHelpers.h b/tests/render-texture-load/src/GLIHelpers.h index c2841311a9..886176e874 100644 --- a/tests/render-texture-load/src/GLIHelpers.h +++ b/tests/render-texture-load/src/GLIHelpers.h @@ -28,6 +28,7 @@ #pragma GCC diagnostic ignored "-Wunused-but-set-variable" #pragma GCC diagnostic ignored "-Wunused-result" #pragma GCC diagnostic ignored "-Wignored-qualifiers" +#pragma GCC diagnostic ignored "-Wtype-limits" #endif #include From 6f9460162d3d93ee5bfde7137b4a1aacf3558dd7 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Aug 2017 12:47:45 -0700 Subject: [PATCH 2/3] avoid calling a pure virtual function from GLBackend dtor --- libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 2 -- libraries/gpu-gl/src/gpu/gl/GLBackend.h | 2 +- libraries/gpu-gl/src/gpu/gl41/GL41Backend.h | 5 +++++ libraries/gpu-gl/src/gpu/gl45/GL45Backend.h | 5 +++++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index 11e67811b6..eac74fbdf9 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -196,8 +196,6 @@ GLBackend::GLBackend() { GLBackend::~GLBackend() { - resetStages(); - killInput(); killTransform(); } diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index 88aecda617..1908db614d 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.h @@ -66,7 +66,7 @@ protected: public: static bool makeProgram(Shader& shader, const Shader::BindingSet& slotBindings = Shader::BindingSet()); - ~GLBackend(); + virtual ~GLBackend(); void setCameraCorrection(const Mat4& correction); void render(const Batch& batch) final override; diff --git a/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h b/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h index 2c64b9d23d..42926fdb1c 100644 --- a/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h +++ b/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h @@ -43,6 +43,11 @@ public: explicit GL41Backend(bool syncCache) : Parent(syncCache) {} GL41Backend() : Parent() {} + virtual ~GL41Backend() { + // call resetStages here rather than in ~GLBackend dtor because it will call releaseResourceBuffer + // which is pure virtual from GLBackend's dtor. + resetStages(); + } static const std::string GL41_VERSION; const std::string& getVersion() const override { return GL41_VERSION; } diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h b/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h index d5ff1a3485..1a4b63d35f 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h +++ b/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h @@ -39,6 +39,11 @@ public: explicit GL45Backend(bool syncCache) : Parent(syncCache) {} GL45Backend() : Parent() {} + virtual ~GL45Backend() { + // call resetStages here rather than in ~GLBackend dtor because it will call releaseResourceBuffer + // which is pure virtual from GLBackend's dtor. + resetStages(); + } static const std::string GL45_VERSION; const std::string& getVersion() const override { return GL45_VERSION; } From 83a30e2f350ed9d9811c21bcee381c1730fbf280 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Aug 2017 13:12:27 -0700 Subject: [PATCH 3/3] missed some statics --- libraries/networking/src/udt/PacketHeaders.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 8ed0966291..e2304e62f7 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -125,7 +125,7 @@ public: }; const static QHash getReplicatedPacketMapping() { - const QHash REPLICATED_PACKET_MAPPING { + const static QHash REPLICATED_PACKET_MAPPING { { PacketTypeEnum::Value::MicrophoneAudioNoEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioNoEcho }, { PacketTypeEnum::Value::MicrophoneAudioWithEcho, PacketTypeEnum::Value::ReplicatedMicrophoneAudioWithEcho }, { PacketTypeEnum::Value::InjectAudio, PacketTypeEnum::Value::ReplicatedInjectAudio }, @@ -134,12 +134,11 @@ public: { PacketTypeEnum::Value::KillAvatar, PacketTypeEnum::Value::ReplicatedKillAvatar }, { PacketTypeEnum::Value::BulkAvatarData, PacketTypeEnum::Value::ReplicatedBulkAvatarData } }; - return REPLICATED_PACKET_MAPPING; } const static QSet getNonVerifiedPackets() { - const QSet NON_VERIFIED_PACKETS = QSet() + const static QSet NON_VERIFIED_PACKETS = QSet() << PacketTypeEnum::Value::NodeJsonStats << PacketTypeEnum::Value::EntityQuery << PacketTypeEnum::Value::OctreeDataNack << PacketTypeEnum::Value::EntityEditNack << PacketTypeEnum::Value::DomainListRequest << PacketTypeEnum::Value::StopNode @@ -149,7 +148,7 @@ public: } const static QSet getNonSourcedPackets() { - const QSet NON_SOURCED_PACKETS = QSet() + const static QSet NON_SOURCED_PACKETS = QSet() << PacketTypeEnum::Value::StunResponse << PacketTypeEnum::Value::CreateAssignment << PacketTypeEnum::Value::RequestAssignment << PacketTypeEnum::Value::DomainServerRequireDTLS << PacketTypeEnum::Value::DomainConnectRequest << PacketTypeEnum::Value::DomainList