diff options
| author | 2015-01-15 19:29:46 -0500 | |
|---|---|---|
| committer | 2015-01-21 18:43:50 -0500 | |
| commit | e4a5d8ad4f708c9674c9865eb872e3c081d9a8c8 (patch) | |
| tree | 5604f380890c841fa850de11f84239c9cf7c7191 /src/core/hle/kernel/event.cpp | |
| parent | Thread: Keep track of multiple wait objects. (diff) | |
| download | yuzu-e4a5d8ad4f708c9674c9865eb872e3c081d9a8c8.tar.gz yuzu-e4a5d8ad4f708c9674c9865eb872e3c081d9a8c8.tar.xz yuzu-e4a5d8ad4f708c9674c9865eb872e3c081d9a8c8.zip | |
Event: Fixed some bugs and cleanup (Subv)
Diffstat (limited to 'src/core/hle/kernel/event.cpp')
| -rw-r--r-- | src/core/hle/kernel/event.cpp | 58 |
1 files changed, 11 insertions, 47 deletions
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp index 9dd3d0f5d..540199e03 100644 --- a/src/core/hle/kernel/event.cpp +++ b/src/core/hle/kernel/event.cpp | |||
| @@ -25,66 +25,36 @@ public: | |||
| 25 | ResetType intitial_reset_type; ///< ResetType specified at Event initialization | 25 | ResetType intitial_reset_type; ///< ResetType specified at Event initialization |
| 26 | ResetType reset_type; ///< Current ResetType | 26 | ResetType reset_type; ///< Current ResetType |
| 27 | 27 | ||
| 28 | bool locked; ///< Event signal wait | 28 | bool signaled; ///< Whether the event has already been signaled |
| 29 | std::string name; ///< Name of event (optional) | 29 | std::string name; ///< Name of event (optional) |
| 30 | 30 | ||
| 31 | ResultVal<bool> WaitSynchronization() override { | 31 | ResultVal<bool> WaitSynchronization() override { |
| 32 | bool wait = locked; | 32 | bool wait = !signaled; |
| 33 | if (locked) { | 33 | if (wait) { |
| 34 | AddWaitingThread(GetCurrentThread()); | 34 | AddWaitingThread(GetCurrentThread()); |
| 35 | Kernel::WaitCurrentThread(WAITTYPE_EVENT, this); | 35 | Kernel::WaitCurrentThread(WAITTYPE_EVENT, this); |
| 36 | } | 36 | } |
| 37 | if (reset_type != RESETTYPE_STICKY) { | ||
| 38 | locked = true; | ||
| 39 | } | ||
| 40 | return MakeResult<bool>(wait); | 37 | return MakeResult<bool>(wait); |
| 41 | } | 38 | } |
| 42 | }; | 39 | }; |
| 43 | 40 | ||
| 44 | /** | ||
| 45 | * Changes whether an event is locked or not | ||
| 46 | * @param handle Handle to event to change | ||
| 47 | * @param locked Boolean locked value to set event | ||
| 48 | * @return Result of operation, 0 on success, otherwise error code | ||
| 49 | */ | ||
| 50 | ResultCode SetEventLocked(const Handle handle, const bool locked) { | ||
| 51 | Event* evt = g_handle_table.Get<Event>(handle).get(); | ||
| 52 | if (evt == nullptr) return InvalidHandle(ErrorModule::Kernel); | ||
| 53 | |||
| 54 | evt->locked = locked; | ||
| 55 | |||
| 56 | return RESULT_SUCCESS; | ||
| 57 | } | ||
| 58 | |||
| 59 | /** | ||
| 60 | * Signals an event | ||
| 61 | * @param handle Handle to event to signal | ||
| 62 | * @return Result of operation, 0 on success, otherwise error code | ||
| 63 | */ | ||
| 64 | ResultCode SignalEvent(const Handle handle) { | 41 | ResultCode SignalEvent(const Handle handle) { |
| 65 | Event* evt = g_handle_table.Get<Event>(handle).get(); | 42 | Event* evt = g_handle_table.Get<Event>(handle).get(); |
| 66 | if (evt == nullptr) return InvalidHandle(ErrorModule::Kernel); | 43 | if (evt == nullptr) |
| 44 | return InvalidHandle(ErrorModule::Kernel); | ||
| 67 | 45 | ||
| 68 | // If any thread is signalled awake by this event, assume the event was "caught" and reset | 46 | evt->signaled = true; |
| 69 | // the event. This will result in the next thread waiting on the event to block. Otherwise, | 47 | evt->ReleaseAllWaitingThreads(); |
| 70 | // the event will not be reset, and the next thread to call WaitSynchronization on it will | ||
| 71 | // not block. Not sure if this is correct behavior, but it seems to work. | ||
| 72 | // TODO(bunnei): Test how this works on hardware | ||
| 73 | evt->locked = evt->ResumeAllWaitingThreads(); | ||
| 74 | 48 | ||
| 75 | return RESULT_SUCCESS; | 49 | return RESULT_SUCCESS; |
| 76 | } | 50 | } |
| 77 | 51 | ||
| 78 | /** | ||
| 79 | * Clears an event | ||
| 80 | * @param handle Handle to event to clear | ||
| 81 | * @return Result of operation, 0 on success, otherwise error code | ||
| 82 | */ | ||
| 83 | ResultCode ClearEvent(Handle handle) { | 52 | ResultCode ClearEvent(Handle handle) { |
| 84 | Event* evt = g_handle_table.Get<Event>(handle).get(); | 53 | Event* evt = g_handle_table.Get<Event>(handle).get(); |
| 85 | if (evt == nullptr) return InvalidHandle(ErrorModule::Kernel); | 54 | if (evt == nullptr) |
| 55 | return InvalidHandle(ErrorModule::Kernel); | ||
| 86 | 56 | ||
| 87 | evt->locked = true; | 57 | evt->signaled = false; |
| 88 | 58 | ||
| 89 | return RESULT_SUCCESS; | 59 | return RESULT_SUCCESS; |
| 90 | } | 60 | } |
| @@ -102,19 +72,13 @@ Event* CreateEvent(Handle& handle, const ResetType reset_type, const std::string | |||
| 102 | // TOOD(yuriks): Fix error reporting | 72 | // TOOD(yuriks): Fix error reporting |
| 103 | handle = Kernel::g_handle_table.Create(evt).ValueOr(INVALID_HANDLE); | 73 | handle = Kernel::g_handle_table.Create(evt).ValueOr(INVALID_HANDLE); |
| 104 | 74 | ||
| 105 | evt->locked = true; | 75 | evt->signaled = false; |
| 106 | evt->reset_type = evt->intitial_reset_type = reset_type; | 76 | evt->reset_type = evt->intitial_reset_type = reset_type; |
| 107 | evt->name = name; | 77 | evt->name = name; |
| 108 | 78 | ||
| 109 | return evt; | 79 | return evt; |
| 110 | } | 80 | } |
| 111 | 81 | ||
| 112 | /** | ||
| 113 | * Creates an event | ||
| 114 | * @param reset_type ResetType describing how to create event | ||
| 115 | * @param name Optional name of event | ||
| 116 | * @return Handle to newly created Event object | ||
| 117 | */ | ||
| 118 | Handle CreateEvent(const ResetType reset_type, const std::string& name) { | 82 | Handle CreateEvent(const ResetType reset_type, const std::string& name) { |
| 119 | Handle handle; | 83 | Handle handle; |
| 120 | Event* evt = CreateEvent(handle, reset_type, name); | 84 | Event* evt = CreateEvent(handle, reset_type, name); |