Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
JobSystemThreadPool.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
10
12#include <thread>
14
16
17// Things we're using from STL
18using std::thread;
19
26{
27public:
29
32 JobSystemThreadPool(uint inMaxJobs, uint inMaxBarriers, int inNumThreads = -1);
34 virtual ~JobSystemThreadPool() override;
35
37 using InitExitFunction = function<void(int)>;
38 void SetThreadInitFunction(const InitExitFunction &inInitFunction) { mThreadInitFunction = inInitFunction; }
39 void SetThreadExitFunction(const InitExitFunction &inExitFunction) { mThreadExitFunction = inExitFunction; }
40
45 void Init(uint inMaxJobs, uint inMaxBarriers, int inNumThreads = -1);
46
47 // See JobSystem
48 virtual int GetMaxConcurrency() const override { return int(mThreads.size()) + 1; }
49 virtual JobHandle CreateJob(const char *inName, ColorArg inColor, const JobFunction &inJobFunction, uint32 inNumDependencies = 0) override;
50 virtual void CreateJobs(const char *inName, ColorArg inColor, const JobFunction &inJobFunction, JobHandle *outJobs, uint32 inNumJobs, uint32 inNumDependencies = 0) override;
51
53 void SetNumThreads(int inNumThreads) { StopThreads(); StartThreads(inNumThreads); }
54
55protected:
56 // See JobSystem
57 virtual void QueueJob(Job *inJob) override;
58 virtual void QueueJobs(Job **inJobs, uint inNumJobs) override;
59 virtual void FreeJob(Job *inJob) override;
60
61private:
65 class Node : public Job
66 {
67 public:
68 Node(const char *inJobName, ColorArg inColor, JobSystem *inJobSystem, const JobFunction &inJobFunction, uint32 inNumDependencies)
69 : Job(inJobName, inColor, inJobSystem, inJobFunction, inNumDependencies)
70 {
71 // Work around TSAN false positive. We can read mNext from a freed and then recyled node. So instead of constructing, we atomically intialize mNext to 0
72 mNext.store(0, std::memory_order_relaxed);
73 }
74
75 atomic<uint64> mNext;
76 };
77
78 static constexpr uint32 cNullIndex = 0xffffffff;
79 static uint64 sMakePointer(uint32 inIndex, uint32 inCount) { return (uint64(inCount) << 32) | inIndex; }
80 static uint32 sGetIndex(uint64 inPointer) { return uint32(inPointer); }
81 static uint32 sGetCount(uint64 inPointer) { return uint32(inPointer >> 32); }
82
84 Job * AllocateJob(const char *inName, ColorArg inColor, const JobFunction &inJobFunction, uint32 inNumDependencies);
85
87 void Enqueue(Job *inJob);
88
90 Job * Dequeue();
91
93 void StartThreads(int inNumThreads);
94 void StopThreads();
95
97 void ThreadMain(int inThreadIndex);
98
100 void ExecuteJobs();
101
103 InitExitFunction mThreadInitFunction = [](int) { };
104 InitExitFunction mThreadExitFunction = [](int) { };
105
107 using AvailableJobs = FixedSizeFreeList<Node>;
108 AvailableJobs mJobs;
109
111 Array<thread> mThreads;
112
113 // Head and tail of the queue, these are index + counters (see sMakePointer)
114 alignas(JPH_CACHE_LINE_SIZE) atomic<uint64> mHead;
115 alignas(JPH_CACHE_LINE_SIZE) atomic<uint64> mTail;
116
117 // Semaphore used to signal worker threads that there is new work
118 Semaphore mSemaphore;
119
121 atomic<bool> mQuit = false;
122};
123
#define JPH_EXPORT
Definition Core.h:303
#define JPH_CACHE_LINE_SIZE
Definition Core.h:613
#define JPH_SUPPRESS_WARNINGS_STD_BEGIN
Definition Core.h:492
#define JPH_SUPPRESS_WARNINGS_STD_END
Definition Core.h:506
std::uint64_t uint64
Definition Core.h:569
unsigned int uint
Definition Core.h:564
#define JPH_NAMESPACE_END
Definition Core.h:487
std::uint32_t uint32
Definition Core.h:567
#define JPH_NAMESPACE_BEGIN
Definition Core.h:481
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:51
Definition Array.h:22
Class that holds an RGBA color with 8-bits per component.
Definition Color.h:16
Definition FixedSizeFreeList.h:18
Definition JobSystem.h:80
Definition JobSystem.h:70
virtual JobHandle CreateJob(const char *inName, ColorArg inColor, const JobFunction &inJobFunction, uint32 inNumDependencies=0)=0
virtual void QueueJobs(Job **inJobs, uint inNumJobs)=0
Adds a number of jobs at once to the job queue.
virtual void FreeJob(Job *inJob)=0
Frees a job.
virtual void QueueJob(Job *inJob)=0
Adds a job to the job queue.
virtual void CreateJobs(const char *inName, ColorArg inColor, const JobFunction &inJobFunction, JobHandle *outJobs, uint32 inNumJobs, uint32 inNumDependencies=0)=0
Definition JobSystemThreadPool.h:26
void SetThreadExitFunction(const InitExitFunction &inExitFunction)
Definition JobSystemThreadPool.h:39
function< void(int)> InitExitFunction
Functions to call when a thread is initialized or exits, must be set before calling Init()
Definition JobSystemThreadPool.h:37
void SetNumThreads(int inNumThreads)
Change the max concurrency after initialization.
Definition JobSystemThreadPool.h:53
void SetThreadInitFunction(const InitExitFunction &inInitFunction)
Definition JobSystemThreadPool.h:38
JobSystemThreadPool()=default
virtual int GetMaxConcurrency() const override
Get maximum number of concurrently executing jobs.
Definition JobSystemThreadPool.h:48
Definition JobSystemWithBarrier.h:24
void Init(uint inMaxBarriers)
Definition JobSystemWithBarrier.cpp:198
Definition Semaphore.h:32