Nursery: Initial integration

StimulusProducer: syncAwaitAllSettlements should pump caller io_context
This commit is contained in:
2026-06-09 11:19:42 -04:00
parent 5b81ea893c
commit 91fc655b25
15 changed files with 326 additions and 383 deletions
@@ -428,11 +428,6 @@ PcloudStimulusProducer::getOrCreateAttachedStimulusBuffer(
}
}
void PcloudStimulusProducer::stimFrameProductionTimesliceInd()
{
holdProduceFrameCReq();
}
struct AllowNextStimulusFrameGuard
{
PcloudStimulusProducer& producer;
@@ -445,22 +440,14 @@ struct AllowNextStimulusFrameGuard
{ producer.allowNextStimulusFrame(); }
};
void PcloudStimulusProducer::holdProduceFrameCReq()
{
/** EXPLANATION:
* We shouldn't acquire stimulusProducerCanceler.s.lock here because
* this function is called from
* StimulusProducer::stimFrameProductionTimesliceInd(), which is already
* holding the lock.
*/
activeProduceFrameInvoker.emplace(produceFrameCReq(
produceFrameExceptionPtr,
[this]() { activeProduceFrameInvoker.reset(); }));
}
sscl::co::NonViralNonPostingInvoker PcloudStimulusProducer::produceFrameCReq(
[[maybe_unused]] std::exception_ptr& exceptionPtr,
[[maybe_unused]] std::function<void()> completion)
/** EXPLANATION:
* productionCDaemon co_awaits this viral timeslice and passes its
* nursery-slot canceler. Cooperative shutdown uses that canceler between
* co_await steps; do not use execUncancelableSegmentOrAbort here.
*/
sscl::co::ViralNonPostingInvoker<void>
PcloudStimulusProducer::stimFrameProductionTimesliceCInd(
sscl::SyncCancelerForAsyncWork &canceler)
{
AllowNextStimulusFrameGuard allowNextGuard(*this);
StimulusFrame& stimulusFrame = tempStimulusFrame;
@@ -473,14 +460,11 @@ sscl::co::NonViralNonPostingInvoker PcloudStimulusProducer::produceFrameCReq(
// produceFrameReq1_doAssemble_posted
/** EXPLANATION:
* stimFrameProductionTimesliceInd() is entered with
* stimulusProducerCanceler.s.lock held; do not re-acquire here.
*
* This function is called from
* StimulusProducer::stimFrameProductionTimesliceInd(), whose caller is
* already holding the lock.
* productionCDaemon co_awaits this timeslice outside its uncancelable
* rate-limiter segment; use isCancellationRequested() here, not
* execUncancelableSegmentOrAbort.
*/
if (stimulusProducerCanceler.isCancellationRequestedUnlocked())
if (canceler.isCancellationRequested())
{ co_return; }
cpsBoundary::AssembleFrameResult assembleResult = co_await
@@ -491,8 +475,8 @@ sscl::co::NonViralNonPostingInvoker PcloudStimulusProducer::produceFrameCReq(
std::optional<AmbienceProductionDesc> lightAmbienceProductionDescDesc;
std::optional<AmbienceProductionDesc> darkAmbienceProductionDescDesc;
{
sscl::SpinLock::Guard guard(stimulusProducerCanceler.s.lock);
if (stimulusProducerCanceler.isCancellationRequestedUnlocked())
sscl::SpinLock::Guard guard(canceler.s.lock);
if (canceler.isCancellationRequestedUnlocked())
{ co_return; }
if (!assembleResult.success)
@@ -612,8 +596,8 @@ sscl::co::NonViralNonPostingInvoker PcloudStimulusProducer::produceFrameCReq(
}
{
sscl::SpinLock::Guard guard(stimulusProducerCanceler.s.lock);
if (stimulusProducerCanceler.isCancellationRequestedUnlocked())
sscl::SpinLock::Guard guard(canceler.s.lock);
if (canceler.isCancellationRequestedUnlocked())
{ co_return; }
if (!compactCollateSuccess) {