From 6203d382e2933a0b286a459f9f5599d2e7f877fb Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Thu, 29 Jan 2026 15:34:37 +0900 Subject: [PATCH] [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. --- src/xenia/kernel/util/object_table.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/xenia/kernel/util/object_table.cc b/src/xenia/kernel/util/object_table.cc index fa06cb4c1..4e6dc1b65 100644 --- a/src/xenia/kernel/util/object_table.cc +++ b/src/xenia/kernel/util/object_table.cc @@ -25,16 +25,21 @@ ObjectTable::~ObjectTable() { Reset(); } void ObjectTable::Reset() { 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++) { ObjectTableEntry& entry = table_[n]; if (entry.object) { + entry.object->handles().clear(); + entry.handle_ref_count = 0; entry.object->Release(); } } for (uint32_t n = 0; n < host_table_capacity_; n++) { ObjectTableEntry& entry = host_table_[n]; if (entry.object) { + entry.object->handles().clear(); + entry.handle_ref_count = 0; entry.object->Release(); } }