1 // Copyright 2014 Citra Emulator Project
2 // Licensed under GPLv2 or any later version
3 // Refer to the license.txt file included.
4 
5 #pragma once
6 
7 #include <memory>
8 
9 #include "core/hle/kernel/object.h"
10 
11 namespace Kernel {
12 
13 class KernelCore;
14 class ReadableEvent;
15 class WritableEvent;
16 
17 struct EventPair {
18     std::shared_ptr<ReadableEvent> readable;
19     std::shared_ptr<WritableEvent> writable;
20 };
21 
22 class WritableEvent final : public Object {
23 public:
24     ~WritableEvent() override;
25 
26     /**
27      * Creates an event
28      * @param kernel The kernel instance to create this event under.
29      * @param name Optional name of event
30      */
31     static EventPair CreateEventPair(KernelCore& kernel, std::string name = "Unknown");
32 
GetTypeName()33     std::string GetTypeName() const override {
34         return "WritableEvent";
35     }
GetName()36     std::string GetName() const override {
37         return name;
38     }
39 
40     static constexpr HandleType HANDLE_TYPE = HandleType::WritableEvent;
GetHandleType()41     HandleType GetHandleType() const override {
42         return HANDLE_TYPE;
43     }
44 
45     std::shared_ptr<ReadableEvent> GetReadableEvent() const;
46 
47     void Signal();
48     void Clear();
49     bool IsSignaled() const;
50 
51 private:
52     explicit WritableEvent(KernelCore& kernel);
53 
54     std::shared_ptr<ReadableEvent> readable;
55 
56     std::string name; ///< Name of event (optional)
57 };
58 
59 } // namespace Kernel
60