From 55e65f4ad6e9bcf6617e6a11c38b2182e70bec80 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Mon, 25 May 2015 21:39:01 -0700 Subject: [PATCH] GetObjectsByType. --- src/xenia/kernel/object_table.cc | 14 ++++++++++++++ src/xenia/kernel/object_table.h | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/src/xenia/kernel/object_table.cc b/src/xenia/kernel/object_table.cc index 0e2b0946d..d80a93098 100644 --- a/src/xenia/kernel/object_table.cc +++ b/src/xenia/kernel/object_table.cc @@ -185,6 +185,20 @@ XObject* ObjectTable::LookupObject(X_HANDLE handle, bool already_locked) { return object; } +void ObjectTable::GetObjectsByType(XObject::Type type, + std::vector>& results) { + std::lock_guard lock(table_mutex_); + for (uint32_t slot = 0; slot < table_capacity_; ++slot) { + auto& entry = table_[slot]; + if (entry.object) { + if (entry.object->type() == type) { + entry.object->Retain(); + results.push_back(object_ref(entry.object)); + } + } + } +} + X_HANDLE ObjectTable::TranslateHandle(X_HANDLE handle) { if (handle == 0xFFFFFFFF) { // CurrentProcess diff --git a/src/xenia/kernel/object_table.h b/src/xenia/kernel/object_table.h index 786f82a25..e5ba8061e 100644 --- a/src/xenia/kernel/object_table.h +++ b/src/xenia/kernel/object_table.h @@ -38,9 +38,18 @@ class ObjectTable { X_STATUS AddNameMapping(const std::string& name, X_HANDLE handle); void RemoveNameMapping(const std::string& name); X_STATUS GetObjectByName(const std::string& name, X_HANDLE* out_handle); + template + std::vector> GetObjectsByType(XObject::Type type) { + std::vector> results; + GetObjectsByType( + type, *reinterpret_cast>*>(&results)); + return results; + } private: XObject* LookupObject(X_HANDLE handle, bool already_locked); + void GetObjectsByType(XObject::Type type, + std::vector>& results); X_HANDLE TranslateHandle(X_HANDLE handle); X_STATUS FindFreeSlot(uint32_t* out_slot);