mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-05 22:42:46 +01:00
5eb057f422
Two kernel object should absolutely never have the same handle ID type. This can cause incorrect behavior when it comes to retrieving object types from the handle table. In this case it allows converting a WritableEvent into a ReadableEvent and vice-versa, which is undefined behavior, since the object types are not the same. This also corrects ClearEvent() to check both kernel types like the kernel itself does.
63 lines
1.5 KiB
C++
63 lines
1.5 KiB
C++
// Copyright 2014 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include "common/common_types.h"
|
|
#include "core/hle/kernel/object.h"
|
|
#include "core/hle/kernel/wait_object.h"
|
|
|
|
namespace Kernel {
|
|
|
|
class KernelCore;
|
|
class ReadableEvent;
|
|
class WritableEvent;
|
|
|
|
struct EventPair {
|
|
SharedPtr<ReadableEvent> readable;
|
|
SharedPtr<WritableEvent> writable;
|
|
};
|
|
|
|
class WritableEvent final : public Object {
|
|
public:
|
|
~WritableEvent() override;
|
|
|
|
/**
|
|
* Creates an event
|
|
* @param kernel The kernel instance to create this event under.
|
|
* @param reset_type ResetType describing how to create event
|
|
* @param name Optional name of event
|
|
*/
|
|
static EventPair CreateEventPair(KernelCore& kernel, ResetType reset_type,
|
|
std::string name = "Unknown");
|
|
|
|
std::string GetTypeName() const override {
|
|
return "WritableEvent";
|
|
}
|
|
std::string GetName() const override {
|
|
return name;
|
|
}
|
|
|
|
static const HandleType HANDLE_TYPE = HandleType::WritableEvent;
|
|
HandleType GetHandleType() const override {
|
|
return HANDLE_TYPE;
|
|
}
|
|
|
|
SharedPtr<ReadableEvent> GetReadableEvent() const;
|
|
|
|
ResetType GetResetType() const;
|
|
|
|
void Signal();
|
|
void Clear();
|
|
bool IsSignaled() const;
|
|
|
|
private:
|
|
explicit WritableEvent(KernelCore& kernel);
|
|
|
|
SharedPtr<ReadableEvent> readable;
|
|
|
|
std::string name; ///< Name of event (optional)
|
|
};
|
|
|
|
} // namespace Kernel
|