diff options
| author | 2015-01-23 03:11:25 -0200 | |
|---|---|---|
| committer | 2015-01-30 11:49:43 -0200 | |
| commit | d52d85993683a6948285801ab54d51c79c98afba (patch) | |
| tree | 98b4d084c26198ad4bb8a0d8fd84f1a411a32ff6 /src/core/hle/kernel/event.cpp | |
| parent | Kernel: Convert Timer to (mostly) not use Handles (diff) | |
| download | yuzu-d52d85993683a6948285801ab54d51c79c98afba.tar.gz yuzu-d52d85993683a6948285801ab54d51c79c98afba.tar.xz yuzu-d52d85993683a6948285801ab54d51c79c98afba.zip | |
Kernel: Convert Event to not use Handles
Diffstat (limited to 'src/core/hle/kernel/event.cpp')
| -rw-r--r-- | src/core/hle/kernel/event.cpp | 83 |
1 files changed, 21 insertions, 62 deletions
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp index 74df47a05..d9ad40c6a 100644 --- a/src/core/hle/kernel/event.cpp +++ b/src/core/hle/kernel/event.cpp | |||
| @@ -14,78 +14,37 @@ | |||
| 14 | 14 | ||
| 15 | namespace Kernel { | 15 | namespace Kernel { |
| 16 | 16 | ||
| 17 | class Event : public WaitObject { | 17 | ResultVal<SharedPtr<Event>> Event::Create(ResetType reset_type, std::string name) { |
| 18 | public: | 18 | SharedPtr<Event> evt(new Event); |
| 19 | std::string GetTypeName() const override { return "Event"; } | 19 | // TOOD(yuriks): Don't create Handle (see Thread::Create()) |
| 20 | std::string GetName() const override { return name; } | 20 | CASCADE_RESULT(auto unused, Kernel::g_handle_table.Create(evt)); |
| 21 | |||
| 22 | static const HandleType HANDLE_TYPE = HandleType::Event; | ||
| 23 | HandleType GetHandleType() const override { return HANDLE_TYPE; } | ||
| 24 | |||
| 25 | ResetType intitial_reset_type; ///< ResetType specified at Event initialization | ||
| 26 | ResetType reset_type; ///< Current ResetType | ||
| 27 | |||
| 28 | bool signaled; ///< Whether the event has already been signaled | ||
| 29 | std::string name; ///< Name of event (optional) | ||
| 30 | |||
| 31 | bool ShouldWait() override { | ||
| 32 | return !signaled; | ||
| 33 | } | ||
| 34 | |||
| 35 | void Acquire() override { | ||
| 36 | _assert_msg_(Kernel, !ShouldWait(), "object unavailable!"); | ||
| 37 | |||
| 38 | // Release the event if it's not sticky... | ||
| 39 | if (reset_type != RESETTYPE_STICKY) | ||
| 40 | signaled = false; | ||
| 41 | } | ||
| 42 | }; | ||
| 43 | |||
| 44 | ResultCode SignalEvent(const Handle handle) { | ||
| 45 | Event* evt = g_handle_table.Get<Event>(handle).get(); | ||
| 46 | if (evt == nullptr) | ||
| 47 | return InvalidHandle(ErrorModule::Kernel); | ||
| 48 | |||
| 49 | evt->signaled = true; | ||
| 50 | evt->WakeupAllWaitingThreads(); | ||
| 51 | |||
| 52 | return RESULT_SUCCESS; | ||
| 53 | } | ||
| 54 | |||
| 55 | ResultCode ClearEvent(Handle handle) { | ||
| 56 | Event* evt = g_handle_table.Get<Event>(handle).get(); | ||
| 57 | if (evt == nullptr) | ||
| 58 | return InvalidHandle(ErrorModule::Kernel); | ||
| 59 | 21 | ||
| 60 | evt->signaled = false; | 22 | evt->signaled = false; |
| 23 | evt->reset_type = evt->intitial_reset_type = reset_type; | ||
| 24 | evt->name = std::move(name); | ||
| 61 | 25 | ||
| 62 | return RESULT_SUCCESS; | 26 | return MakeResult<SharedPtr<Event>>(evt); |
| 63 | } | 27 | } |
| 64 | 28 | ||
| 65 | /** | 29 | bool Event::ShouldWait() { |
| 66 | * Creates an event | 30 | return !signaled; |
| 67 | * @param handle Reference to handle for the newly created mutex | 31 | } |
| 68 | * @param reset_type ResetType describing how to create event | ||
| 69 | * @param name Optional name of event | ||
| 70 | * @return Newly created Event object | ||
| 71 | */ | ||
| 72 | static Event* CreateEvent(Handle& handle, const ResetType reset_type, const std::string& name) { | ||
| 73 | Event* evt = new Event; | ||
| 74 | 32 | ||
| 75 | // TOOD(yuriks): Fix error reporting | 33 | void Event::Acquire() { |
| 76 | handle = Kernel::g_handle_table.Create(evt).ValueOr(INVALID_HANDLE); | 34 | _assert_msg_(Kernel, !ShouldWait(), "object unavailable!"); |
| 77 | 35 | ||
| 78 | evt->signaled = false; | 36 | // Release the event if it's not sticky... |
| 79 | evt->reset_type = evt->intitial_reset_type = reset_type; | 37 | if (reset_type != RESETTYPE_STICKY) |
| 80 | evt->name = name; | 38 | signaled = false; |
| 39 | } | ||
| 81 | 40 | ||
| 82 | return evt; | 41 | void Event::Signal() { |
| 42 | signaled = true; | ||
| 43 | WakeupAllWaitingThreads(); | ||
| 83 | } | 44 | } |
| 84 | 45 | ||
| 85 | Handle CreateEvent(const ResetType reset_type, const std::string& name) { | 46 | void Event::Clear() { |
| 86 | Handle handle; | 47 | signaled = false; |
| 87 | Event* evt = CreateEvent(handle, reset_type, name); | ||
| 88 | return handle; | ||
| 89 | } | 48 | } |
| 90 | 49 | ||
| 91 | } // namespace | 50 | } // namespace |