Lockvoker: Add registerInLockSet
We now create the sh_ptr to the copy of a lockvoker object in its own supplied register method. This enables us to retain type safety when calling make_shared, by copying the most derived version of the lockvoker object. Then we can pass in the LockerAndInvokerBase to the rest of the call chain.
This commit is contained in:
+1
-2
@@ -74,9 +74,8 @@ public:
|
||||
* cleaned up in the qutexQ's std::list destructor -- and that won't
|
||||
* execute any fancy cleanup logic. It'll just clear() out the list.
|
||||
*/
|
||||
template <class InvocationTargetT>
|
||||
void registerInQutexQueues(
|
||||
const typename SerializedAsynchronousContinuation<OriginalCbFnT>::template LockerAndInvoker<InvocationTargetT> &lockvoker);
|
||||
const std::shared_ptr<LockerAndInvokerBase> &lockvoker);
|
||||
|
||||
/**
|
||||
* @brief Try to acquire all locks in order; back off if acquisition fails
|
||||
|
||||
@@ -253,6 +253,19 @@ public:
|
||||
void allowAwakening()
|
||||
{ serializedContinuation.isAwakeOrBeingAwakened.store(false); }
|
||||
|
||||
/** EXPLANATION:
|
||||
* Creates a shared_ptr copy of this lockvoker and registers it with
|
||||
* the serialized continuation's LockSet.
|
||||
*/
|
||||
void registerInLockSet()
|
||||
{
|
||||
auto sharedLockvoker = std::make_shared<
|
||||
LockerAndInvoker<InvocationTargetT>>(*this);
|
||||
|
||||
serializedContinuation.requiredLocks.registerInQutexQueues(
|
||||
sharedLockvoker);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief First wake - register in queues and awaken
|
||||
*
|
||||
@@ -263,7 +276,7 @@ public:
|
||||
void firstWake()
|
||||
{
|
||||
serializedContinuation.isAwakeOrBeingAwakened.store(true);
|
||||
serializedContinuation.requiredLocks.registerInQutexQueues(*this);
|
||||
registerInLockSet();
|
||||
// Force awaken since we just set the flag above
|
||||
awaken(true);
|
||||
}
|
||||
|
||||
+2
-6
@@ -7,9 +7,8 @@ namespace smo {
|
||||
// These will be explicitly instantiated for the types we need
|
||||
|
||||
template <class OriginalCbFnT>
|
||||
template <class InvocationTargetT>
|
||||
void LockSet<OriginalCbFnT>::registerInQutexQueues(
|
||||
const typename SerializedAsynchronousContinuation<OriginalCbFnT>::template LockerAndInvoker<InvocationTargetT> &lockvoker
|
||||
const std::shared_ptr<LockerAndInvokerBase> &lockvoker
|
||||
)
|
||||
{
|
||||
/** EXPLANATION:
|
||||
@@ -34,13 +33,10 @@ void LockSet<OriginalCbFnT>::registerInQutexQueues(
|
||||
* io_service, potentially without being executed if they fail to
|
||||
* acquire all locks.
|
||||
*/
|
||||
auto sharedLockvoker = std::make_shared<
|
||||
typename SerializedAsynchronousContinuation<OriginalCbFnT>::template LockerAndInvoker<InvocationTargetT>>(lockvoker);
|
||||
|
||||
for (auto& lockUsageDesc : locks)
|
||||
{
|
||||
lockUsageDesc.second = lockUsageDesc.first.get().registerInQueue(
|
||||
sharedLockvoker);
|
||||
lockvoker);
|
||||
}
|
||||
|
||||
registeredInQutexQueues = true;
|
||||
|
||||
Reference in New Issue
Block a user