12 #ifndef hifi_AvatarMixerSlavePool_h
13 #define hifi_AvatarMixerSlavePool_h
15 #include <condition_variable>
21 #include <TBBHelpers.h>
23 #include <shared/QtHelpers.h>
25 #include "AvatarMixerSlave.h"
28 class AvatarMixerSlavePool;
30 class AvatarMixerSlaveThread :
public QThread,
public AvatarMixerSlave {
32 using ConstIter = NodeList::const_iterator;
33 using Mutex = std::mutex;
34 using Lock = std::unique_lock<Mutex>;
37 AvatarMixerSlaveThread(AvatarMixerSlavePool& pool, SlaveSharedData* slaveSharedData) :
38 AvatarMixerSlave(slaveSharedData), _pool(pool) {};
40 void run() override final;
43 friend class AvatarMixerSlavePool;
46 void notify(
bool stopping);
47 bool try_pop(SharedNodePointer& node);
49 AvatarMixerSlavePool& _pool;
50 void (AvatarMixerSlave::*_function)(const SharedNodePointer& node) {
nullptr };
56 class AvatarMixerSlavePool {
57 using Queue = tbb::concurrent_queue<SharedNodePointer>;
58 using Mutex = std::mutex;
59 using Lock = std::unique_lock<Mutex>;
60 using ConditionVariable = std::condition_variable;
63 using ConstIter = NodeList::const_iterator;
65 AvatarMixerSlavePool(SlaveSharedData* slaveSharedData,
int numThreads = QThread::idealThreadCount()) :
66 _slaveSharedData(slaveSharedData) { setNumThreads(numThreads); }
67 ~AvatarMixerSlavePool() { resize(0); }
70 void processIncomingPackets(ConstIter begin, ConstIter end);
71 void broadcastAvatarData(ConstIter begin, ConstIter end,
72 p_high_resolution_clock::time_point lastFrameTimestamp,
float maxKbpsPerNode,
float throttlingRatio);
75 void each(std::function<
void(AvatarMixerSlave& slave)> functor);
77 #ifdef DEBUG_EVENT_QUEUE
78 void queueStats(QJsonObject& stats);
81 void setNumThreads(
int numThreads);
82 int numThreads()
const {
return _numThreads; }
84 void setPriorityReservedFraction(
float fraction) { _priorityReservedFraction = fraction; }
85 float getPriorityReservedFraction()
const {
return _priorityReservedFraction; }
88 void run(ConstIter begin, ConstIter end);
89 void resize(
int numThreads);
91 std::vector<std::unique_ptr<AvatarMixerSlaveThread>> _slaves;
93 friend void AvatarMixerSlaveThread::wait();
94 friend void AvatarMixerSlaveThread::notify(
bool stopping);
95 friend bool AvatarMixerSlaveThread::try_pop(SharedNodePointer& node);
99 ConditionVariable _slaveCondition;
100 ConditionVariable _poolCondition;
101 void (AvatarMixerSlave::*_function)(
const SharedNodePointer& node);
102 std::function<void(AvatarMixerSlave&)> _configure;
105 float _priorityReservedFraction { 0.4f };
106 int _numThreads { 0 };
108 int _numStarted { 0 };
109 int _numFinished { 0 };
110 int _numStopped { 0 };
117 SlaveSharedData* _slaveSharedData;