mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:52:43 +00:00 
			
		
		
		
	 e9898a6031
			
		
	
	
		e9898a6031
		
	
	
	
	
		
			
			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.
		
			
				
	
	
		
			56 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <Kernel/Process.h>
 | |
| #include <Kernel/SpinLock.h>
 | |
| #include <Kernel/WaitQueue.h>
 | |
| #include <Kernel/WorkQueue.h>
 | |
| 
 | |
| namespace Kernel {
 | |
| 
 | |
| WorkQueue* g_io_work;
 | |
| 
 | |
| void WorkQueue::initialize()
 | |
| {
 | |
|     g_io_work = new WorkQueue("IO WorkQueue");
 | |
| }
 | |
| 
 | |
| WorkQueue::WorkQueue(const char* name)
 | |
| {
 | |
|     RefPtr<Thread> thread;
 | |
|     Process::create_kernel_process(thread, name, [this] {
 | |
|         for (;;) {
 | |
|             WorkItem* item;
 | |
|             bool have_more;
 | |
|             {
 | |
|                 ScopedSpinLock lock(m_lock);
 | |
|                 item = m_items.take_first();
 | |
|                 have_more = !m_items.is_empty();
 | |
|             }
 | |
|             if (item) {
 | |
|                 item->function();
 | |
|                 delete item;
 | |
| 
 | |
|                 if (have_more)
 | |
|                     continue;
 | |
|             }
 | |
|             [[maybe_unused]] auto result = m_wait_queue.wait_on({});
 | |
|         }
 | |
|     });
 | |
|     // If we can't create the thread we're in trouble...
 | |
|     m_thread = thread.release_nonnull();
 | |
| }
 | |
| 
 | |
| void WorkQueue::do_queue(WorkItem* item)
 | |
| {
 | |
|     {
 | |
|         ScopedSpinLock lock(m_lock);
 | |
|         m_items.append(*item);
 | |
|     }
 | |
|     m_wait_queue.wake_one();
 | |
| }
 | |
| 
 | |
| }
 |