@@ -41,7 +41,7 @@ void DeleteQueue::advance(ref_ptr<FrameStamp> frameStamp)
4141 }
4242}
4343
44- void DeleteQueue::wait_then_clear ()
44+ size_t DeleteQueue::wait_then_clear ()
4545{
4646 ObjectsToDelete objectsToDelete;
4747 std::list<ref_ptr<SharedObjects>> sharedObjectsToPrune;
@@ -77,29 +77,41 @@ void DeleteQueue::wait_then_clear()
7777 }
7878 sharedObjectsToPrune.clear ();
7979 }
80+
81+ return numObjectsToDelete;
8082}
8183
82- void DeleteQueue::clear ()
84+ size_t DeleteQueue::clear ()
8385{
8486 ObjectsToDelete objectsToDelete;
87+ std::list<ref_ptr<SharedObjects>> sharedObjectsToPrune;
8588
8689 // use a swap of the container to keep the time the mutex is acquired as short as possible
8790 {
8891 std::scoped_lock lock (_mutex);
89- objectsToDelete.swap (_objectsToDelete);
92+
93+ auto last_itr = std::find_if (_objectsToDelete.begin (), _objectsToDelete.end (), [&](const ObjectToDelete& otd) { return otd.frameCount > frameCount; });
94+
95+ // use a swap of the container to keep the time the mutex is acquired as short as possible
96+ objectsToDelete.splice (objectsToDelete.end (), _objectsToDelete, _objectsToDelete.begin (), last_itr);
97+
98+ sharedObjectsToPrune.swap (_sharedObjectsToPrune);
9099 }
91100
92101 size_t numObjectsToDelete = objectsToDelete.size ();
93102
94103 // vsg::info("DeleteQueue::clear(), releasing ", nodesToRelease.size());
104+
95105 objectsToDelete.clear ();
96106
97107 if (numObjectsToDelete > 0 )
98108 {
99- for (auto & sharedObjects : _sharedObjectsToPrune )
109+ for (auto & sharedObjects : sharedObjectsToPrune )
100110 {
101111 sharedObjects->prune ();
102112 }
103- _sharedObjectsToPrune .clear ();
113+ sharedObjectsToPrune .clear ();
104114 }
115+
116+ return numObjectsToDelete;
105117}
0 commit comments