From 186035dc5d1b1a5f9a36f0d18cb7662e73469df3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sun, 6 Aug 2017 11:57:55 -0700 Subject: [PATCH] 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