summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-01-11 14:46:49 -0200
committerGravatar Yuri Kunde Schlesner2015-01-30 11:47:06 -0200
commit38e7122f23424d40e0555fa40daeff55e23e4da4 (patch)
tree37c52c6f20c49fc1093f9228b5c78406b5cdc6ff /src/core/hle/kernel
parentKernel: Convert Semaphore to not use Handles (diff)
downloadyuzu-38e7122f23424d40e0555fa40daeff55e23e4da4.tar.gz
yuzu-38e7122f23424d40e0555fa40daeff55e23e4da4.tar.xz
yuzu-38e7122f23424d40e0555fa40daeff55e23e4da4.zip
Kernel: Convert AddressArbiter to not use Handles
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp39
-rw-r--r--src/core/hle/kernel/address_arbiter.h24
2 files changed, 31 insertions, 32 deletions
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp
index 2a66f8dd5..2d01e2ef5 100644
--- a/src/core/hle/kernel/address_arbiter.cpp
+++ b/src/core/hle/kernel/address_arbiter.cpp
@@ -15,25 +15,18 @@
15 15
16namespace Kernel { 16namespace Kernel {
17 17
18class AddressArbiter : public Object { 18ResultVal<SharedPtr<AddressArbiter>> AddressArbiter::Create(std::string name) {
19public: 19 SharedPtr<AddressArbiter> address_arbiter(new AddressArbiter);
20 std::string GetTypeName() const override { return "Arbiter"; } 20 // TOOD(yuriks): Don't create Handle (see Thread::Create())
21 std::string GetName() const override { return name; } 21 CASCADE_RESULT(auto unused, Kernel::g_handle_table.Create(address_arbiter));
22 22
23 static const HandleType HANDLE_TYPE = HandleType::AddressArbiter; 23 address_arbiter->name = std::move(name);
24 HandleType GetHandleType() const override { return HANDLE_TYPE; }
25 24
26 std::string name; ///< Name of address arbiter object (optional) 25 return MakeResult<SharedPtr<AddressArbiter>>(std::move(address_arbiter));
27}; 26}
28
29////////////////////////////////////////////////////////////////////////////////////////////////////
30
31ResultCode ArbitrateAddress(Handle handle, ArbitrationType type, u32 address, s32 value, u64 nanoseconds) {
32 AddressArbiter* object = Kernel::g_handle_table.Get<AddressArbiter>(handle).get();
33
34 if (object == nullptr)
35 return InvalidHandle(ErrorModule::Kernel);
36 27
28ResultCode AddressArbiter::ArbitrateAddress(ArbitrationType type, VAddr address, s32 value,
29 u64 nanoseconds) {
37 switch (type) { 30 switch (type) {
38 31
39 // Signal thread(s) waiting for arbitrate address... 32 // Signal thread(s) waiting for arbitrate address...
@@ -91,18 +84,4 @@ ResultCode ArbitrateAddress(Handle handle, ArbitrationType type, u32 address, s3
91 return RESULT_SUCCESS; 84 return RESULT_SUCCESS;
92} 85}
93 86
94static AddressArbiter* CreateAddressArbiter(Handle& handle, const std::string& name) {
95 AddressArbiter* address_arbiter = new AddressArbiter;
96 // TOOD(yuriks): Fix error reporting
97 handle = Kernel::g_handle_table.Create(address_arbiter).ValueOr(INVALID_HANDLE);
98 address_arbiter->name = name;
99 return address_arbiter;
100}
101
102Handle CreateAddressArbiter(const std::string& name) {
103 Handle handle;
104 CreateAddressArbiter(handle, name);
105 return handle;
106}
107
108} // namespace Kernel 87} // namespace Kernel
diff --git a/src/core/hle/kernel/address_arbiter.h b/src/core/hle/kernel/address_arbiter.h
index 81084bdc8..536f0f017 100644
--- a/src/core/hle/kernel/address_arbiter.h
+++ b/src/core/hle/kernel/address_arbiter.h
@@ -26,8 +26,28 @@ enum class ArbitrationType : u32 {
26 DecrementAndWaitIfLessThanWithTimeout, 26 DecrementAndWaitIfLessThanWithTimeout,
27}; 27};
28 28
29ResultCode ArbitrateAddress(Handle handle, ArbitrationType type, u32 address, s32 value, u64 nanoseconds); 29class AddressArbiter : public Object {
30public:
31 /**
32 * Creates an address arbiter.
33 *
34 * @param name Optional name used for debugging.
35 * @returns The created AddressArbiter.
36 */
37 static ResultVal<SharedPtr<AddressArbiter>> Create(std::string name = "Unknown");
30 38
31Handle CreateAddressArbiter(const std::string& name = "Unknown"); 39 std::string GetTypeName() const override { return "Arbiter"; }
40 std::string GetName() const override { return name; }
41
42 static const HandleType HANDLE_TYPE = HandleType::AddressArbiter;
43 HandleType GetHandleType() const override { return HANDLE_TYPE; }
44
45 std::string name; ///< Name of address arbiter object (optional)
46
47 ResultCode ArbitrateAddress(ArbitrationType type, VAddr address, s32 value, u64 nanoseconds);
48
49private:
50 AddressArbiter() = default;
51};
32 52
33} // namespace FileSys 53} // namespace FileSys