Modify PhysicsTaskScheduler::mCollisionObjects under lock

addCollisionObject is called from the main thread and removeCollisionObject is
usually called from the main thread and rarely from one of the physics worker
threads. This usually happens on cell unloading when object is already removed
from the scene but there is active simulation for it. Which possible because
it's a shared pointer.

There is getUserPointer function which only reads from the container but it's
called only when there is no active simulation so no lock is required.
pull/3235/head
elsid 3 weeks ago
parent acf1e51a28
commit 5261f0c5cf
No known key found for this signature in database
GPG Key ID: 4DE04C198CBA7625

@ -653,15 +653,15 @@ namespace MWPhysics
void PhysicsTaskScheduler::addCollisionObject(
btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask)
{
mCollisionObjects.insert(collisionObject);
MaybeExclusiveLock lock(mCollisionWorldMutex, mLockingPolicy);
mCollisionObjects.insert(collisionObject);
mCollisionWorld->addCollisionObject(collisionObject, collisionFilterGroup, collisionFilterMask);
}
void PhysicsTaskScheduler::removeCollisionObject(btCollisionObject* collisionObject)
{
mCollisionObjects.erase(collisionObject);
MaybeExclusiveLock lock(mCollisionWorldMutex, mLockingPolicy);
mCollisionObjects.erase(collisionObject);
mCollisionWorld->removeCollisionObject(collisionObject);
}

Loading…
Cancel
Save