summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/event.cpp58
-rw-r--r--src/core/hle/kernel/event.h9
-rw-r--r--src/core/hle/service/apt_u.cpp4
-rw-r--r--src/core/hle/service/srv.cpp2
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 */
50ResultCode 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 */
64ResultCode SignalEvent(const Handle handle) { 41ResultCode 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 */
83ResultCode ClearEvent(Handle handle) { 52ResultCode 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 */
118Handle CreateEvent(const ResetType reset_type, const std::string& name) { 82Handle 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 @@
12namespace Kernel { 12namespace 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 */
19ResultCode 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 */
25ResultCode SignalEvent(const Handle handle); 19ResultCode 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 */
31ResultCode ClearEvent(Handle handle); 26ResultCode 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;