diff options
| author | 2021-06-06 15:39:11 -0700 | |
|---|---|---|
| committer | 2021-06-06 15:39:11 -0700 | |
| commit | 611983679593d8a666551254bc97490effbb6519 (patch) | |
| tree | 19e9f1fe9664a6b6558258c1c58a30d803e30d93 /src/core/hle/kernel | |
| parent | hle: kernel: Refactor to allocate a ServiceThread per service handler. (diff) | |
| download | yuzu-611983679593d8a666551254bc97490effbb6519.tar.gz yuzu-611983679593d8a666551254bc97490effbb6519.tar.xz yuzu-611983679593d8a666551254bc97490effbb6519.zip | |
hle: kernel: KAutoObjectWithListContainer: Use boost::instrusive::rbtree.
- Fixes some crashes introduced by our common intrusive red/black tree impl.
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/k_auto_object.h | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_auto_object_container.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_auto_object_container.h | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_client_port.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_client_session.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_readable_event.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_port.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_port.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_session.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_session.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_writable_event.cpp | 4 |
11 files changed, 26 insertions, 22 deletions
diff --git a/src/core/hle/kernel/k_auto_object.h b/src/core/hle/kernel/k_auto_object.h index bc18582be..88a052f65 100644 --- a/src/core/hle/kernel/k_auto_object.h +++ b/src/core/hle/kernel/k_auto_object.h | |||
| @@ -7,10 +7,11 @@ | |||
| 7 | #include <atomic> | 7 | #include <atomic> |
| 8 | #include <string> | 8 | #include <string> |
| 9 | 9 | ||
| 10 | #include <boost/intrusive/rbtree.hpp> | ||
| 11 | |||
| 10 | #include "common/assert.h" | 12 | #include "common/assert.h" |
| 11 | #include "common/common_funcs.h" | 13 | #include "common/common_funcs.h" |
| 12 | #include "common/common_types.h" | 14 | #include "common/common_types.h" |
| 13 | #include "common/intrusive_red_black_tree.h" | ||
| 14 | #include "core/hle/kernel/k_class_token.h" | 15 | #include "core/hle/kernel/k_class_token.h" |
| 15 | 16 | ||
| 16 | namespace Kernel { | 17 | namespace Kernel { |
| @@ -175,7 +176,7 @@ private: | |||
| 175 | 176 | ||
| 176 | class KAutoObjectWithListContainer; | 177 | class KAutoObjectWithListContainer; |
| 177 | 178 | ||
| 178 | class KAutoObjectWithList : public KAutoObject { | 179 | class KAutoObjectWithList : public KAutoObject, public boost::intrusive::set_base_hook<> { |
| 179 | public: | 180 | public: |
| 180 | explicit KAutoObjectWithList(KernelCore& kernel_) : KAutoObject(kernel_) {} | 181 | explicit KAutoObjectWithList(KernelCore& kernel_) : KAutoObject(kernel_) {} |
| 181 | 182 | ||
| @@ -192,6 +193,10 @@ public: | |||
| 192 | } | 193 | } |
| 193 | } | 194 | } |
| 194 | 195 | ||
| 196 | friend bool operator<(const KAutoObjectWithList& left, const KAutoObjectWithList& right) { | ||
| 197 | return &left < &right; | ||
| 198 | } | ||
| 199 | |||
| 195 | public: | 200 | public: |
| 196 | virtual u64 GetId() const { | 201 | virtual u64 GetId() const { |
| 197 | return reinterpret_cast<u64>(this); | 202 | return reinterpret_cast<u64>(this); |
| @@ -203,8 +208,6 @@ public: | |||
| 203 | 208 | ||
| 204 | private: | 209 | private: |
| 205 | friend class KAutoObjectWithListContainer; | 210 | friend class KAutoObjectWithListContainer; |
| 206 | |||
| 207 | Common::IntrusiveRedBlackTreeNode list_node; | ||
| 208 | }; | 211 | }; |
| 209 | 212 | ||
| 210 | template <typename T> | 213 | template <typename T> |
diff --git a/src/core/hle/kernel/k_auto_object_container.cpp b/src/core/hle/kernel/k_auto_object_container.cpp index fc0c28874..010006bb7 100644 --- a/src/core/hle/kernel/k_auto_object_container.cpp +++ b/src/core/hle/kernel/k_auto_object_container.cpp | |||
| @@ -9,13 +9,13 @@ namespace Kernel { | |||
| 9 | void KAutoObjectWithListContainer::Register(KAutoObjectWithList* obj) { | 9 | void KAutoObjectWithListContainer::Register(KAutoObjectWithList* obj) { |
| 10 | KScopedLightLock lk(m_lock); | 10 | KScopedLightLock lk(m_lock); |
| 11 | 11 | ||
| 12 | m_object_list.insert(*obj); | 12 | m_object_list.insert_unique(*obj); |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | void KAutoObjectWithListContainer::Unregister(KAutoObjectWithList* obj) { | 15 | void KAutoObjectWithListContainer::Unregister(KAutoObjectWithList* obj) { |
| 16 | KScopedLightLock lk(m_lock); | 16 | KScopedLightLock lk(m_lock); |
| 17 | 17 | ||
| 18 | m_object_list.erase(m_object_list.iterator_to(*obj)); | 18 | m_object_list.erase(*obj); |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | size_t KAutoObjectWithListContainer::GetOwnedCount(KProcess* owner) { | 21 | size_t KAutoObjectWithListContainer::GetOwnedCount(KProcess* owner) { |
diff --git a/src/core/hle/kernel/k_auto_object_container.h b/src/core/hle/kernel/k_auto_object_container.h index ff40cf5a7..459953450 100644 --- a/src/core/hle/kernel/k_auto_object_container.h +++ b/src/core/hle/kernel/k_auto_object_container.h | |||
| @@ -6,6 +6,8 @@ | |||
| 6 | 6 | ||
| 7 | #include <atomic> | 7 | #include <atomic> |
| 8 | 8 | ||
| 9 | #include <boost/intrusive/rbtree.hpp> | ||
| 10 | |||
| 9 | #include "common/assert.h" | 11 | #include "common/assert.h" |
| 10 | #include "common/common_funcs.h" | 12 | #include "common/common_funcs.h" |
| 11 | #include "common/common_types.h" | 13 | #include "common/common_types.h" |
| @@ -23,8 +25,7 @@ class KAutoObjectWithListContainer { | |||
| 23 | YUZU_NON_MOVEABLE(KAutoObjectWithListContainer); | 25 | YUZU_NON_MOVEABLE(KAutoObjectWithListContainer); |
| 24 | 26 | ||
| 25 | public: | 27 | public: |
| 26 | using ListType = Common::IntrusiveRedBlackTreeMemberTraits< | 28 | using ListType = boost::intrusive::rbtree<KAutoObjectWithList>; |
| 27 | &KAutoObjectWithList::list_node>::TreeType<KAutoObjectWithList>; | ||
| 28 | 29 | ||
| 29 | public: | 30 | public: |
| 30 | class ListAccessor : public KScopedLightLock { | 31 | class ListAccessor : public KScopedLightLock { |
diff --git a/src/core/hle/kernel/k_client_port.cpp b/src/core/hle/kernel/k_client_port.cpp index d4a38fb00..50606bd91 100644 --- a/src/core/hle/kernel/k_client_port.cpp +++ b/src/core/hle/kernel/k_client_port.cpp | |||
| @@ -16,11 +16,11 @@ namespace Kernel { | |||
| 16 | KClientPort::KClientPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} | 16 | KClientPort::KClientPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} |
| 17 | KClientPort::~KClientPort() = default; | 17 | KClientPort::~KClientPort() = default; |
| 18 | 18 | ||
| 19 | void KClientPort::Initialize(KPort* parent_, s32 max_sessions_, std::string&& name_) { | 19 | void KClientPort::Initialize(KPort* parent_port_, s32 max_sessions_, std::string&& name_) { |
| 20 | // Set member variables. | 20 | // Set member variables. |
| 21 | num_sessions = 0; | 21 | num_sessions = 0; |
| 22 | peak_sessions = 0; | 22 | peak_sessions = 0; |
| 23 | parent = parent_; | 23 | parent = parent_port_; |
| 24 | max_sessions = max_sessions_; | 24 | max_sessions = max_sessions_; |
| 25 | name = std::move(name_); | 25 | name = std::move(name_); |
| 26 | } | 26 | } |
diff --git a/src/core/hle/kernel/k_client_session.h b/src/core/hle/kernel/k_client_session.h index b11d5b4e3..230e3b6b8 100644 --- a/src/core/hle/kernel/k_client_session.h +++ b/src/core/hle/kernel/k_client_session.h | |||
| @@ -36,9 +36,9 @@ public: | |||
| 36 | explicit KClientSession(KernelCore& kernel_); | 36 | explicit KClientSession(KernelCore& kernel_); |
| 37 | ~KClientSession() override; | 37 | ~KClientSession() override; |
| 38 | 38 | ||
| 39 | void Initialize(KSession* parent_, std::string&& name_) { | 39 | void Initialize(KSession* parent_session_, std::string&& name_) { |
| 40 | // Set member variables. | 40 | // Set member variables. |
| 41 | parent = parent_; | 41 | parent = parent_session_; |
| 42 | name = std::move(name_); | 42 | name = std::move(name_); |
| 43 | } | 43 | } |
| 44 | 44 | ||
diff --git a/src/core/hle/kernel/k_readable_event.h b/src/core/hle/kernel/k_readable_event.h index b2850ac7b..149fa78dd 100644 --- a/src/core/hle/kernel/k_readable_event.h +++ b/src/core/hle/kernel/k_readable_event.h | |||
| @@ -21,9 +21,9 @@ public: | |||
| 21 | explicit KReadableEvent(KernelCore& kernel_); | 21 | explicit KReadableEvent(KernelCore& kernel_); |
| 22 | ~KReadableEvent() override; | 22 | ~KReadableEvent() override; |
| 23 | 23 | ||
| 24 | void Initialize(KEvent* parent_, std::string&& name_) { | 24 | void Initialize(KEvent* parent_event_, std::string&& name_) { |
| 25 | is_signaled = false; | 25 | is_signaled = false; |
| 26 | parent = parent_; | 26 | parent = parent_event_; |
| 27 | name = std::move(name_); | 27 | name = std::move(name_); |
| 28 | } | 28 | } |
| 29 | 29 | ||
diff --git a/src/core/hle/kernel/k_server_port.cpp b/src/core/hle/kernel/k_server_port.cpp index 8cbde177a..c5dc58387 100644 --- a/src/core/hle/kernel/k_server_port.cpp +++ b/src/core/hle/kernel/k_server_port.cpp | |||
| @@ -17,9 +17,9 @@ namespace Kernel { | |||
| 17 | KServerPort::KServerPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} | 17 | KServerPort::KServerPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} |
| 18 | KServerPort::~KServerPort() = default; | 18 | KServerPort::~KServerPort() = default; |
| 19 | 19 | ||
| 20 | void KServerPort::Initialize(KPort* parent_, std::string&& name_) { | 20 | void KServerPort::Initialize(KPort* parent_port_, std::string&& name_) { |
| 21 | // Set member variables. | 21 | // Set member variables. |
| 22 | parent = parent_; | 22 | parent = parent_port_; |
| 23 | name = std::move(name_); | 23 | name = std::move(name_); |
| 24 | } | 24 | } |
| 25 | 25 | ||
diff --git a/src/core/hle/kernel/k_server_port.h b/src/core/hle/kernel/k_server_port.h index 55481d63f..67a36da40 100644 --- a/src/core/hle/kernel/k_server_port.h +++ b/src/core/hle/kernel/k_server_port.h | |||
| @@ -29,7 +29,7 @@ public: | |||
| 29 | explicit KServerPort(KernelCore& kernel_); | 29 | explicit KServerPort(KernelCore& kernel_); |
| 30 | ~KServerPort() override; | 30 | ~KServerPort() override; |
| 31 | 31 | ||
| 32 | void Initialize(KPort* parent_, std::string&& name_); | 32 | void Initialize(KPort* parent_port_, std::string&& name_); |
| 33 | 33 | ||
| 34 | /// Whether or not this server port has an HLE handler available. | 34 | /// Whether or not this server port has an HLE handler available. |
| 35 | bool HasSessionRequestHandler() const { | 35 | bool HasSessionRequestHandler() const { |
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index e66a9198a..3024395dd 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp | |||
| @@ -29,10 +29,10 @@ KServerSession::KServerSession(KernelCore& kernel_) : KSynchronizationObject{ker | |||
| 29 | 29 | ||
| 30 | KServerSession::~KServerSession() {} | 30 | KServerSession::~KServerSession() {} |
| 31 | 31 | ||
| 32 | void KServerSession::Initialize(KSession* parent_, std::string&& name_, | 32 | void KServerSession::Initialize(KSession* parent_session_, std::string&& name_, |
| 33 | std::shared_ptr<SessionRequestManager> manager_) { | 33 | std::shared_ptr<SessionRequestManager> manager_) { |
| 34 | // Set member variables. | 34 | // Set member variables. |
| 35 | parent = parent_; | 35 | parent = parent_session_; |
| 36 | name = std::move(name_); | 36 | name = std::move(name_); |
| 37 | 37 | ||
| 38 | if (manager_) { | 38 | if (manager_) { |
diff --git a/src/core/hle/kernel/k_server_session.h b/src/core/hle/kernel/k_server_session.h index 0f4b51e37..9efd400bc 100644 --- a/src/core/hle/kernel/k_server_session.h +++ b/src/core/hle/kernel/k_server_session.h | |||
| @@ -47,7 +47,7 @@ public: | |||
| 47 | 47 | ||
| 48 | void Destroy() override; | 48 | void Destroy() override; |
| 49 | 49 | ||
| 50 | void Initialize(KSession* parent_, std::string&& name_, | 50 | void Initialize(KSession* parent_session_, std::string&& name_, |
| 51 | std::shared_ptr<SessionRequestManager> manager_); | 51 | std::shared_ptr<SessionRequestManager> manager_); |
| 52 | 52 | ||
| 53 | KSession* GetParent() { | 53 | KSession* GetParent() { |
diff --git a/src/core/hle/kernel/k_writable_event.cpp b/src/core/hle/kernel/k_writable_event.cpp index b7b83c151..bdb1db6d5 100644 --- a/src/core/hle/kernel/k_writable_event.cpp +++ b/src/core/hle/kernel/k_writable_event.cpp | |||
| @@ -13,8 +13,8 @@ KWritableEvent::KWritableEvent(KernelCore& kernel_) | |||
| 13 | 13 | ||
| 14 | KWritableEvent::~KWritableEvent() = default; | 14 | KWritableEvent::~KWritableEvent() = default; |
| 15 | 15 | ||
| 16 | void KWritableEvent::Initialize(KEvent* parent_, std::string&& name_) { | 16 | void KWritableEvent::Initialize(KEvent* parent_event_, std::string&& name_) { |
| 17 | parent = parent_; | 17 | parent = parent_event_; |
| 18 | name = std::move(name_); | 18 | name = std::move(name_); |
| 19 | parent->GetReadableEvent().Open(); | 19 | parent->GetReadableEvent().Open(); |
| 20 | } | 20 | } |