ec_async_job

March 26, 2020 Contributors

This struct is a typedef of the ec_thread_pool_job struct. The members of this struct are as follows:

/* a generic job item for the thread pool */
struct ec_thread_pool_job {
  struct ec_thread_pool_job *next;

  enum _ec_thread_pool_job_completion {
    ECTP_COMPLETE_NONE,     /* do nothing to signal completion */
    ECTP_COMPLETE_EVENT,    /* re-schedule an event */
    ECTP_COMPLETE_MODULE,   /* reinstate a validation module; it will be descheduled
                               when the job is queued */
    ECTP_COMPLETE_CALLBACK, /* call a function in the worker thread context */
    ECTP_COMPLETE_SEMAPHORE,/* post to a semaphore */
    ECTP_COMPLETE_SYNC,     /* synchronous execution */
    ECTP_COMPLETE_CALLBACK_SCHED, /* call a function in the scheduler thread context */
    ECTP_COMPLETE_EVENT_INST, /* Re-schedule in a specific scheduler inst */
    ECTP_COMPLETE_CALLBACK_SCHED_INST, /* Callback in a specific scheduler inst */
  } completion;

  #define ECTP_CLASS_SHORT_LIVED -1 /* job will be extremely short lived */
  #define ECTP_CLASS_CPU          0 /* job will be mostly CPU bound */
  #define ECTP_CLASS_IO           1 /* job will be mostly blocked on IO */
  #define ECTP_CLASS_SWAPOUT      2
  #define ECTP_CLASS_SWAPIN       3
  #define ECTP_CLASS_CLOSE        4
  #define ECTP_CLASS_UNLINK       5
  #define ECTP_CLASS_BATCH_UNLINK 6
  #define ECTP_CLASS_SPOOL_IN     7
  #define ECTP_CLASS_ASYNC_BOUNCE 8
  #define ECTP_CLASS_SIEVE_IO     9
  int job_class;

  /* optional concurrency restraint */
  sem_t *concurrency;

  /* the task to execute */
  ec_thread_pool_work_func worker;
  void *closure;

  /* context for completion */
  union _ec_thread_pool_job_r {
    struct _ec_thread_pool_job_r_e {
      Event *event;
      int mask;
      validate_context *ctx;
      ec_scheduler_inst *inst;
    } e;
    struct _ec_thread_pool_job_r_cb {
      ec_thread_pool_completion_func func;
      void *closure;
      ec_scheduler_inst *inst;
    } cb;
    sem_t *sema;
  } r;

  /* should the worker free this job struct after performing
   * the completion action ? The job MUST have been allocated
   * via ec_malloc, and this field MUST be set to memtype
   * that was used for the allocation */
  int free_on_completion_memtype;

  /* if skip_completion is true, then when the job completes,
   * the completion routine handling is skipped.  This allows
   * the job to be externally completed via ec_async_complete_tail()
   * at some later point in time.  This allows both blocking and
   * non-blocking tasks to be scheduled via this job API */
  unsigned skip_completion:1;

  /* if skip_on_shutdown is true, and the job is popped off
   * the queue during shutdown, then the job is simply discarded. */
  unsigned skip_on_shutdown:1;

  unsigned _spare_bits:30;

  const char *file;
  int line;
}

To use this struct, include the file ec_thread_pool.h.

See Also

“The Thread Pool API”, “ec_datasource_closure” and ec_datasource_cache_query