.. _module-pw_work_queue:

=============
pw_work_queue
=============
.. pigweed-module::
   :name: pw_work_queue

The ``pw_work_queue`` module contains utilities for deferring work to be
executed by another thread.

-------
Example
-------

.. code-block:: cpp

   #include "pw_thread/detached_thread.h"
   #include "pw_work_queue/work_queue.h"

   pw::work_queue::WorkQueueWithBuffer<10> work_queue;

   pw::thread::Options& WorkQueueThreadOptions();
   void SomeLongRunningProcessing();

   void SomeInterruptHandler() {
     // Instead of executing the long running processing task in the interrupt,
     // the work_queue executes it on the interrupt's behalf.
     work_queue.CheckPushWork(SomeLongRunningProcessing);
   }

   int main() {
     // Start up the work_queue as a detached thread which runs forever.
     pw::thread::DetachedThread(WorkQueueThreadOptions(), work_queue);
   }

.. code-block:: cpp

   #include "pw_thread/detached_thread.h"
   #include "pw_work_queue/work_queue.h"

   struct MyWorkItem {
     int value;
   };

   pw::work_queue::CustomWorkQueueWithBuffer<10, MyWorkItem> work_queue(
      [](MyWorkItem& item) {
        SomeLongRunningProcessing(item);
      });
   pw::thread::Options& WorkQueueThreadOptions();
   void SomeLongRunningProcessing(MyWorkItem& value);

   void SomeInterruptHandler(int value) {
       // Instead of executing the long running processing task in the interrupt,
       // the work_queue executes it on the interrupt's behalf.
       work_queue.CheckPushWork({.value = value});
   }

   int main() {
       // Start up the work_queue as a detached thread which runs forever.
       pw::thread::DetachedThread(WorkQueueThreadOptions(), work_queue);
   }


-------------
API reference
-------------
Moved: :cc:`pw_work_queue`
