summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/event.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2015-01-15 19:29:46 -0500
committerGravatar bunnei2015-01-21 18:43:50 -0500
commite4a5d8ad4f708c9674c9865eb872e3c081d9a8c8 (patch)
tree5604f380890c841fa850de11f84239c9cf7c7191 /src/core/hle/kernel/event.cpp
parentThread: Keep track of multiple wait objects. (diff)
downloadyuzu-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.cpp58
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 */
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);