Kernel: Pass trampolines instead of lambdas to create_kernel_process

With -Og, all calls to create_kernel_process were triggering -Wnonnull
when creating these lambdas that get implicitly converted to function
pointers. A different design of create_kernel_process to use
AK::Function instead might avoid this awkward behavior.
This commit is contained in:
Andrew Kaster 2021-05-23 13:45:58 -06:00 committed by Andreas Kling
parent 6459c5a713
commit 86e3010043
Notes: sideshowbarker 2024-07-18 17:20:35 +09:00
2 changed files with 22 additions and 19 deletions

View file

@ -151,17 +151,19 @@ public:
return current_thread ? &current_thread->process() : nullptr;
}
template<typename EntryFunction>
static void kernel_process_trampoline(void* data)
{
EntryFunction* func = reinterpret_cast<EntryFunction*>(data);
(*func)();
delete func;
}
template<typename EntryFunction>
static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, String&& name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT)
{
auto* entry_func = new EntryFunction(move(entry));
return create_kernel_process(
first_thread, move(name), [](void* data) {
EntryFunction* func = reinterpret_cast<EntryFunction*>(data);
(*func)();
delete func;
},
entry_func, affinity);
return create_kernel_process(first_thread, move(name), &Process::kernel_process_trampoline<EntryFunction>, entry_func, affinity);
}
static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, String&& name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT);
@ -805,7 +807,6 @@ inline ProcessID Thread::pid() const
VERIFY_NOT_REACHED(); \
} \
} while (0)
}
inline static String copy_string_from_user(const Kernel::Syscall::StringArgument& string)

View file

@ -9,20 +9,22 @@
namespace Kernel {
static void finalizer_task(void*)
{
Thread::current()->set_priority(THREAD_PRIORITY_LOW);
for (;;) {
g_finalizer_wait_queue->wait_forever("FinalizerTask");
if (g_finalizer_has_work.exchange(false, AK::MemoryOrder::memory_order_acq_rel) == true)
Thread::finalize_dying_threads();
}
};
void FinalizerTask::spawn()
{
RefPtr<Thread> finalizer_thread;
Process::create_kernel_process(
finalizer_thread, "FinalizerTask", [](void*) {
Thread::current()->set_priority(THREAD_PRIORITY_LOW);
for (;;) {
g_finalizer_wait_queue->wait_forever("FinalizerTask");
if (g_finalizer_has_work.exchange(false, AK::MemoryOrder::memory_order_acq_rel) == true)
Thread::finalize_dying_threads();
}
},
nullptr);
auto finalizer_process = Process::create_kernel_process(finalizer_thread, "FinalizerTask", finalizer_task, nullptr);
VERIFY(finalizer_process);
g_finalizer = finalizer_thread;
}