2018-06-20 14:13:28 +02:00
|
|
|
/* Copyright (c) 2013-2018, The Tor Project, Inc. */
|
2013-09-23 07:19:16 +02:00
|
|
|
/* See LICENSE for licensing information */
|
|
|
|
|
2018-07-10 18:22:01 +02:00
|
|
|
/**
|
|
|
|
* \file workqueue.h
|
|
|
|
* \brief Header for workqueue.c
|
|
|
|
**/
|
|
|
|
|
2013-09-23 07:19:16 +02:00
|
|
|
#ifndef TOR_WORKQUEUE_H
|
|
|
|
#define TOR_WORKQUEUE_H
|
|
|
|
|
2018-06-29 17:35:49 +02:00
|
|
|
#include "lib/cc/torint.h"
|
2013-09-23 07:19:16 +02:00
|
|
|
|
2013-09-25 17:05:27 +02:00
|
|
|
/** A replyqueue is used to tell the main thread about the outcome of
|
2016-07-05 18:10:12 +02:00
|
|
|
* work that we queued for the workers. */
|
2013-09-23 07:19:16 +02:00
|
|
|
typedef struct replyqueue_s replyqueue_t;
|
2013-09-25 17:05:27 +02:00
|
|
|
/** A thread-pool manages starting threads and passing work to them. */
|
2013-09-23 07:19:16 +02:00
|
|
|
typedef struct threadpool_s threadpool_t;
|
2013-09-25 17:05:27 +02:00
|
|
|
/** A workqueue entry represents a request that has been passed to a thread
|
|
|
|
* pool. */
|
2013-09-24 22:57:40 +02:00
|
|
|
typedef struct workqueue_entry_s workqueue_entry_t;
|
2013-09-23 07:19:16 +02:00
|
|
|
|
2015-08-20 16:48:13 +02:00
|
|
|
/** Possible return value from a work function: */
|
2017-04-06 21:51:52 +02:00
|
|
|
typedef enum workqueue_reply_t {
|
2015-08-20 16:48:13 +02:00
|
|
|
WQ_RPL_REPLY = 0, /** indicates success */
|
|
|
|
WQ_RPL_ERROR = 1, /** indicates fatal error */
|
|
|
|
WQ_RPL_SHUTDOWN = 2, /** indicates thread is shutting down */
|
|
|
|
} workqueue_reply_t;
|
2013-09-23 07:19:16 +02:00
|
|
|
|
2017-07-12 17:47:01 +02:00
|
|
|
/** Possible priorities for work. Lower numeric values are more important. */
|
|
|
|
typedef enum workqueue_priority_t {
|
|
|
|
WQ_PRI_HIGH = 0,
|
|
|
|
WQ_PRI_MED = 1,
|
|
|
|
WQ_PRI_LOW = 2,
|
|
|
|
} workqueue_priority_t;
|
|
|
|
|
|
|
|
workqueue_entry_t *threadpool_queue_work_priority(threadpool_t *pool,
|
|
|
|
workqueue_priority_t prio,
|
|
|
|
workqueue_reply_t (*fn)(void *,
|
|
|
|
void *),
|
|
|
|
void (*reply_fn)(void *),
|
|
|
|
void *arg);
|
|
|
|
|
2013-09-24 22:57:40 +02:00
|
|
|
workqueue_entry_t *threadpool_queue_work(threadpool_t *pool,
|
2015-08-20 16:48:13 +02:00
|
|
|
workqueue_reply_t (*fn)(void *,
|
|
|
|
void *),
|
2013-09-24 22:57:40 +02:00
|
|
|
void (*reply_fn)(void *),
|
|
|
|
void *arg);
|
2015-08-20 16:48:13 +02:00
|
|
|
|
2015-01-14 19:29:58 +01:00
|
|
|
int threadpool_queue_update(threadpool_t *pool,
|
|
|
|
void *(*dup_fn)(void *),
|
2015-08-20 16:48:13 +02:00
|
|
|
workqueue_reply_t (*fn)(void *, void *),
|
2015-01-14 19:29:58 +01:00
|
|
|
void (*free_fn)(void *),
|
|
|
|
void *arg);
|
2013-09-28 06:33:10 +02:00
|
|
|
void *workqueue_entry_cancel(workqueue_entry_t *pending_work);
|
2013-09-23 07:19:16 +02:00
|
|
|
threadpool_t *threadpool_new(int n_threads,
|
|
|
|
replyqueue_t *replyqueue,
|
|
|
|
void *(*new_thread_state_fn)(void*),
|
|
|
|
void (*free_thread_state_fn)(void*),
|
|
|
|
void *arg);
|
|
|
|
replyqueue_t *threadpool_get_replyqueue(threadpool_t *tp);
|
|
|
|
|
2013-09-25 20:31:59 +02:00
|
|
|
replyqueue_t *replyqueue_new(uint32_t alertsocks_flags);
|
2013-09-23 07:19:16 +02:00
|
|
|
void replyqueue_process(replyqueue_t *queue);
|
|
|
|
|
2017-10-03 18:49:34 +02:00
|
|
|
int threadpool_register_reply_event(threadpool_t *tp,
|
|
|
|
void (*cb)(threadpool_t *tp));
|
|
|
|
|
2017-09-15 22:24:44 +02:00
|
|
|
#endif /* !defined(TOR_WORKQUEUE_H) */
|