Skip to content

Commit acd2ed2

Browse files
committed
Added deleted subgraph count to DeleteQueue::wait_then_clear() and DeleteQueue::clear().
1 parent 8e2e7c5 commit acd2ed2

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

include/vsg/threading/DeleteQueue.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,13 @@ namespace vsg
112112
_cv.notify_one();
113113
}
114114

115-
void wait_then_clear();
115+
/// wait till there are items to delete then delete objects scheduled for deletion more than retainForFrameCount,
116+
/// return number of objects assigned directly to DeleteQeue that have been deleted (doesn't count children deleted.)
117+
size_t wait_then_clear();
116118

117-
void clear();
119+
/// immediately delete objects scheduled for deletion for more than retainForFrameCount,
120+
/// return number of objects assigned directly to DeleteQeue that have been deleted (doesn't count children deleted.)
121+
size_t clear();
118122

119123
protected:
120124
virtual ~DeleteQueue();

src/vsg/threading/DeleteQueue.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)