added locking on _singleSenderStats; untested!

This commit is contained in:
wangyix 2014-06-12 12:03:22 -07:00
parent 15bd0878c4
commit c542da9707
4 changed files with 17 additions and 9 deletions

View file

@ -25,7 +25,9 @@ OctreeInboundPacketProcessor::OctreeInboundPacketProcessor(OctreeServer* myServe
_totalProcessTime(0), _totalProcessTime(0),
_totalLockWaitTime(0), _totalLockWaitTime(0),
_totalElementsInPacket(0), _totalElementsInPacket(0),
_totalPackets(0) _totalPackets(0),
_singleSenderStats(),
_singleSenderStatsLock()
{ {
} }
@ -36,7 +38,9 @@ void OctreeInboundPacketProcessor::resetStats() {
_totalElementsInPacket = 0; _totalElementsInPacket = 0;
_totalPackets = 0; _totalPackets = 0;
_singleSenderStatsLock.lockForWrite();
_singleSenderStats.clear(); _singleSenderStats.clear();
_singleSenderStatsLock.unlock();
} }
@ -143,7 +147,9 @@ void OctreeInboundPacketProcessor::trackInboundPacket(const QUuid& nodeUUID, uns
if (_singleSenderStats.find(nodeUUID) == _singleSenderStats.end()) { if (_singleSenderStats.find(nodeUUID) == _singleSenderStats.end()) {
SingleSenderStats stats; SingleSenderStats stats;
stats.trackInboundPacket(sequence, transitTime, editsInPacket, processTime, lockWaitTime); stats.trackInboundPacket(sequence, transitTime, editsInPacket, processTime, lockWaitTime);
_singleSenderStatsLock.lockForWrite();
_singleSenderStats[nodeUUID] = stats; _singleSenderStats[nodeUUID] = stats;
_singleSenderStatsLock.unlock();
} else { } else {
SingleSenderStats& stats = _singleSenderStats[nodeUUID]; SingleSenderStats& stats = _singleSenderStats[nodeUUID];
stats.trackInboundPacket(sequence, transitTime, editsInPacket, processTime, lockWaitTime); stats.trackInboundPacket(sequence, transitTime, editsInPacket, processTime, lockWaitTime);

View file

@ -71,6 +71,8 @@ public:
void resetStats(); void resetStats();
void lockSingleSenderStatsForRead() { _singleSenderStatsLock.lockForRead(); }
void unlockSingleSenderStats() { _singleSenderStatsLock.unlock(); }
NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; } NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; }
const NodeToSenderStatsMap& getSingleSenderStats() const { return _singleSenderStats; } const NodeToSenderStatsMap& getSingleSenderStats() const { return _singleSenderStats; }
@ -91,5 +93,6 @@ private:
quint64 _totalPackets; quint64 _totalPackets;
NodeToSenderStatsMap _singleSenderStats; NodeToSenderStatsMap _singleSenderStats;
QReadWriteLock _singleSenderStatsLock;
}; };
#endif // hifi_OctreeInboundPacketProcessor_h #endif // hifi_OctreeInboundPacketProcessor_h

View file

@ -120,7 +120,7 @@ int OctreeSendThread::sendNack(OctreeQueryNode* nodeData) {
return 0; return 0;
} }
const OctreeInboundPacketProcessor* myServerPacketProcessor = _myServer->getInboundPacketProcessor(); OctreeInboundPacketProcessor* myServerPacketProcessor = _myServer->getInboundPacketProcessor();
// if there are packets from _node that are waiting to be processed, // if there are packets from _node that are waiting to be processed,
// don't send a NACK since the missing packets may be among those waiting packets. // don't send a NACK since the missing packets may be among those waiting packets.
@ -128,18 +128,15 @@ int OctreeSendThread::sendNack(OctreeQueryNode* nodeData) {
return 0; return 0;
} }
// lock unlock required ????????? prolly: _singleSenderStats may have our node's entry deleted during this or something myServerPacketProcessor->lockSingleSenderStatsForRead();
// maybe just make a copy instead!!
// lock const QSet<unsigned short int>& missingSequenceNumbersFromNode = myServerPacketProcessor
const QSet<unsigned short int> missingSequenceNumbersFromNode = myServerPacketProcessor
->getSingleSenderStats().at(_node->getUUID()).getMissingSequenceNumbers(); ->getSingleSenderStats().at(_node->getUUID()).getMissingSequenceNumbers();
// check if there are any sequence numbers that need to be nacked // check if there are any sequence numbers that need to be nacked
int numSequenceNumbersAvailable = missingSequenceNumbersFromNode.size(); int numSequenceNumbersAvailable = missingSequenceNumbersFromNode.size();
if (numSequenceNumbersAvailable == 0) { if (numSequenceNumbersAvailable == 0) {
//unlock myServerPacketProcessor->unlockSingleSenderStats();
return 0; return 0;
} }
@ -170,6 +167,8 @@ int OctreeSendThread::sendNack(OctreeQueryNode* nodeData) {
dataAt += sizeof(unsigned short int); dataAt += sizeof(unsigned short int);
} }
myServerPacketProcessor->unlockSingleSenderStats();
// send it // send it
OctreeServer::didCallWriteDatagram(this); OctreeServer::didCallWriteDatagram(this);
NodeList::getInstance()->writeDatagram((char*)packet, dataAt - packet, _node); NodeList::getInstance()->writeDatagram((char*)packet, dataAt - packet, _node);

View file

@ -52,7 +52,7 @@ public:
int getPacketsTotalPerInterval() const { return _packetsTotalPerInterval; } int getPacketsTotalPerInterval() const { return _packetsTotalPerInterval; }
int getPacketsTotalPerSecond() const { return getPacketsTotalPerInterval() * INTERVALS_PER_SECOND; } int getPacketsTotalPerSecond() const { return getPacketsTotalPerInterval() * INTERVALS_PER_SECOND; }
const OctreeInboundPacketProcessor* getInboundPacketProcessor() const { return _octreeInboundPacketProcessor; } OctreeInboundPacketProcessor* getInboundPacketProcessor() { return _octreeInboundPacketProcessor; }
static int getCurrentClientCount() { return _clientCount; } static int getCurrentClientCount() { return _clientCount; }
static void clientConnected() { _clientCount++; } static void clientConnected() { _clientCount++; }