Files
libspinscale/include/spinscale/puppetApplication.h
T
hayodea a14d622eaf PuppetApp: Lifetime mgmt ops are now Viral
They no longer accept an exc_ptr and lambda for cb.
2026-05-24 16:11:08 -04:00

74 lines
2.4 KiB
C++

#ifndef PUPPET_APPLICATION_H
#define PUPPET_APPLICATION_H
#include <config.h>
#include <memory>
#include <string_view>
#include <vector>
#include <spinscale/co/group.h>
#include <spinscale/co/invokers.h>
#include <spinscale/componentThread.h>
namespace sscl {
class PuppetApplication
: public std::enable_shared_from_this<PuppetApplication>
{
public:
PuppetApplication(
const std::vector<std::shared_ptr<PuppetThread>> &threads);
~PuppetApplication() = default;
co::ViralNonPostingInvoker<void> joltAllPuppetThreadsCReq();
co::ViralNonPostingInvoker<void> startAllPuppetThreadsCReq();
co::ViralNonPostingInvoker<void> pauseAllPuppetThreadsCReq();
co::ViralNonPostingInvoker<void> resumeAllPuppetThreadsCReq();
co::ViralNonPostingInvoker<void> exitAllPuppetThreadsCReq();
// CPU distribution method
void distributeAndPinThreadsAcrossCpus();
protected:
using PuppetLifetimeMgmtInvoker =
PuppetThread::ViralThreadLifetimeMgmtInvoker;
using PuppetLifetimeMgmtGroup = co::Group;
void addAllPuppetLifetimeInvokersToGroup(
PuppetLifetimeMgmtGroup &group,
std::vector<PuppetLifetimeMgmtInvoker> &invokers,
PuppetThread::ThreadOp threadOp) const;
std::vector<std::shared_ptr<PuppetThread>> componentThreads;
/**
* Indicates whether all puppet 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 flag ensures that JOLTing happens exactly once and provides
* a synchronization point for the entire system initialization.
*/
bool threadsHaveBeenJolted = false;
private:
co::ViralNonPostingInvoker<void> allPuppetThreadsLifetimeOpCReq(
PuppetThread::ThreadOp threadOp,
std::string_view emptyThreadsLogMessage);
};
} // namespace sscl
#endif // PUPPET_APPLICATION_H