IoUringAssmEngine: Acquire spinlock in stall timeout branch
This commit is contained in:
@@ -418,6 +418,23 @@ public:
|
|||||||
// Check if timer was cancelled (ignore if operation_aborted)
|
// Check if timer was cancelled (ignore if operation_aborted)
|
||||||
if (error == boost::asio::error::operation_aborted) { return; }
|
if (error == boost::asio::error::operation_aborted) { return; }
|
||||||
|
|
||||||
|
/** EXPLANATION:
|
||||||
|
* This lock acquisition here will also cover the call to
|
||||||
|
* assembleFrameReq3 below. Because of that, it means that the
|
||||||
|
* requirement that the lock be held while accessing
|
||||||
|
* the metadata that's destroyed in stop() is satisfied.
|
||||||
|
*
|
||||||
|
* In theory though, we shouldn't need to hold the lock into
|
||||||
|
* assembleFrameReq3 below because that function doesn't really access
|
||||||
|
* any state that's destroyed in stop()? But I'm not sure, and we have
|
||||||
|
* indeed seen a SEGFAULT even in the current code with locking, so
|
||||||
|
* I'm going to hold the lock here for now.
|
||||||
|
*/
|
||||||
|
SpinLock::Guard lock(context->engine.isAssemblingLock);
|
||||||
|
|
||||||
|
if (!context->engine.isAssembling)
|
||||||
|
{ return; }
|
||||||
|
|
||||||
// Set timer fired flag
|
// Set timer fired flag
|
||||||
context->timerFired.store(true);
|
context->timerFired.store(true);
|
||||||
context->assembleFrameReq3(context);
|
context->assembleFrameReq3(context);
|
||||||
|
|||||||
Reference in New Issue
Block a user