816a047920
Async: Use new [Non]PostedAsyncCont and callOriginalCb This new hierarchy of classes gives us a central mechanism for managing both reply-posting and lockSpec unlocking. * callOriginalCb: Now uses a modern C++ variadic template design enabling it to handle both direct calling and std::bind() re-binding of an arbitrary number of arguments from the caller. This enables us to mostly eliminate the repeated, bespoke definitions of callOriginalCb littered throughout the codebase. We've also propagated these changes throughout the codebase in this patch.
136 lines
3.1 KiB
C++
136 lines
3.1 KiB
C++
#include <iostream>
|
|
#include <asynchronousContinuation.h>
|
|
#include <asynchronousLoop.h>
|
|
#include <component.h>
|
|
#include <componentThread.h>
|
|
#include <mindManager/mindManager.h>
|
|
#include <marionette/marionette.h>
|
|
|
|
namespace smo {
|
|
namespace mrntt {
|
|
|
|
class MarionetteComponent::MrnttLifetimeMgmtOp
|
|
: public PostedAsynchronousContinuation<mrnttLifetimeMgmtOpCbFn>
|
|
{
|
|
public:
|
|
MrnttLifetimeMgmtOp(
|
|
MarionetteComponent &parent, const std::shared_ptr<ComponentThread> &caller,
|
|
mrnttLifetimeMgmtOpCbFn callback)
|
|
: PostedAsynchronousContinuation<mrnttLifetimeMgmtOpCbFn>(
|
|
caller, callback),
|
|
parent(parent)
|
|
{}
|
|
|
|
private:
|
|
MarionetteComponent &parent;
|
|
|
|
public:
|
|
void initializeReq1_posted(
|
|
[[maybe_unused]] std::shared_ptr<MrnttLifetimeMgmtOp> context
|
|
)
|
|
{
|
|
auto self = ComponentThread::getSelf();
|
|
if (self->id != ComponentThread::MRNTT)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Must be executed on Marionette thread");
|
|
}
|
|
|
|
smo::mind::globalMind = std::make_shared<Mind>();
|
|
smo::mind::globalMind->initializeReq(
|
|
std::bind(
|
|
&MrnttLifetimeMgmtOp::initializeReq2,
|
|
this, context, std::placeholders::_1));
|
|
}
|
|
|
|
void initializeReq2(
|
|
std::shared_ptr<MrnttLifetimeMgmtOp> context,
|
|
bool success
|
|
)
|
|
{
|
|
if (!success)
|
|
{
|
|
std::cerr << __func__ << ": Failed to initialize globalMind"
|
|
<< std::endl;
|
|
context->callOriginalCb(false);
|
|
return;
|
|
}
|
|
|
|
context->callOriginalCb(success);
|
|
}
|
|
|
|
void finalizeReq1_posted(
|
|
[[maybe_unused]] std::shared_ptr<MrnttLifetimeMgmtOp> context
|
|
)
|
|
{
|
|
auto self = ComponentThread::getSelf();
|
|
if (self->id != ComponentThread::MRNTT)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Must be executed on Marionette thread");
|
|
}
|
|
|
|
smo::mind::globalMind->finalizeReq(
|
|
std::bind(
|
|
&MrnttLifetimeMgmtOp::finalizeReq2,
|
|
this, context, std::placeholders::_1));
|
|
}
|
|
|
|
void finalizeReq2(
|
|
std::shared_ptr<MrnttLifetimeMgmtOp> context,
|
|
bool success
|
|
)
|
|
{
|
|
if (!success)
|
|
{
|
|
std::cerr << __func__ << ": globalMind finalization failed"
|
|
<< std::endl;
|
|
context->callOriginalCb(false);
|
|
return;
|
|
}
|
|
|
|
context->callOriginalCb(success);
|
|
}
|
|
};
|
|
|
|
void MarionetteComponent::initializeReq(mrnttLifetimeMgmtOpCbFn callback)
|
|
{
|
|
auto mrntt = ComponentThread::getSelf();
|
|
|
|
if (mrntt->id != ComponentThread::MRNTT)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Must be executed on Marionette thread");
|
|
}
|
|
|
|
auto request = std::make_shared<MrnttLifetimeMgmtOp>(
|
|
*this, mrntt, callback);
|
|
|
|
mrntt->getIoService().post(
|
|
std::bind(
|
|
&MrnttLifetimeMgmtOp::initializeReq1_posted,
|
|
request.get(), request));
|
|
}
|
|
|
|
void MarionetteComponent::finalizeReq(mrnttLifetimeMgmtOpCbFn callback)
|
|
{
|
|
auto mrntt = ComponentThread::getSelf();
|
|
|
|
if (mrntt->id != ComponentThread::MRNTT)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Must be executed on Marionette thread");
|
|
}
|
|
|
|
auto request = std::make_shared<MrnttLifetimeMgmtOp>(
|
|
*this, mrntt, callback);
|
|
|
|
mrntt->getIoService().post(
|
|
std::bind(
|
|
&MrnttLifetimeMgmtOp::finalizeReq1_posted,
|
|
request.get(), request));
|
|
}
|
|
|
|
} // namespace mrntt
|
|
} // namespace smo
|