diff --git a/Kernel/WorkQueue.cpp b/Kernel/WorkQueue.cpp index 4af38f6ea61..589b10e2715 100644 --- a/Kernel/WorkQueue.cpp +++ b/Kernel/WorkQueue.cpp @@ -31,9 +31,7 @@ WorkQueue::WorkQueue(const char* name) have_more = !m_items.is_empty(); } if (item) { - item->function(item->data); - if (item->free_data) - item->free_data(item->data); + item->function(); delete item; if (have_more) diff --git a/Kernel/WorkQueue.h b/Kernel/WorkQueue.h index 24bc7a2c938..34db117dd68 100644 --- a/Kernel/WorkQueue.h +++ b/Kernel/WorkQueue.h @@ -25,9 +25,11 @@ public: void queue(void (*function)(void*), void* data = nullptr, void (*free_data)(void*) = nullptr) { auto* item = new WorkItem; // TODO: use a pool - item->function = function; - item->data = data; - item->free_data = free_data; + item->function = [function, data, free_data] { + function(data); + if (free_data) + free_data(data); + }; do_queue(item); } @@ -35,31 +37,14 @@ public: void queue(Function function) { auto* item = new WorkItem; // TODO: use a pool - item->function = [](void* f) { - (*reinterpret_cast(f))(); - }; - if constexpr (sizeof(Function) <= sizeof(item->inline_data)) { - item->data = new (item->inline_data) Function(move(function)); - item->free_data = [](void* f) { - reinterpret_cast(f)->~Function(); - }; - - } else { - item->data = new Function(move(function)); - item->free_data = [](void* f) { - delete reinterpret_cast(f); - }; - } + item->function = Function(function); do_queue(item); } private: struct WorkItem { IntrusiveListNode m_node; - void (*function)(void*); - void* data; - void (*free_data)(void*); - u8 inline_data[4 * sizeof(void*)]; + Function function; }; void do_queue(WorkItem*);