Remove deadlock caused by trying readlock on NodeList

Also just use refs to other SharedNodes as the NodeList
is locked.
This commit is contained in:
Simon Walton 2018-08-28 09:41:09 -07:00
parent 44f253c482
commit 027d117364

View file

@ -288,13 +288,19 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
// setup list of AvatarData as well as maps to map betweeen the AvatarData and the original nodes // setup list of AvatarData as well as maps to map betweeen the AvatarData and the original nodes
struct AvatarSortData { struct AvatarSortData {
SharedNodePointer _nodeShared; AvatarSortData(const SharedNodePointer& nodeShared, AvatarData* avatarData, quint64 lastEncodeTime)
: _nodeShared(nodeShared)
, _node(nodeShared.data())
, _avatarData(avatarData)
, _lastEncodeTime(lastEncodeTime)
{ }
const SharedNodePointer& _nodeShared;
Node* _node; Node* _node;
AvatarData* _avatarData; AvatarData* _avatarData;
quint64 _lastEncodeTime; quint64 _lastEncodeTime;
}; };
// Temporary info about the avatars we're sending:
std::vector<AvatarSortData> avatarsToSort; std::vector<AvatarSortData> avatarsToSort;
avatarsToSort.reserve(nodeList->size());
//std::unordered_map<const AvatarData*, Node*> avatarDataToNodes; //std::unordered_map<const AvatarData*, Node*> avatarDataToNodes;
//std::unordered_map<const AvatarData*, SharedNodePointer> avatarDataToNodesShared; //std::unordered_map<const AvatarData*, SharedNodePointer> avatarDataToNodesShared;
//std::unordered_map<QUuid, uint64_t> avatarEncodeTimes; //std::unordered_map<QUuid, uint64_t> avatarEncodeTimes;
@ -311,7 +317,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
//avatarDataToNodes[otherAvatar] = otherNode.data(); //avatarDataToNodes[otherAvatar] = otherNode.data();
//avatarDataToNodesShared[otherAvatar] = otherNode; //avatarDataToNodesShared[otherAvatar] = otherNode;
auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(otherAvatar->getSessionUUID()); auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(otherAvatar->getSessionUUID());
avatarsToSort.emplace_back(AvatarSortData({ otherNode, otherNodeRaw, otherAvatar, lastEncodeTime })); avatarsToSort.emplace_back(AvatarSortData(otherNode, otherAvatar, lastEncodeTime));
} }
}); });
@ -345,7 +351,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
AvatarData::_avatarSortCoefficientAge); AvatarData::_avatarSortCoefficientAge);
// ignore or sort // ignore or sort
const AvatarData* thisAvatar = nodeData->getAvatarSharedPointer().get();
for (const auto& avatar : avatarsToSort) { for (const auto& avatar : avatarsToSort) {
if (avatar._node == nodeRaw) { if (avatar._node == nodeRaw) {
// don't echo updates to self // don't echo updates to self
@ -437,7 +442,6 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
int remainingAvatars = (int)sortedAvatars.size(); int remainingAvatars = (int)sortedAvatars.size();
auto traitsPacketList = NLPacketList::create(PacketType::BulkAvatarTraits, QByteArray(), true, true); auto traitsPacketList = NLPacketList::create(PacketType::BulkAvatarTraits, QByteArray(), true, true);
while (!sortedAvatars.empty()) { while (!sortedAvatars.empty()) {
const AvatarData* avatarData = sortedAvatars.top().getAvatar();
const Node* otherNode = sortedAvatars.top().getNode(); const Node* otherNode = sortedAvatars.top().getNode();
sortedAvatars.pop(); sortedAvatars.pop();
remainingAvatars--; remainingAvatars--;