Introducing tasks.
This commit is contained in:
@@ -8,6 +8,22 @@
|
||||
#define _NXT_WORK_QUEUE_H_INCLUDED_
|
||||
|
||||
|
||||
typedef struct nxt_work_s nxt_work_t;
|
||||
|
||||
typedef struct {
|
||||
nxt_thread_t *thread;
|
||||
nxt_log_t *log;
|
||||
uint32_t ident;
|
||||
nxt_work_t *next_work;
|
||||
|
||||
/* TODO: exception_handler, prev/next task, subtasks. */
|
||||
} nxt_task_t;
|
||||
|
||||
|
||||
#define nxt_task_next_ident() \
|
||||
((uint32_t) nxt_atomic_fetch_add(&nxt_task_ident, 1) & 0x3fffffff)
|
||||
|
||||
|
||||
/*
|
||||
* A work handler with just the obj and data arguments instead
|
||||
* of pointer to a possibly large a work struct allows to call
|
||||
@@ -16,17 +32,15 @@
|
||||
* source filters, so the data argument has been introduced and
|
||||
* is used where appropriate.
|
||||
*/
|
||||
typedef void (*nxt_work_handler_t)(nxt_thread_t *thr, void *obj, void *data);
|
||||
|
||||
typedef struct nxt_work_s nxt_work_t;
|
||||
typedef void (*nxt_work_handler_t)(nxt_task_t *task, void *obj, void *data);
|
||||
|
||||
|
||||
struct nxt_work_s {
|
||||
nxt_work_t *next;
|
||||
nxt_work_handler_t handler;
|
||||
nxt_task_t *task;
|
||||
void *obj;
|
||||
void *data;
|
||||
nxt_log_t *log;
|
||||
};
|
||||
|
||||
|
||||
@@ -79,24 +93,24 @@ NXT_EXPORT void nxt_thread_work_queue_create(nxt_thread_t *thr,
|
||||
size_t chunk_size);
|
||||
NXT_EXPORT void nxt_thread_work_queue_destroy(nxt_thread_t *thr);
|
||||
NXT_EXPORT void nxt_thread_work_queue_add(nxt_thread_t *thr,
|
||||
nxt_work_queue_t *wq,
|
||||
nxt_work_handler_t handler, void *obj, void *data, nxt_log_t *log);
|
||||
nxt_work_queue_t *wq, nxt_work_handler_t handler, nxt_task_t *task,
|
||||
void *obj, void *data);
|
||||
NXT_EXPORT void nxt_thread_work_queue_push(nxt_thread_t *thr,
|
||||
nxt_work_queue_t *wq, nxt_work_handler_t handler, void *obj, void *data,
|
||||
nxt_log_t *log);
|
||||
nxt_work_queue_t *wq, nxt_work_handler_t handler, nxt_task_t *task,
|
||||
void *obj, void *data);
|
||||
NXT_EXPORT void nxt_work_queue_attach(nxt_thread_t *thr, nxt_work_queue_t *wq);
|
||||
NXT_EXPORT nxt_work_handler_t nxt_thread_work_queue_pop(nxt_thread_t *thr,
|
||||
void **obj, void **data, nxt_log_t **log);
|
||||
nxt_task_t **task, void **obj, void **data);
|
||||
NXT_EXPORT void nxt_thread_work_queue_drop(nxt_thread_t *thr, void *data);
|
||||
|
||||
|
||||
#define \
|
||||
nxt_thread_current_work_queue_add(thr, handler, obj, data, log) \
|
||||
nxt_thread_current_work_queue_add(thr, handler, task, obj, data) \
|
||||
do { \
|
||||
nxt_thread_t *_thr = thr; \
|
||||
\
|
||||
nxt_thread_work_queue_add(_thr, _thr->work_queue.head, \
|
||||
handler, obj, data, log); \
|
||||
handler, task, obj, data); \
|
||||
} while (0)
|
||||
|
||||
|
||||
@@ -118,18 +132,18 @@ nxt_work_queue_name(_wq, _name)
|
||||
|
||||
|
||||
NXT_EXPORT void nxt_thread_last_work_queue_add(nxt_thread_t *thr,
|
||||
nxt_work_handler_t handler, void *obj, void *data, nxt_log_t *log);
|
||||
nxt_work_handler_t handler, void *obj, void *data);
|
||||
NXT_EXPORT nxt_work_handler_t nxt_thread_last_work_queue_pop(nxt_thread_t *thr,
|
||||
void **obj, void **data, nxt_log_t **log);
|
||||
nxt_task_t **task, void **obj, void **data);
|
||||
|
||||
|
||||
NXT_EXPORT void nxt_locked_work_queue_create(nxt_locked_work_queue_t *lwq,
|
||||
size_t chunk_size);
|
||||
NXT_EXPORT void nxt_locked_work_queue_destroy(nxt_locked_work_queue_t *lwq);
|
||||
NXT_EXPORT void nxt_locked_work_queue_add(nxt_locked_work_queue_t *lwq,
|
||||
nxt_work_handler_t handler, void *obj, void *data, nxt_log_t *log);
|
||||
nxt_work_handler_t handler, nxt_task_t *task, void *obj, void *data);
|
||||
NXT_EXPORT nxt_work_handler_t nxt_locked_work_queue_pop(
|
||||
nxt_locked_work_queue_t *lwq, void **obj, void **data, nxt_log_t **log);
|
||||
nxt_locked_work_queue_t *lwq, nxt_task_t **task, void **obj, void **data);
|
||||
NXT_EXPORT void nxt_locked_work_queue_move(nxt_thread_t *thr,
|
||||
nxt_locked_work_queue_t *lwq, nxt_work_queue_t *wq);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user