Document the purpose and mechanics behind JOLTing
This commit is contained in:
@@ -82,6 +82,13 @@ public:
|
|||||||
void exitThreadReq(std::function<void()> callback = nullptr);
|
void exitThreadReq(std::function<void()> callback = nullptr);
|
||||||
void pauseThreadReq(std::function<void()> callback = nullptr);
|
void pauseThreadReq(std::function<void()> callback = nullptr);
|
||||||
void resumeThreadReq(std::function<void()> callback = nullptr);
|
void resumeThreadReq(std::function<void()> callback = nullptr);
|
||||||
|
/**
|
||||||
|
* JOLTs this thread to begin processing after global initialization.
|
||||||
|
*
|
||||||
|
* JOLTing is the mechanism that allows threads to enter their main
|
||||||
|
* event loops and set up TLS vars after all global constructors have
|
||||||
|
* completed. This prevents race conditions during system startup.
|
||||||
|
*/
|
||||||
void joltThreadReq(std::function<void()> callback = nullptr);
|
void joltThreadReq(std::function<void()> callback = nullptr);
|
||||||
|
|
||||||
// Convenience wrappers
|
// Convenience wrappers
|
||||||
@@ -122,7 +129,25 @@ public:
|
|||||||
boost::asio::io_service::work pause_work;
|
boost::asio::io_service::work pause_work;
|
||||||
std::atomic<bool> keepLooping;
|
std::atomic<bool> keepLooping;
|
||||||
int pinnedCpuId;
|
int pinnedCpuId;
|
||||||
// Indicates whether all mind threads have been JOLTed at least once
|
/**
|
||||||
|
* Indicates whether all mind threads have been JOLTed at least once.
|
||||||
|
*
|
||||||
|
* JOLTing serves two critical purposes:
|
||||||
|
*
|
||||||
|
* 1. **Global Constructor Sequencing**: Since pthreads begin executing while
|
||||||
|
* global constructors are still being executed, globally defined pthreads
|
||||||
|
* cannot depend on global objects having been constructed. JOLTing is done
|
||||||
|
* by the CRT's main thread within main(), which provides a sequencing
|
||||||
|
* guarantee that global constructors have been called.
|
||||||
|
*
|
||||||
|
* 2. **shared_from_this Safety**: shared_from_this() requires a prior
|
||||||
|
* shared_ptr handle to be established. The global list of
|
||||||
|
* shared_ptr<ComponentThread> guarantees that at least one shared_ptr to
|
||||||
|
* each ComponentThread has been initialized before JOLTing occurs.
|
||||||
|
*
|
||||||
|
* This atomic flag ensures that JOLTing happens exactly once and provides
|
||||||
|
* a synchronization point for the entire system initialization.
|
||||||
|
*/
|
||||||
static std::atomic<bool> threadsHaveBeenJolted;
|
static std::atomic<bool> threadsHaveBeenJolted;
|
||||||
|
|
||||||
/* Always ensure that this is last so that the thread is spawned after
|
/* Always ensure that this is last so that the thread is spawned after
|
||||||
|
|||||||
Reference in New Issue
Block a user