Prechádzať zdrojové kódy

Kernel: Use plain Function objects for the WorkQueue

The WorkQueue class previously had its own inline storage functionality
for function pointers. With the recent changes to the Function class
this is no longer necessary.
Gunnar Beutner 4 rokov pred
rodič
commit
e9898a6031
2 zmenil súbory, kde vykonal 8 pridanie a 25 odobranie
  1. 1 3
      Kernel/WorkQueue.cpp
  2. 7 22
      Kernel/WorkQueue.h

+ 1 - 3
Kernel/WorkQueue.cpp

@@ -31,9 +31,7 @@ WorkQueue::WorkQueue(const char* name)
                 have_more = !m_items.is_empty();
                 have_more = !m_items.is_empty();
             }
             }
             if (item) {
             if (item) {
-                item->function(item->data);
-                if (item->free_data)
-                    item->free_data(item->data);
+                item->function();
                 delete item;
                 delete item;
 
 
                 if (have_more)
                 if (have_more)

+ 7 - 22
Kernel/WorkQueue.h

@@ -25,9 +25,11 @@ public:
     void queue(void (*function)(void*), void* data = nullptr, void (*free_data)(void*) = nullptr)
     void queue(void (*function)(void*), void* data = nullptr, void (*free_data)(void*) = nullptr)
     {
     {
         auto* item = new WorkItem; // TODO: use a pool
         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);
         do_queue(item);
     }
     }
 
 
@@ -35,31 +37,14 @@ public:
     void queue(Function function)
     void queue(Function function)
     {
     {
         auto* item = new WorkItem; // TODO: use a pool
         auto* item = new WorkItem; // TODO: use a pool
-        item->function = [](void* f) {
-            (*reinterpret_cast<Function*>(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<Function*>(f)->~Function();
-            };
-
-        } else {
-            item->data = new Function(move(function));
-            item->free_data = [](void* f) {
-                delete reinterpret_cast<Function*>(f);
-            };
-        }
+        item->function = Function(function);
         do_queue(item);
         do_queue(item);
     }
     }
 
 
 private:
 private:
     struct WorkItem {
     struct WorkItem {
         IntrusiveListNode<WorkItem> m_node;
         IntrusiveListNode<WorkItem> m_node;
-        void (*function)(void*);
-        void* data;
-        void (*free_data)(void*);
-        u8 inline_data[4 * sizeof(void*)];
+        Function<void()> function;
     };
     };
 
 
     void do_queue(WorkItem*);
     void do_queue(WorkItem*);