[Kernel] Clear object handles before release in ObjectTable::Reset
During bulk teardown, objects still had stale handle entries when Release() triggered their destructors, hitting the handles_.empty() assertion.
This commit is contained in:
@@ -25,16 +25,21 @@ ObjectTable::~ObjectTable() { Reset(); }
|
|||||||
void ObjectTable::Reset() {
|
void ObjectTable::Reset() {
|
||||||
auto global_lock = global_critical_region_.Acquire();
|
auto global_lock = global_critical_region_.Acquire();
|
||||||
|
|
||||||
// Release all objects.
|
// Release all objects, clearing their handles first so destructors
|
||||||
|
// don't assert on non-empty handles_.
|
||||||
for (uint32_t n = 0; n < table_capacity_; n++) {
|
for (uint32_t n = 0; n < table_capacity_; n++) {
|
||||||
ObjectTableEntry& entry = table_[n];
|
ObjectTableEntry& entry = table_[n];
|
||||||
if (entry.object) {
|
if (entry.object) {
|
||||||
|
entry.object->handles().clear();
|
||||||
|
entry.handle_ref_count = 0;
|
||||||
entry.object->Release();
|
entry.object->Release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (uint32_t n = 0; n < host_table_capacity_; n++) {
|
for (uint32_t n = 0; n < host_table_capacity_; n++) {
|
||||||
ObjectTableEntry& entry = host_table_[n];
|
ObjectTableEntry& entry = host_table_[n];
|
||||||
if (entry.object) {
|
if (entry.object) {
|
||||||
|
entry.object->handles().clear();
|
||||||
|
entry.handle_ref_count = 0;
|
||||||
entry.object->Release();
|
entry.object->Release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user