12 #include <dispatch/dispatch.h>
38 dispatch_queue_t queue;
40 void (*
function)(
void *);
47 unsigned long eventId;
48 unsigned long compositionHash;
52 unsigned long chainIndex;
53 unsigned long *upstreamChainIndices;
54 int upstreamChainIndicesCount;
56 Worker(dispatch_queue_t queue,
void *context,
void (*
function)(
void *),
int minThreadsNeeded,
int maxThreadsNeeded,
57 unsigned long eventId,
unsigned long compositionHash,
int chainCount);
58 Worker(dispatch_queue_t queue,
void *context,
void (*
function)(
void *),
int minThreadsNeeded,
int maxThreadsNeeded,
59 unsigned long eventId,
unsigned long compositionHash,
unsigned long chainIndex,
60 unsigned long *upstreamChainIndices,
int upstreamChainIndicesCount);
87 void enqueue(Worker *worker);
88 void dequeue(
Node *node);
90 Node * getOldest(
void);
91 Node * getNewest(
void);
104 int threadsAvailable;
105 map<unsigned long, int> workersClaimingThreads;
108 set<unsigned long> workersCompleted;
111 void setTotalThreads(
int totalThreads);
112 bool tryClaimThreads(
int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long workerId,
int &threadsClaimed)
VuoWarnUnusedResult;
113 int getThreadsClaimed(
unsigned long workerId);
114 void returnThreads(
unsigned long workerId);
117 WorkerQueue workersWaitingForThreads;
118 ThreadPool mainThreadPool;
119 map<unsigned long, map<unsigned long, ThreadPool> > triggerThreadPools;
120 dispatch_queue_t workersWaitingSync;
121 dispatch_queue_t threadPoolSync;
122 dispatch_semaphore_t workersUpdated;
123 dispatch_semaphore_t completed;
124 bool mayMoreWorkersBeEnqueued;
125 bool mayMoreWorkersBeDequeued;
127 vector<Worker *> workersDequeued;
128 vector<WorkerQueue::Node *> workersDequeuedNodes;
130 vector<Worker *> dequeueWorkers(
void);
135 void enableSchedulingWorkers(
void);
136 void disableSchedulingWorkers(
void);
137 void scheduleTriggerWorker(dispatch_queue_t queue,
void *context,
void (*
function)(
void *),
138 int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long eventId,
const char *compositionIdentifier,
140 void scheduleChainWorker(dispatch_queue_t queue,
void *context,
void (*
function)(
void *),
141 int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long eventId,
const char *compositionIdentifier,
142 unsigned long chainIndex,
unsigned long *upstreamChainIndices,
int upstreamChainIndicesCount);
143 void grantThreadsToChain(
int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long eventId,
const char *compositionIdentifier,
144 unsigned long chainIndex);
145 void grantThreadsToSubcomposition(
unsigned long eventId,
const char *compositionIdentifier,
unsigned long chainIndex,
const char *subcompositionIdentifier);
146 void returnThreadsForTriggerWorker(
unsigned long eventId);
147 void returnThreadsForChainWorker(
unsigned long eventId,
const char *compositionIdentifier,
unsigned long chainIndex);
153 int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long eventId,
int chainCount);
155 int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long eventId,
unsigned long chainIndex,
156 unsigned long *upstreamChainIndices,
int upstreamChainIndicesCount);
158 int minThreadsNeeded,
int maxThreadsNeeded,
unsigned long eventId,
unsigned long chainIndex);
160 char *subcompositionIdentifier);