Qutex: currOwner should use registered sh_ptr to Lockvoker
This ensures that the Lockvoker object we access from currOwner remains valid past the lifetime of the Lockvoker object that gets copied and invoked by boost::asio
This commit is contained in:
+7
-3
@@ -44,7 +44,9 @@ bool Qutex::tryAcquire(
|
||||
{
|
||||
isOwned = true;
|
||||
#ifdef CONFIG_ENABLE_DEBUG_LOCKS
|
||||
currOwner = const_cast<LockerAndInvokerBase*>(&tryingLockvoker);
|
||||
// Use the stored iterator from the LockSet
|
||||
auto it = tryingLockvoker.getLockvokerIteratorForQutex(*this);
|
||||
currOwner = *it;
|
||||
#endif
|
||||
lock.release();
|
||||
return true;
|
||||
@@ -59,7 +61,7 @@ bool Qutex::tryAcquire(
|
||||
{
|
||||
isOwned = true;
|
||||
#ifdef CONFIG_ENABLE_DEBUG_LOCKS
|
||||
currOwner = const_cast<LockerAndInvokerBase*>(&tryingLockvoker);
|
||||
currOwner = queue.front();
|
||||
#endif
|
||||
ret = true;
|
||||
}
|
||||
@@ -96,7 +98,9 @@ bool Qutex::tryAcquire(
|
||||
// Not found in rear portion - must be in top X%, so succeed
|
||||
isOwned = true;
|
||||
#ifdef CONFIG_ENABLE_DEBUG_LOCKS
|
||||
currOwner = const_cast<LockerAndInvokerBase*>(&tryingLockvoker);
|
||||
// Use the stored iterator from the LockSet
|
||||
auto it = tryingLockvoker.getLockvokerIteratorForQutex(*this);
|
||||
currOwner = *it;
|
||||
#endif
|
||||
lock.release();
|
||||
return true;
|
||||
|
||||
@@ -27,9 +27,9 @@ SerializedAsynchronousContinuation<OriginalCbFnT>
|
||||
* lockvoker.
|
||||
*/
|
||||
for (std::shared_ptr<AsynchronousContinuationChainLink> currContin =
|
||||
this->serializedContinuation.getCallersContinuation();
|
||||
this->serializedContinuation.getCallersContinuationShPtr();
|
||||
currContin != nullptr;
|
||||
currContin = currContin->getCallersContinuation())
|
||||
currContin = currContin->getCallersContinuationShPtr())
|
||||
{
|
||||
auto serializedCont = std::dynamic_pointer_cast<
|
||||
SerializedAsynchronousContinuation<OriginalCbFnT>>(currContin);
|
||||
@@ -94,13 +94,14 @@ SerializedAsynchronousContinuation<OriginalCbFnT>
|
||||
* Hence, we have a gridlock.
|
||||
*/
|
||||
|
||||
LockerAndInvokerBase* foreignOwnerPtr = firstFailedQutex.getCurrOwner();
|
||||
std::shared_ptr<LockerAndInvokerBase> foreignOwnerShPtr =
|
||||
firstFailedQutex.getCurrOwner();
|
||||
// If no current owner, can't be a gridlock
|
||||
if (foreignOwnerPtr == nullptr)
|
||||
if (foreignOwnerShPtr == nullptr)
|
||||
{ return false; }
|
||||
|
||||
// Use reference for the rest of the function for safety.
|
||||
LockerAndInvokerBase& foreignOwner = *foreignOwnerPtr;
|
||||
LockerAndInvokerBase &foreignOwner = *foreignOwnerShPtr;
|
||||
|
||||
/* For each lock in the foreign owner's LockSet, check if we hold it
|
||||
* in any of our previous continuations (excluding our most immediate one)
|
||||
@@ -128,9 +129,9 @@ SerializedAsynchronousContinuation<OriginalCbFnT>
|
||||
* should eventually be able to acquire that lock.
|
||||
*/
|
||||
for (std::shared_ptr<AsynchronousContinuationChainLink> currContin =
|
||||
this->serializedContinuation.getCallersContinuation();
|
||||
this->serializedContinuation.getCallersContinuationShPtr();
|
||||
currContin != nullptr;
|
||||
currContin = currContin->getCallersContinuation())
|
||||
currContin = currContin->getCallersContinuationShPtr())
|
||||
{
|
||||
auto serializedCont = std::dynamic_pointer_cast<
|
||||
SerializedAsynchronousContinuation<OriginalCbFnT>>(currContin);
|
||||
|
||||
Reference in New Issue
Block a user