Files
eden/src/core/hle/kernel/k_event.cpp
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

70 lines
1.8 KiB
C++
Raw Normal View History

// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2021-01-31 01:37:41 -08:00
#include "core/hle/kernel/k_event.h"
2021-04-23 22:04:28 -07:00
#include "core/hle/kernel/k_process.h"
2021-04-04 00:56:09 -07:00
#include "core/hle/kernel/k_resource_limit.h"
2021-01-31 01:37:41 -08:00
namespace Kernel {
2023-03-07 10:49:41 -05:00
KEvent::KEvent(KernelCore& kernel)
: KAutoObjectWithSlabHeapAndContainer{kernel}
, m_readable_event{kernel}
{}
2021-01-31 01:37:41 -08:00
KEvent::~KEvent() = default;
void KEvent::Initialize(KernelCore& kernel, KProcess* owner) {
2022-10-12 20:26:04 -04:00
// Create our readable event.
KAutoObject::Create(std::addressof(m_readable_event));
2021-01-31 01:37:41 -08:00
2022-10-12 20:26:04 -04:00
// Initialize our readable event.
m_readable_event.Initialize(kernel, this);
2021-01-31 01:37:41 -08:00
2021-04-04 00:56:09 -07:00
// Set our owner process.
2022-11-10 16:14:03 -05:00
// HACK: this should never be nullptr, but service threads don't have a
// proper parent process yet.
if (owner != nullptr) {
m_owner = owner;
m_owner->Open(kernel);
2022-11-10 16:14:03 -05:00
}
2021-04-04 00:56:09 -07:00
2021-01-31 01:37:41 -08:00
// Mark initialized.
2022-10-12 20:26:04 -04:00
m_initialized = true;
2021-01-31 01:37:41 -08:00
}
void KEvent::Finalize(KernelCore& kernel) {
KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize(kernel);
2021-04-04 00:56:09 -07:00
}
Result KEvent::Signal(KernelCore& kernel) {
KScopedSchedulerLock sl{kernel};
2022-10-12 20:26:04 -04:00
R_SUCCEED_IF(m_readable_event_destroyed);
return m_readable_event.Signal(kernel);
2022-10-12 20:26:04 -04:00
}
Result KEvent::Clear(KernelCore& kernel) {
KScopedSchedulerLock sl{kernel};
2022-10-12 20:26:04 -04:00
R_SUCCEED_IF(m_readable_event_destroyed);
return m_readable_event.Clear(kernel);
2022-10-12 20:26:04 -04:00
}
void KEvent::PostDestroy(KernelCore& kernel, uintptr_t arg) {
2021-04-04 00:56:09 -07:00
// Release the event count resource the owner process holds.
2021-04-23 22:04:28 -07:00
KProcess* owner = reinterpret_cast<KProcess*>(arg);
2022-11-10 16:14:03 -05:00
if (owner != nullptr) {
owner->GetResourceLimit()->Release(kernel, LimitableResource::EventCountMax, 1);
owner->Close(kernel);
2022-11-10 16:14:03 -05:00
}
2021-04-04 00:56:09 -07:00
}
2021-01-31 01:37:41 -08:00
} // namespace Kernel