os: adopt multiwait naming over waitable
This commit is contained in:
@@ -32,19 +32,19 @@ namespace ams::fatal::srv {
|
||||
|
||||
/* Global event. */
|
||||
os::SystemEventType g_fatal_dirty_event;
|
||||
os::WaitableHolderType g_fatal_dirty_waitable_holder;
|
||||
os::MultiWaitHolderType g_fatal_dirty_multi_wait_holder;
|
||||
bool g_initialized;
|
||||
|
||||
}
|
||||
|
||||
os::WaitableHolderType *GetFatalDirtyWaitableHolder() {
|
||||
os::MultiWaitHolderType *GetFatalDirtyMultiWaitHolder() {
|
||||
if (AMS_UNLIKELY(!g_initialized)) {
|
||||
os::AttachReadableHandleToSystemEvent(std::addressof(g_fatal_dirty_event), GetFatalDirtyEventReadableHandle(), true, os::EventClearMode_ManualClear);
|
||||
os::InitializeWaitableHolder(std::addressof(g_fatal_dirty_waitable_holder), std::addressof(g_fatal_dirty_event));
|
||||
os::SetWaitableHolderUserData(std::addressof(g_fatal_dirty_waitable_holder), reinterpret_cast<uintptr_t>(std::addressof(g_fatal_dirty_waitable_holder)));
|
||||
os::InitializeMultiWaitHolder(std::addressof(g_fatal_dirty_multi_wait_holder), std::addressof(g_fatal_dirty_event));
|
||||
os::SetMultiWaitHolderUserData(std::addressof(g_fatal_dirty_multi_wait_holder), reinterpret_cast<uintptr_t>(std::addressof(g_fatal_dirty_multi_wait_holder)));
|
||||
g_initialized = true;
|
||||
}
|
||||
return std::addressof(g_fatal_dirty_waitable_holder);
|
||||
return std::addressof(g_fatal_dirty_multi_wait_holder);
|
||||
}
|
||||
|
||||
void OnFatalDirtyEvent() {
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace ams::fatal::srv {
|
||||
}
|
||||
};
|
||||
|
||||
os::WaitableHolderType *GetFatalDirtyWaitableHolder();
|
||||
os::MultiWaitHolderType *GetFatalDirtyMultiWaitHolder();
|
||||
void OnFatalDirtyEvent();
|
||||
const FatalConfig &GetFatalConfig();
|
||||
|
||||
|
||||
@@ -218,8 +218,8 @@ int main(int argc, char **argv)
|
||||
R_ABORT_UNLESS(g_server_manager.RegisterObjectForServer(g_private_service_object.GetShared(), PrivateServiceName, PrivateMaxSessions));
|
||||
|
||||
/* Add dirty event holder. */
|
||||
auto *dirty_event_holder = ams::fatal::srv::GetFatalDirtyWaitableHolder();
|
||||
g_server_manager.AddUserWaitableHolder(dirty_event_holder);
|
||||
auto *dirty_event_holder = ams::fatal::srv::GetFatalDirtyMultiWaitHolder();
|
||||
g_server_manager.AddUserMultiWaitHolder(dirty_event_holder);
|
||||
|
||||
/* Loop forever, servicing our services. */
|
||||
/* Because fatal has a user wait holder, we need to specify how to process manually. */
|
||||
@@ -227,7 +227,7 @@ int main(int argc, char **argv)
|
||||
if (signaled_holder == dirty_event_holder) {
|
||||
/* Dirty event holder was signaled. */
|
||||
fatal::srv::OnFatalDirtyEvent();
|
||||
g_server_manager.AddUserWaitableHolder(signaled_holder);
|
||||
g_server_manager.AddUserMultiWaitHolder(signaled_holder);
|
||||
} else {
|
||||
/* A server/session was signaled. Have the manager handle it. */
|
||||
R_ABORT_UNLESS(g_server_manager.Process(signaled_holder));
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
namespace ams::pm::impl {
|
||||
|
||||
ProcessInfo::ProcessInfo(Handle h, os::ProcessId pid, ldr::PinId pin, const ncm::ProgramLocation &l, const cfg::OverrideStatus &s) : process_id(pid), pin_id(pin), loc(l), status(s), handle(h), state(svc::ProcessState_Created), flags(0) {
|
||||
os::InitializeWaitableHolder(std::addressof(this->waitable_holder), this->handle);
|
||||
os::SetWaitableHolderUserData(std::addressof(this->waitable_holder), reinterpret_cast<uintptr_t>(this));
|
||||
os::InitializeMultiWaitHolder(std::addressof(this->multi_wait_holder), this->handle);
|
||||
os::SetMultiWaitHolderUserData(std::addressof(this->multi_wait_holder), reinterpret_cast<uintptr_t>(this));
|
||||
}
|
||||
|
||||
ProcessInfo::~ProcessInfo() {
|
||||
@@ -38,8 +38,8 @@ namespace ams::pm::impl {
|
||||
svcCloseHandle(this->handle);
|
||||
this->handle = INVALID_HANDLE;
|
||||
|
||||
/* Unlink the process from its waitable manager. */
|
||||
os::UnlinkWaitableHolder(std::addressof(this->waitable_holder));
|
||||
/* Unlink the process from its multi wait. */
|
||||
os::UnlinkMultiWaitHolder(std::addressof(this->multi_wait_holder));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace ams::pm::impl {
|
||||
Handle handle;
|
||||
svc::ProcessState state;
|
||||
u32 flags;
|
||||
os::WaitableHolderType waitable_holder;
|
||||
os::MultiWaitHolderType multi_wait_holder;
|
||||
private:
|
||||
void SetFlag(Flag flag) {
|
||||
this->flags |= flag;
|
||||
@@ -64,8 +64,8 @@ namespace ams::pm::impl {
|
||||
~ProcessInfo();
|
||||
void Cleanup();
|
||||
|
||||
void LinkToWaitableManager(os::WaitableManagerType &manager) {
|
||||
os::LinkWaitableHolder(std::addressof(manager), std::addressof(this->waitable_holder));
|
||||
void LinkToMultiWait(os::MultiWaitType &multi_wait) {
|
||||
os::LinkMultiWaitHolder(std::addressof(multi_wait), std::addressof(this->multi_wait_holder));
|
||||
}
|
||||
|
||||
Handle GetHandle() const {
|
||||
|
||||
@@ -150,33 +150,33 @@ namespace ams::pm::impl {
|
||||
constinit std::atomic<bool> g_application_hook;
|
||||
|
||||
/* Forward declarations. */
|
||||
Result LaunchProcess(os::WaitableManagerType &waitable_manager, const LaunchProcessArgs &args);
|
||||
Result LaunchProcess(os::MultiWaitType &multi_wait, const LaunchProcessArgs &args);
|
||||
void OnProcessSignaled(ProcessListAccessor &list, ProcessInfo *process_info);
|
||||
|
||||
/* Helpers. */
|
||||
void ProcessTrackingMain(void *arg) {
|
||||
/* This is the main loop of the process tracking thread. */
|
||||
|
||||
/* Setup waitable manager. */
|
||||
os::WaitableManagerType process_waitable_manager;
|
||||
os::WaitableHolderType start_event_holder;
|
||||
os::InitializeWaitableManager(std::addressof(process_waitable_manager));
|
||||
os::InitializeWaitableHolder(std::addressof(start_event_holder), g_process_launch_start_event.GetBase());
|
||||
os::LinkWaitableHolder(std::addressof(process_waitable_manager), std::addressof(start_event_holder));
|
||||
/* Setup multi wait/holders. */
|
||||
os::MultiWaitType process_multi_wait;
|
||||
os::MultiWaitHolderType start_event_holder;
|
||||
os::InitializeMultiWait(std::addressof(process_multi_wait));
|
||||
os::InitializeMultiWaitHolder(std::addressof(start_event_holder), g_process_launch_start_event.GetBase());
|
||||
os::LinkMultiWaitHolder(std::addressof(process_multi_wait), std::addressof(start_event_holder));
|
||||
|
||||
while (true) {
|
||||
auto signaled_holder = os::WaitAny(std::addressof(process_waitable_manager));
|
||||
auto signaled_holder = os::WaitAny(std::addressof(process_multi_wait));
|
||||
if (signaled_holder == &start_event_holder) {
|
||||
/* Launch start event signaled. */
|
||||
/* TryWait will clear signaled, preventing duplicate notifications. */
|
||||
if (g_process_launch_start_event.TryWait()) {
|
||||
g_process_launch_result = LaunchProcess(process_waitable_manager, g_process_launch_args);
|
||||
g_process_launch_result = LaunchProcess(process_multi_wait, g_process_launch_args);
|
||||
g_process_launch_finish_event.Signal();
|
||||
}
|
||||
} else {
|
||||
/* Some process was signaled. */
|
||||
ProcessListAccessor list(g_process_list);
|
||||
OnProcessSignaled(list, reinterpret_cast<ProcessInfo *>(os::GetWaitableHolderUserData(signaled_holder)));
|
||||
OnProcessSignaled(list, reinterpret_cast<ProcessInfo *>(os::GetMultiWaitHolderUserData(signaled_holder)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -220,7 +220,7 @@ namespace ams::pm::impl {
|
||||
g_process_info_allocator.FreeProcessInfo(process_info);
|
||||
}
|
||||
|
||||
Result LaunchProcess(os::WaitableManagerType &waitable_manager, const LaunchProcessArgs &args) {
|
||||
Result LaunchProcess(os::MultiWaitType &multi_wait, const LaunchProcessArgs &args) {
|
||||
/* Get Program Info. */
|
||||
ldr::ProgramInfo program_info;
|
||||
cfg::OverrideStatus override_status;
|
||||
@@ -260,7 +260,7 @@ namespace ams::pm::impl {
|
||||
{
|
||||
ProcessListAccessor list(g_process_list);
|
||||
list->push_back(*process_info);
|
||||
process_info->LinkToWaitableManager(waitable_manager);
|
||||
process_info->LinkToMultiWait(multi_wait);
|
||||
}
|
||||
|
||||
/* Prevent resource leakage if register fails. */
|
||||
@@ -362,7 +362,7 @@ namespace ams::pm::impl {
|
||||
process_info->ClearUnhandledException();
|
||||
break;
|
||||
case svc::ProcessState_Terminated:
|
||||
/* Free process resources, unlink from waitable manager. */
|
||||
/* Free process resources, unlink from multi wait. */
|
||||
process_info->Cleanup();
|
||||
|
||||
if (hos::GetVersion() < hos::Version_5_0_0 && process_info->ShouldSignalOnExit()) {
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace ams::sm {
|
||||
private:
|
||||
struct Entry {
|
||||
sm::ServiceName service_name{sm::InvalidServiceName};
|
||||
tipc::WaitableObject object{};
|
||||
tipc::ObjectHolder object{};
|
||||
u8 message_buffer[svc::ipc::MessageBufferSize];
|
||||
};
|
||||
private:
|
||||
@@ -83,7 +83,7 @@ namespace ams::sm {
|
||||
return tipc::ResultRequestDeferred();
|
||||
}
|
||||
|
||||
void ProcessRegisterRetry(tipc::WaitableObject &object) {
|
||||
void ProcessRegisterRetry(tipc::ObjectHolder &object) {
|
||||
/* Verify that we have a processing entry. */
|
||||
AMS_ABORT_UNLESS(m_processing_entry != nullptr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user