kern: devirtualize KReadableEvent::Reset, KWorkerTask::DoWorkerTask

This commit is contained in:
Michael Scire 2021-10-24 20:41:38 -07:00
parent fd187f952e
commit 54dde406bc
12 changed files with 62 additions and 24 deletions

View file

@ -432,7 +432,7 @@ namespace ams::kern {
return ResultSuccess();
}
void KProcess::DoWorkerTask() {
void KProcess::DoWorkerTaskImpl() {
/* Terminate child threads. */
TerminateChildren(this, nullptr);

View file

@ -59,14 +59,6 @@ namespace ams::kern {
return ResultSuccess();
}
Result KReadableEvent::Clear() {
MESOSPHERE_ASSERT_THIS();
this->Reset();
return ResultSuccess();
}
Result KReadableEvent::Reset() {
MESOSPHERE_ASSERT_THIS();

View file

@ -406,7 +406,7 @@ namespace ams::kern {
this->Close();
}
void KThread::DoWorkerTask() {
void KThread::DoWorkerTaskImpl() {
/* Finish the termination that was begun by Exit(). */
this->FinishTermination();
}

View file

@ -41,6 +41,17 @@ namespace ams::kern {
}
void KWorkerTask::DoWorkerTask() {
if (auto * const thread = this->DynamicCast<KThread *>(); thread != nullptr) {
return thread->DoWorkerTaskImpl();
} else {
auto * const process = this->DynamicCast<KProcess *>();
MESOSPHERE_ABORT_UNLESS(process != nullptr);
return process->DoWorkerTaskImpl();
}
}
void KWorkerTaskManager::Initialize(s32 priority) {
/* Reserve a thread from the system limit. */
MESOSPHERE_ABORT_UNLESS(Kernel::GetSystemResourceLimit().Reserve(ams::svc::LimitableResource_ThreadCountMax, 1));

View file

@ -48,7 +48,11 @@ namespace ams::kern::svc {
{
KScopedAutoObject readable_event = handle_table.GetObject<KReadableEvent>(event_handle);
if (readable_event.IsNotNull()) {
return readable_event->Clear();
if (auto * const interrupt_event = readable_event->DynamicCast<KInterruptEvent *>(); interrupt_event != nullptr) {
return interrupt_event->Clear();
} else {
return readable_event->Clear();
}
}
}

View file

@ -35,7 +35,11 @@ namespace ams::kern::svc {
{
KScopedAutoObject readable_event = handle_table.GetObject<KReadableEvent>(handle);
if (readable_event.IsNotNull()) {
return readable_event->Reset();
if (auto * const interrupt_event = readable_event->DynamicCast<KInterruptEvent *>(); interrupt_event != nullptr) {
return interrupt_event->Reset();
} else {
return readable_event->Reset();
}
}
}