From 72c6cad581acabb44ea3c4d7f685ec2163230edc Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 7 May 2019 15:15:53 -0700 Subject: [PATCH] cleanup _deadWorker in dtor, more correct _nextOrphanExpiry --- libraries/physics/src/ShapeManager.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libraries/physics/src/ShapeManager.cpp b/libraries/physics/src/ShapeManager.cpp index 85587a6c67..c37f95b5f1 100644 --- a/libraries/physics/src/ShapeManager.cpp +++ b/libraries/physics/src/ShapeManager.cpp @@ -30,6 +30,10 @@ ShapeManager::~ShapeManager() { ShapeFactory::deleteShape(shapeRef->shape); } _shapeMap.clear(); + if (_deadWorker) { + delete _deadWorker; + _deadWorker = nullptr; + } } const btCollisionShape* ShapeManager::getShape(const ShapeInfo& info) { @@ -230,12 +234,14 @@ void ShapeManager::acceptWork(ShapeFactory::Worker* worker) { // refCount on expiry we will move it to _garbageRing. const int64_t SHAPE_EXPIRY = USECS_PER_SECOND; auto now = std::chrono::steady_clock::now(); - auto expiry = now + std::chrono::microseconds(SHAPE_EXPIRY); + auto newExpiry = now + std::chrono::microseconds(SHAPE_EXPIRY); if (_nextOrphanExpiry < now) { + _nextOrphanExpiry = newExpiry; // check for expired orphan shapes size_t i = 0; while (i < _orphans.size()) { - if (_orphans[i].expiry < now) { + auto expiry = _orphans[i].expiry; + if (expiry < now) { uint64_t key = _orphans[i].key; HashKey hashKey(key); ShapeReference* shapeRef = _shapeMap.find(hashKey); @@ -248,12 +254,14 @@ void ShapeManager::acceptWork(ShapeFactory::Worker* worker) { _orphans[i] = _orphans.back(); _orphans.pop_back(); } else { + if (expiry < _nextOrphanExpiry) { + _nextOrphanExpiry = expiry; + } ++i; } } } - _nextOrphanExpiry = expiry; - _orphans.push_back(KeyExpiry(newRef.key, expiry)); + _orphans.push_back(KeyExpiry(newRef.key, newExpiry)); } } disconnect(worker, &ShapeFactory::Worker::submitWork, this, &ShapeManager::acceptWork);