Merge pull request #1853 from lioncash/event

kernel/object: Amend handle types to distinguish between readable and writable events
This commit is contained in:
bunnei 2018-12-04 12:25:40 -05:00 committed by GitHub
commit d533767623
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 20 additions and 11 deletions

View File

@ -13,7 +13,7 @@ Object::~Object() = default;
bool Object::IsWaitable() const { bool Object::IsWaitable() const {
switch (GetHandleType()) { switch (GetHandleType()) {
case HandleType::Event: case HandleType::ReadableEvent:
case HandleType::Thread: case HandleType::Thread:
case HandleType::Timer: case HandleType::Timer:
case HandleType::ServerPort: case HandleType::ServerPort:
@ -21,6 +21,7 @@ bool Object::IsWaitable() const {
return true; return true;
case HandleType::Unknown: case HandleType::Unknown:
case HandleType::WritableEvent:
case HandleType::SharedMemory: case HandleType::SharedMemory:
case HandleType::Process: case HandleType::Process:
case HandleType::AddressArbiter: case HandleType::AddressArbiter:

View File

@ -19,7 +19,8 @@ using Handle = u32;
enum class HandleType : u32 { enum class HandleType : u32 {
Unknown, Unknown,
Event, WritableEvent,
ReadableEvent,
SharedMemory, SharedMemory,
Thread, Thread,
Process, Process,

View File

@ -29,7 +29,7 @@ public:
return reset_type; return reset_type;
} }
static const HandleType HANDLE_TYPE = HandleType::Event; static const HandleType HANDLE_TYPE = HandleType::ReadableEvent;
HandleType GetHandleType() const override { HandleType GetHandleType() const override {
return HANDLE_TYPE; return HANDLE_TYPE;
} }

View File

@ -1602,16 +1602,23 @@ static ResultCode ClearEvent(Handle handle) {
LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle); LOG_TRACE(Kernel_SVC, "called, event=0x{:08X}", handle);
const auto& handle_table = Core::CurrentProcess()->GetHandleTable(); const auto& handle_table = Core::CurrentProcess()->GetHandleTable();
SharedPtr<ReadableEvent> evt = handle_table.Get<ReadableEvent>(handle);
if (evt == nullptr) { auto writable_event = handle_table.Get<WritableEvent>(handle);
LOG_ERROR(Kernel_SVC, "Event handle does not exist, handle=0x{:08X}", handle); if (writable_event) {
return ERR_INVALID_HANDLE; writable_event->Clear();
return RESULT_SUCCESS;
} }
evt->Clear(); auto readable_event = handle_table.Get<ReadableEvent>(handle);
if (readable_event) {
readable_event->Clear();
return RESULT_SUCCESS; return RESULT_SUCCESS;
} }
LOG_ERROR(Kernel_SVC, "Event handle does not exist, handle=0x{:08X}", handle);
return ERR_INVALID_HANDLE;
}
static ResultCode GetProcessInfo(u64* out, Handle process_handle, u32 type) { static ResultCode GetProcessInfo(u64* out, Handle process_handle, u32 type) {
LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type=0x{:X}", process_handle, type); LOG_DEBUG(Kernel_SVC, "called, handle=0x{:08X}, type=0x{:X}", process_handle, type);

View File

@ -39,7 +39,7 @@ public:
return name; return name;
} }
static const HandleType HANDLE_TYPE = HandleType::Event; static const HandleType HANDLE_TYPE = HandleType::WritableEvent;
HandleType GetHandleType() const override { HandleType GetHandleType() const override {
return HANDLE_TYPE; return HANDLE_TYPE;
} }

View File

@ -153,7 +153,7 @@ QString WaitTreeWaitObject::GetText() const {
std::unique_ptr<WaitTreeWaitObject> WaitTreeWaitObject::make(const Kernel::WaitObject& object) { std::unique_ptr<WaitTreeWaitObject> WaitTreeWaitObject::make(const Kernel::WaitObject& object) {
switch (object.GetHandleType()) { switch (object.GetHandleType()) {
case Kernel::HandleType::Event: case Kernel::HandleType::ReadableEvent:
return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::ReadableEvent&>(object)); return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::ReadableEvent&>(object));
case Kernel::HandleType::Timer: case Kernel::HandleType::Timer:
return std::make_unique<WaitTreeTimer>(static_cast<const Kernel::Timer&>(object)); return std::make_unique<WaitTreeTimer>(static_cast<const Kernel::Timer&>(object));