summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/event.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-01-23 03:11:25 -0200
committerGravatar Yuri Kunde Schlesner2015-01-30 11:49:43 -0200
commitd52d85993683a6948285801ab54d51c79c98afba (patch)
tree98b4d084c26198ad4bb8a0d8fd84f1a411a32ff6 /src/core/hle/kernel/event.cpp
parentKernel: Convert Timer to (mostly) not use Handles (diff)
downloadyuzu-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.cpp83
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
15namespace Kernel { 15namespace Kernel {
16 16
17class Event : public WaitObject { 17ResultVal<SharedPtr<Event>> Event::Create(ResetType reset_type, std::string name) {
18public: 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
44ResultCode 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
55ResultCode 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/** 29bool 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 */
72static 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 33void 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; 41void Event::Signal() {
42 signaled = true;
43 WakeupAllWaitingThreads();
83} 44}
84 45
85Handle CreateEvent(const ResetType reset_type, const std::string& name) { 46void 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