1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-01 22:06:40 +00:00

Merge branch 'nodeadlock' into 'master'

Avoid a rare but possible deadlock around mCollisionWorldMutex.

See merge request OpenMW/openmw!525
This commit is contained in:
elsid 2021-01-10 13:41:31 +00:00
commit 8b7f3fe908

View file

@ -360,7 +360,6 @@ namespace MWPhysics
{ {
if (!mDeferAabbUpdate || immediate) if (!mDeferAabbUpdate || immediate)
{ {
std::unique_lock lock(mCollisionWorldMutex);
updatePtrAabb(ptr); updatePtrAabb(ptr);
} }
else else
@ -413,7 +412,7 @@ namespace MWPhysics
void PhysicsTaskScheduler::updateAabbs() void PhysicsTaskScheduler::updateAabbs()
{ {
std::scoped_lock lock(mCollisionWorldMutex, mUpdateAabbMutex); std::scoped_lock lock(mUpdateAabbMutex);
std::for_each(mUpdateAabb.begin(), mUpdateAabb.end(), std::for_each(mUpdateAabb.begin(), mUpdateAabb.end(),
[this](const std::weak_ptr<PtrHolder>& ptr) { updatePtrAabb(ptr); }); [this](const std::weak_ptr<PtrHolder>& ptr) { updatePtrAabb(ptr); });
mUpdateAabb.clear(); mUpdateAabb.clear();
@ -423,6 +422,7 @@ namespace MWPhysics
{ {
if (const auto p = ptr.lock()) if (const auto p = ptr.lock())
{ {
std::scoped_lock lock(mCollisionWorldMutex);
if (const auto actor = std::dynamic_pointer_cast<Actor>(p)) if (const auto actor = std::dynamic_pointer_cast<Actor>(p))
{ {
actor->updateCollisionObjectPosition(); actor->updateCollisionObjectPosition();
@ -454,10 +454,12 @@ namespace MWPhysics
int job = 0; int job = 0;
while (mRemainingSteps && (job = mNextJob.fetch_add(1, std::memory_order_relaxed)) < mNumJobs) while (mRemainingSteps && (job = mNextJob.fetch_add(1, std::memory_order_relaxed)) < mNumJobs)
{ {
MaybeSharedLock lockColWorld(mCollisionWorldMutex, mThreadSafeBullet);
if(const auto actor = mActorsFrameData[job].mActor.lock()) if(const auto actor = mActorsFrameData[job].mActor.lock())
{
MaybeSharedLock lockColWorld(mCollisionWorldMutex, mThreadSafeBullet);
MovementSolver::move(mActorsFrameData[job], mPhysicsDt, mCollisionWorld.get(), *mWorldFrameData); MovementSolver::move(mActorsFrameData[job], mPhysicsDt, mCollisionWorld.get(), *mWorldFrameData);
} }
}
mPostStepBarrier->wait(); mPostStepBarrier->wait();
@ -481,13 +483,13 @@ namespace MWPhysics
void PhysicsTaskScheduler::updateActorsPositions() void PhysicsTaskScheduler::updateActorsPositions()
{ {
std::unique_lock lock(mCollisionWorldMutex);
for (auto& actorData : mActorsFrameData) for (auto& actorData : mActorsFrameData)
{ {
if(const auto actor = actorData.mActor.lock()) if(const auto actor = actorData.mActor.lock())
{ {
if (actor->setPosition(actorData.mPosition)) if (actor->setPosition(actorData.mPosition))
{ {
std::scoped_lock lock(mCollisionWorldMutex);
actor->updateCollisionObjectPosition(); actor->updateCollisionObjectPosition();
mCollisionWorld->updateSingleAabb(actor->getCollisionObject()); mCollisionWorld->updateSingleAabb(actor->getCollisionObject());
} }