[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:
Herman S.
2026-01-29 15:34:37 +09:00
parent a00fd0eb12
commit 6203d382e2

View File

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