Provided by: libivykis-dev_0.43-1build1_amd64 bug

NAME

       IV_WORK_POOL_INIT,      iv_work_pool_create,      iv_work_pool_put,     IV_WORK_ITEM_INIT,
       iv_work_pool_submit_work,  iv_work_pool_submit_continuation   -   ivykis   worker   thread
       management

SYNOPSIS

       #include <iv_work.h>

       struct iv_work_pool {
               int             max_threads;
               void            *cookie;
               void            (*thread_start)(void *cookie);
               void            (*thread_stop)(void *cookie);
       };

       struct iv_work_item {
               void            *cookie;
               void            (*work)(void *cookie);
               void            (*completion)(void *cookie);
       };

       void IV_WORK_POOL_INIT(struct iv_work_pool *this);
       int iv_work_pool_create(struct iv_work_pool *this);
       int iv_work_pool_put(struct iv_work_pool *this);
       void IV_WORK_ITEM_INIT(struct iv_work_item *work);
       int iv_work_pool_submit_work(struct iv_work_pool *this, struct iv_work_item *work);
       int   iv_work_pool_submit_continuation(struct   iv_work_pool  *this,  struct  iv_work_item
       *work);

DESCRIPTION

       Calling iv_work_pool_create on a struct  iv_work_pool  object  previously  initialised  by
       IV_WORK_POOL_INIT  creates  a  pool  of  worker  threads  that  can be used to offload CPU
       intensive tasks to, so as to prevent negatively influencing event handling latency in  the
       calling thread, and to enable the use of multiple host CPUs for CPU intensive tasks.

       iv_work  dynamically adjusts the number of threads in the pool to the amount of work there
       is to do.  The ->max_threads member of struct iv_work_pool specifies the maximum number of
       threads that will be created in this pool.

       Calling iv_work_pool_submit_work on a struct iv_work_item object previously initialised by
       IV_WORK_ITEM_INIT submits a work item to a pool.  The ->work member of struct iv_work_item
       specifies  the  function  that  will  be  called  in one of the worker threads in the pool
       specified by ->this, with ->cookie as its sole  argument.   When  the  work  function  has
       completed,  iv_work  will  call  the  ->completion  callback  to  indicate this, also with
       ->cookie as its sole argument, in the thread that iv_work_pool_create was  called  in  for
       this pool object.

       Calling  iv_work_pool_submit_continuation  from  a  worker thread allows submitting a work
       item similarly to iv_work_pool_submit_work.  But while iv_work_pool_submit_work  can  only
       be  called  from the thread owning iv_work, iv_work_pool_submit_continuation can be called
       from any of the worker threads. The ->completion callback of these jobs will  be  executed
       from the thread owning iv_work.

       As  a  special  case,  calling iv_work_pool_submit_work with a NULL work pool pointer will
       cause the work item to be processed in the local thread, from an iv_task(3) callback.

       If the ->thread_start function pointer specified in struct iv_work_pool is  not  NULL,  it
       will  be called upon creation of a new worker thread, in the context of the created worker
       thread, with ->cookie as its sole argument.  Calls to ->thread_start  are  not  explicitly
       serialised,  which  should  be kept in mind when manipulating state shared between threads
       from within that callback function.

       Similarly, if iv_work decides to terminate a worker thread, for example due to inactivity,
       ->thread_stop  will  be  called in the context of the terminating thread, with ->cookie as
       its sole argument.  Calls to ->thread_stop are also not explicitly serialised.

       iv_work_pool_submit_work can only be called from the thread that  iv_work_pool_create  for
       this  pool  object was called in.  iv_work_pool_submit_continuation can called from any of
       the worker threads.

       There is no way to cancel submitted work items.

       There is no guaranteed order, FIFO or otherwise, between different work items submitted to
       the same worker thread pool.

       When  the user has no more work items to submit to the pool, its reference to the pool can
       be dropped by calling iv_work_pool_put.

       If  there  are  still  pending  or  running  work  items  assigned  to  this   pool   when
       iv_work_pool_put  is called, those work items will not be canceled, but will be allowed to
       run to completion, and their ->completion callbacks will be called as  usual.   A  similar
       thing  holds  for the ->thread_start and ->thread_stop callbacks -- they can also still be
       called after iv_work_pool_put returns.  Even so, the memory corresponding  to  the  struct
       iv_work_pool  can  immediately  be  freed  or  reused  by  the  user  upon  return  of the
       iv_work_pool_put call.

       Internally, iv_work uses iv_thread(3) for its thread management.

SEE ALSO

       ivykis(3), iv_thread(3)