1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-21 04:39:42 +00:00

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.
This commit is contained in:
elsid 2024-04-26 16:08:01 +02:00
parent acf1e51a28
commit 5261f0c5cf
No known key found for this signature in database
GPG key ID: 4DE04C198CBA7625

View file

@ -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);
}