Overte C++ Documentation
OctreeInboundPacketProcessor.h
1 //
2 // OctreeInboundPacketProcessor.h
3 // assignment-client/src/octree
4 //
5 // Created by Brad Hefta-Gaub on 8/21/13.
6 // Copyright 2013 High Fidelity, Inc.
7 //
8 // Threaded or non-threaded network packet processor for octree servers
9 //
10 // Distributed under the Apache License, Version 2.0.
11 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
12 //
13 
14 #ifndef hifi_OctreeInboundPacketProcessor_h
15 #define hifi_OctreeInboundPacketProcessor_h
16 
17 #include <QtCore/QSharedPointer>
18 
19 #include <ReceivedPacketProcessor.h>
20 
21 #include "SequenceNumberStats.h"
22 
23 class OctreeServer;
24 
25 class SingleSenderStats {
26 public:
27  SingleSenderStats();
28 
29  quint64 getAverageTransitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalTransitTime / _totalPackets; }
30  quint64 getAverageProcessTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalProcessTime / _totalPackets; }
31  quint64 getAverageLockWaitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalLockWaitTime / _totalPackets; }
32  quint64 getTotalElementsProcessed() const { return _totalElementsInPacket; }
33  quint64 getTotalPacketsProcessed() const { return _totalPackets; }
34  quint64 getAverageProcessTimePerElement() const
35  { return _totalElementsInPacket == 0 ? 0 : _totalProcessTime / _totalElementsInPacket; }
36  quint64 getAverageLockWaitTimePerElement() const
37  { return _totalElementsInPacket == 0 ? 0 : _totalLockWaitTime / _totalElementsInPacket; }
38 
39  const SequenceNumberStats& getIncomingEditSequenceNumberStats() const { return _incomingEditSequenceNumberStats; }
40  SequenceNumberStats& getIncomingEditSequenceNumberStats() { return _incomingEditSequenceNumberStats; }
41 
42  void trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime,
43  int editsInPacket, quint64 processTime, quint64 lockWaitTime);
44 
45  quint64 _totalTransitTime;
46  quint64 _totalProcessTime;
47  quint64 _totalLockWaitTime;
48  quint64 _totalElementsInPacket;
49  quint64 _totalPackets;
50  SequenceNumberStats _incomingEditSequenceNumberStats;
51 };
52 
53 typedef QHash<QUuid, SingleSenderStats> NodeToSenderStatsMap;
54 typedef QHash<QUuid, SingleSenderStats>::iterator NodeToSenderStatsMapIterator;
55 typedef QHash<QUuid, SingleSenderStats>::const_iterator NodeToSenderStatsMapConstIterator;
56 
57 
61  Q_OBJECT
62 public:
64 
65  quint64 getAverageTransitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalTransitTime / _totalPackets; }
66  quint64 getAverageProcessTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalProcessTime / _totalPackets; }
67  quint64 getAverageLockWaitTimePerPacket() const { return _totalPackets == 0 ? 0 : _totalLockWaitTime / _totalPackets; }
68  quint64 getTotalElementsProcessed() const { return _totalElementsInPacket; }
69  quint64 getTotalPacketsProcessed() const { return _totalPackets; }
70  quint64 getAverageProcessTimePerElement() const
71  { return _totalElementsInPacket == 0 ? 0 : _totalProcessTime / _totalElementsInPacket; }
72  quint64 getAverageLockWaitTimePerElement() const
73  { return _totalElementsInPacket == 0 ? 0 : _totalLockWaitTime / _totalElementsInPacket; }
74 
75  void resetStats();
76 
77  NodeToSenderStatsMap getSingleSenderStats() { QReadLocker locker(&_senderStatsLock); return _singleSenderStats; }
78 
79  virtual void terminating() override { _shuttingDown = true; ReceivedPacketProcessor::terminating(); }
80 
81 protected:
82 
83  virtual void processPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) override;
84 
85  virtual uint32_t getMaxWait() const override;
86  virtual void preProcess() override;
87  virtual void midProcess() override;
88 
89 private:
90  int sendNackPackets();
91 
92 private:
93  void trackInboundPacket(const QUuid& nodeUUID, unsigned short int sequence, quint64 transitTime,
94  int elementsInPacket, quint64 processTime, quint64 lockWaitTime);
95 
96  OctreeServer* _myServer;
97  int _receivedPacketCount;
98 
99  std::atomic<uint64_t> _totalTransitTime;
100  std::atomic<uint64_t> _totalProcessTime;
101  std::atomic<uint64_t> _totalLockWaitTime;
102  std::atomic<uint64_t> _totalElementsInPacket;
103  std::atomic<uint64_t> _totalPackets;
104 
105  NodeToSenderStatsMap _singleSenderStats;
106  QReadWriteLock _senderStatsLock;
107 
108  std::atomic<uint64_t> _lastNackTime;
109  bool _shuttingDown;
110 };
111 #endif // hifi_OctreeInboundPacketProcessor_h
Definition: OctreeInboundPacketProcessor.h:60
virtual void preProcess() override
Override to do work before the packets processing loop. Default does nothing.
Definition: OctreeInboundPacketProcessor.cpp:61
virtual void processPacket(QSharedPointer< ReceivedMessage > message, SharedNodePointer sendingNode) override
Definition: OctreeInboundPacketProcessor.cpp:79
virtual uint32_t getMaxWait() const override
Determines the timeout of the wait when there are no packets to process. Default value is 100ms to al...
Definition: OctreeInboundPacketProcessor.cpp:51
virtual void midProcess() override
Override to do work inside the packet processing loop after a packet is processed....
Definition: OctreeInboundPacketProcessor.cpp:70
Handles assignments of type OctreeServer - sending octrees to various clients.
Definition: OctreeServer.h:38
Generalized threaded processor for handling received inbound packets.
Definition: ReceivedPacketProcessor.h:25