Browse Source
Merge pull request #6551 from bunnei/improve-kernel-obj
Merge pull request #6551 from bunnei/improve-kernel-obj
Improve management of kernel objectsnce_cpp
committed by
GitHub
21 changed files with 327 additions and 88 deletions
-
2src/core/CMakeLists.txt
-
3src/core/hle/kernel/hle_ipc.cpp
-
9src/core/hle/kernel/k_auto_object.cpp
-
12src/core/hle/kernel/k_auto_object.h
-
8src/core/hle/kernel/k_process.cpp
-
5src/core/hle/kernel/k_server_session.cpp
-
97src/core/hle/kernel/kernel.cpp
-
17src/core/hle/kernel/kernel.h
-
6src/core/hle/kernel/svc.cpp
-
13src/core/hle/service/hid/controllers/npad.cpp
-
8src/core/hle/service/hid/controllers/npad.h
-
14src/core/hle/service/hid/hid.cpp
-
13src/core/hle/service/hid/hid.h
-
62src/core/hle/service/kernel_helpers.cpp
-
35src/core/hle/service/kernel_helpers.h
-
11src/core/hle/service/nvdrv/nvdrv.cpp
-
3src/core/hle/service/nvdrv/nvdrv.h
-
11src/core/hle/service/service.cpp
-
7src/core/hle/service/service.h
-
65src/core/hle/service/sm/sm.cpp
-
14src/core/hle/service/sm/sm.h
@ -0,0 +1,62 @@ |
|||||
|
// Copyright 2021 yuzu emulator team
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include "core/core.h"
|
||||
|
#include "core/hle/kernel/k_event.h"
|
||||
|
#include "core/hle/kernel/k_process.h"
|
||||
|
#include "core/hle/kernel/k_readable_event.h"
|
||||
|
#include "core/hle/kernel/k_resource_limit.h"
|
||||
|
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
||||
|
#include "core/hle/kernel/k_writable_event.h"
|
||||
|
#include "core/hle/service/kernel_helpers.h"
|
||||
|
|
||||
|
namespace Service::KernelHelpers { |
||||
|
|
||||
|
ServiceContext::ServiceContext(Core::System& system_, std::string name_) |
||||
|
: kernel(system_.Kernel()) { |
||||
|
process = Kernel::KProcess::Create(kernel); |
||||
|
ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_), |
||||
|
Kernel::KProcess::ProcessType::Userland) |
||||
|
.IsSuccess()); |
||||
|
} |
||||
|
|
||||
|
ServiceContext::~ServiceContext() { |
||||
|
process->Close(); |
||||
|
process = nullptr; |
||||
|
} |
||||
|
|
||||
|
Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) { |
||||
|
// Reserve a new event from the process resource limit
|
||||
|
Kernel::KScopedResourceReservation event_reservation(process, |
||||
|
Kernel::LimitableResource::Events); |
||||
|
if (!event_reservation.Succeeded()) { |
||||
|
LOG_CRITICAL(Service, "Resource limit reached!"); |
||||
|
return {}; |
||||
|
} |
||||
|
|
||||
|
// Create a new event.
|
||||
|
auto* event = Kernel::KEvent::Create(kernel); |
||||
|
if (!event) { |
||||
|
LOG_CRITICAL(Service, "Unable to create event!"); |
||||
|
return {}; |
||||
|
} |
||||
|
|
||||
|
// Initialize the event.
|
||||
|
event->Initialize(std::move(name)); |
||||
|
|
||||
|
// Commit the thread reservation.
|
||||
|
event_reservation.Commit(); |
||||
|
|
||||
|
// Register the event.
|
||||
|
Kernel::KEvent::Register(kernel, event); |
||||
|
|
||||
|
return event; |
||||
|
} |
||||
|
|
||||
|
void ServiceContext::CloseEvent(Kernel::KEvent* event) { |
||||
|
event->GetReadableEvent().Close(); |
||||
|
event->GetWritableEvent().Close(); |
||||
|
} |
||||
|
|
||||
|
} // namespace Service::KernelHelpers
|
||||
@ -0,0 +1,35 @@ |
|||||
|
// Copyright 2021 yuzu emulator team |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <string> |
||||
|
|
||||
|
namespace Core { |
||||
|
class System; |
||||
|
} |
||||
|
|
||||
|
namespace Kernel { |
||||
|
class KernelCore; |
||||
|
class KEvent; |
||||
|
class KProcess; |
||||
|
} // namespace Kernel |
||||
|
|
||||
|
namespace Service::KernelHelpers { |
||||
|
|
||||
|
class ServiceContext { |
||||
|
public: |
||||
|
ServiceContext(Core::System& system_, std::string name_); |
||||
|
~ServiceContext(); |
||||
|
|
||||
|
Kernel::KEvent* CreateEvent(std::string&& name); |
||||
|
|
||||
|
void CloseEvent(Kernel::KEvent* event); |
||||
|
|
||||
|
private: |
||||
|
Kernel::KernelCore& kernel; |
||||
|
Kernel::KProcess* process{}; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Service::KernelHelpers |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue