Async: Move callOriginalCb out of AsyncCont base, into NonPostedAC

The reasoning here is to prevent silent invocations of
callOriginalCb from a base class pointer/ref.
This commit is contained in:
2025-09-18 22:10:17 -04:00
parent b49e281010
commit eb3366cfd2
+20 -24
View File
@@ -33,23 +33,6 @@ public:
std::shared_ptr<AsynchronousContinuation<OriginalCbFnT>>
lifetimePreservingConveyance);
/**
* @brief Call the original callback with perfect forwarding
*
* IMPORTANT: This method cannot be virtual because templates cannot be
* virtual in C++. Therefore, this method MUST be called from the
* most-derived class reference/pointer context. Never call this method
* through a polymorphic base class reference/pointer, as it will not
* dispatch to the correct derived class implementation.
*
* @param args Arguments to forward to the original callback
*/
template<typename... Args>
void callOriginalCb(Args&&... args)
{
if (originalCbFn) { originalCbFn(std::forward<Args>(args)...); }
}
public:
OriginalCbFnT originalCbFn;
};
@@ -73,8 +56,24 @@ public:
: AsynchronousContinuation<OriginalCbFnT>(originalCbFn)
{}
public:
using AsynchronousContinuation<OriginalCbFnT>::callOriginalCb;
/**
* @brief Call the original callback with perfect forwarding
* (immediate execution)
*
* This implementation calls the original callback immediately without
* posting to any thread or queue. Used for non-posted continuations.
*
* @param args Arguments to forward to the original callback
*/
template<typename... Args>
void callOriginalCb(Args&&... args)
{
if (AsynchronousContinuation<OriginalCbFnT>::originalCbFn)
{
AsynchronousContinuation<OriginalCbFnT>::originalCbFn(
std::forward<Args>(args)...);
}
}
};
template <class OriginalCbFnT>
@@ -92,7 +91,8 @@ public:
template<typename... Args>
void callOriginalCb(Args&&... args)
{
if (AsynchronousContinuation<OriginalCbFnT>::originalCbFn) {
if (AsynchronousContinuation<OriginalCbFnT>::originalCbFn)
{
caller->getIoService().post(
std::bind(
AsynchronousContinuation<OriginalCbFnT>::originalCbFn,
@@ -102,7 +102,6 @@ public:
public:
std::shared_ptr<ComponentThread> caller;
using AsynchronousContinuation<OriginalCbFnT>::callOriginalCb;
};
template <class OriginalCbFnT>
@@ -125,9 +124,6 @@ public:
PostedAsynchronousContinuation<OriginalCbFnT>::callOriginalCb(
std::forward<Args>(args)...);
}
public:
using AsynchronousContinuation<OriginalCbFnT>::callOriginalCb;
};
} // namespace smo