summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp39
-rw-r--r--src/core/hle/kernel/address_arbiter.h24
-rw-r--r--src/core/hle/svc.cpp30
3 files changed, 55 insertions, 38 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
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 6cbe38bc3..b093d0368 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -247,16 +247,34 @@ static Result WaitSynchronizationN(s32* out, Handle* handles, s32 handle_count,
247 247
248/// Create an address arbiter (to allocate access to shared resources) 248/// Create an address arbiter (to allocate access to shared resources)
249static Result CreateAddressArbiter(u32* arbiter) { 249static Result CreateAddressArbiter(u32* arbiter) {
250 Handle handle = Kernel::CreateAddressArbiter(); 250 using Kernel::AddressArbiter;
251 *arbiter = handle; 251
252 return 0; 252 ResultVal<SharedPtr<AddressArbiter>> arbiter_res = AddressArbiter::Create();
253 if (arbiter_res.Failed())
254 return arbiter_res.Code().raw;
255
256 ResultVal<Handle> handle_res = Kernel::g_handle_table.Create(*arbiter_res);
257 if (handle_res.Failed())
258 return handle_res.Code().raw;
259
260 LOG_TRACE(Kernel_SVC, "returned handle=0x%08X", *handle_res);
261
262 *arbiter = *handle_res;
263 return RESULT_SUCCESS.raw;
253} 264}
254 265
255/// Arbitrate address 266/// Arbitrate address
256static Result ArbitrateAddress(Handle arbiter, u32 address, u32 type, u32 value, s64 nanoseconds) { 267static Result ArbitrateAddress(Handle handle, u32 address, u32 type, u32 value, s64 nanoseconds) {
257 LOG_TRACE(Kernel_SVC, "called handle=0x%08X, address=0x%08X, type=0x%08X, value=0x%08X", arbiter, 268 using Kernel::AddressArbiter;
269
270 LOG_TRACE(Kernel_SVC, "called handle=0x%08X, address=0x%08X, type=0x%08X, value=0x%08X", handle,
258 address, type, value); 271 address, type, value);
259 return Kernel::ArbitrateAddress(arbiter, static_cast<Kernel::ArbitrationType>(type), 272
273 SharedPtr<AddressArbiter> arbiter = Kernel::g_handle_table.Get<AddressArbiter>(handle);
274 if (arbiter == nullptr)
275 return InvalidHandle(ErrorModule::Kernel).raw;
276
277 return arbiter->ArbitrateAddress(static_cast<Kernel::ArbitrationType>(type),
260 address, value, nanoseconds).raw; 278 address, value, nanoseconds).raw;
261} 279}
262 280