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:
parent
6459c5a713
commit
86e3010043
Notes:
sideshowbarker
2024-07-18 17:20:35 +09:00
Author: https://github.com/ADKaster Commit: https://github.com/SerenityOS/serenity/commit/86e30100437 Pull-request: https://github.com/SerenityOS/serenity/pull/7429 Reviewed-by: https://github.com/awesomekling Reviewed-by: https://github.com/bgianfo ✅
2 changed files with 22 additions and 19 deletions
|
@ -151,17 +151,19 @@ public:
|
|||
return current_thread ? ¤t_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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue