summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2021-06-06 15:39:11 -0700
committerGravatar bunnei2021-06-06 15:39:11 -0700
commit611983679593d8a666551254bc97490effbb6519 (patch)
tree19e9f1fe9664a6b6558258c1c58a30d803e30d93 /src
parenthle: kernel: Refactor to allocate a ServiceThread per service handler. (diff)
downloadyuzu-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')
-rw-r--r--src/core/hle/kernel/k_auto_object.h11
-rw-r--r--src/core/hle/kernel/k_auto_object_container.cpp4
-rw-r--r--src/core/hle/kernel/k_auto_object_container.h5
-rw-r--r--src/core/hle/kernel/k_client_port.cpp4
-rw-r--r--src/core/hle/kernel/k_client_session.h4
-rw-r--r--src/core/hle/kernel/k_readable_event.h4
-rw-r--r--src/core/hle/kernel/k_server_port.cpp4
-rw-r--r--src/core/hle/kernel/k_server_port.h2
-rw-r--r--src/core/hle/kernel/k_server_session.cpp4
-rw-r--r--src/core/hle/kernel/k_server_session.h2
-rw-r--r--src/core/hle/kernel/k_writable_event.cpp4
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
16namespace Kernel { 17namespace Kernel {
@@ -175,7 +176,7 @@ private:
175 176
176class KAutoObjectWithListContainer; 177class KAutoObjectWithListContainer;
177 178
178class KAutoObjectWithList : public KAutoObject { 179class KAutoObjectWithList : public KAutoObject, public boost::intrusive::set_base_hook<> {
179public: 180public:
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
195public: 200public:
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
204private: 209private:
205 friend class KAutoObjectWithListContainer; 210 friend class KAutoObjectWithListContainer;
206
207 Common::IntrusiveRedBlackTreeNode list_node;
208}; 211};
209 212
210template <typename T> 213template <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 {
9void KAutoObjectWithListContainer::Register(KAutoObjectWithList* obj) { 9void 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
15void KAutoObjectWithListContainer::Unregister(KAutoObjectWithList* obj) { 15void 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
21size_t KAutoObjectWithListContainer::GetOwnedCount(KProcess* owner) { 21size_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
25public: 27public:
26 using ListType = Common::IntrusiveRedBlackTreeMemberTraits< 28 using ListType = boost::intrusive::rbtree<KAutoObjectWithList>;
27 &KAutoObjectWithList::list_node>::TreeType<KAutoObjectWithList>;
28 29
29public: 30public:
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 {
16KClientPort::KClientPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} 16KClientPort::KClientPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {}
17KClientPort::~KClientPort() = default; 17KClientPort::~KClientPort() = default;
18 18
19void KClientPort::Initialize(KPort* parent_, s32 max_sessions_, std::string&& name_) { 19void 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 {
17KServerPort::KServerPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} 17KServerPort::KServerPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {}
18KServerPort::~KServerPort() = default; 18KServerPort::~KServerPort() = default;
19 19
20void KServerPort::Initialize(KPort* parent_, std::string&& name_) { 20void 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
30KServerSession::~KServerSession() {} 30KServerSession::~KServerSession() {}
31 31
32void KServerSession::Initialize(KSession* parent_, std::string&& name_, 32void 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
14KWritableEvent::~KWritableEvent() = default; 14KWritableEvent::~KWritableEvent() = default;
15 15
16void KWritableEvent::Initialize(KEvent* parent_, std::string&& name_) { 16void 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}