diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/event.cpp | 58 | ||||
| -rw-r--r-- | src/core/hle/kernel/event.h | 9 | ||||
| -rw-r--r-- | src/core/hle/service/apt_u.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/srv.cpp | 2 |
4 files changed, 16 insertions, 57 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); |
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/event.h index b1b9d4b7b..c08b12ee1 100644 --- a/src/core/hle/kernel/event.h +++ b/src/core/hle/kernel/event.h | |||
| @@ -12,21 +12,16 @@ | |||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | 13 | ||
| 14 | /** | 14 | /** |
| 15 | * Changes whether an event is locked or not | ||
| 16 | * @param handle Handle to event to change | ||
| 17 | * @param locked Boolean locked value to set event | ||
| 18 | */ | ||
| 19 | ResultCode SetEventLocked(const Handle handle, const bool locked); | ||
| 20 | |||
| 21 | /** | ||
| 22 | * Signals an event | 15 | * Signals an event |
| 23 | * @param handle Handle to event to signal | 16 | * @param handle Handle to event to signal |
| 17 | * @return Result of operation, 0 on success, otherwise error code | ||
| 24 | */ | 18 | */ |
| 25 | ResultCode SignalEvent(const Handle handle); | 19 | ResultCode SignalEvent(const Handle handle); |
| 26 | 20 | ||
| 27 | /** | 21 | /** |
| 28 | * Clears an event | 22 | * Clears an event |
| 29 | * @param handle Handle to event to clear | 23 | * @param handle Handle to event to clear |
| 24 | * @return Result of operation, 0 on success, otherwise error code | ||
| 30 | */ | 25 | */ |
| 31 | ResultCode ClearEvent(Handle handle); | 26 | ResultCode ClearEvent(Handle handle); |
| 32 | 27 | ||
diff --git a/src/core/hle/service/apt_u.cpp b/src/core/hle/service/apt_u.cpp index 69a7bcf92..d318de3d2 100644 --- a/src/core/hle/service/apt_u.cpp +++ b/src/core/hle/service/apt_u.cpp | |||
| @@ -50,8 +50,8 @@ void Initialize(Service::Interface* self) { | |||
| 50 | cmd_buff[3] = notification_event_handle; | 50 | cmd_buff[3] = notification_event_handle; |
| 51 | cmd_buff[4] = pause_event_handle; | 51 | cmd_buff[4] = pause_event_handle; |
| 52 | 52 | ||
| 53 | Kernel::SetEventLocked(notification_event_handle, true); | 53 | Kernel::ClearEvent(notification_event_handle); |
| 54 | Kernel::SetEventLocked(pause_event_handle, false); // Fire start event | 54 | Kernel::SignalEvent(pause_event_handle); // Fire start event |
| 55 | 55 | ||
| 56 | _assert_msg_(KERNEL, (0 != lock_handle), "Cannot initialize without lock"); | 56 | _assert_msg_(KERNEL, (0 != lock_handle), "Cannot initialize without lock"); |
| 57 | Kernel::ReleaseMutex(lock_handle); | 57 | Kernel::ReleaseMutex(lock_handle); |
diff --git a/src/core/hle/service/srv.cpp b/src/core/hle/service/srv.cpp index ac5f30a28..082834cfe 100644 --- a/src/core/hle/service/srv.cpp +++ b/src/core/hle/service/srv.cpp | |||
| @@ -24,7 +24,7 @@ static void GetProcSemaphore(Service::Interface* self) { | |||
| 24 | 24 | ||
| 25 | // TODO(bunnei): Change to a semaphore once these have been implemented | 25 | // TODO(bunnei): Change to a semaphore once these have been implemented |
| 26 | g_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "SRV:Event"); | 26 | g_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "SRV:Event"); |
| 27 | Kernel::SetEventLocked(g_event_handle, false); | 27 | Kernel::ClearEvent(g_event_handle); |
| 28 | 28 | ||
| 29 | cmd_buff[1] = 0; // No error | 29 | cmd_buff[1] = 0; // No error |
| 30 | cmd_buff[3] = g_event_handle; | 30 | cmd_buff[3] = g_event_handle; |