|
|
|
#ifndef _LIGHTTPD_JOBQUEUE_H_
|
|
|
|
#define _LIGHTTPD_JOBQUEUE_H_
|
|
|
|
|
|
|
|
#ifndef _LIGHTTPD_EVENTS_H_
|
|
|
|
#error Include lighttpd/events.h instead
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct liJob liJob;
|
|
|
|
typedef struct liJobRef liJobRef;
|
|
|
|
typedef struct liJobQueue liJobQueue;
|
|
|
|
|
|
|
|
typedef void (*liJobCB)(liJob *job);
|
|
|
|
|
|
|
|
/* All data here is private; use the functions to interact with the job-queue */
|
|
|
|
|
|
|
|
struct liJob {
|
|
|
|
guint generation;
|
|
|
|
GList link;
|
|
|
|
liJobCB callback;
|
|
|
|
liJobRef *ref;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct liJobRef {
|
|
|
|
gint refcount;
|
|
|
|
liJob *job;
|
|
|
|
liJobQueue *queue;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct liJobQueue {
|
|
|
|
guint generation;
|
|
|
|
|
|
|
|
liEventPrepare prepare_watcher;
|
|
|
|
|
|
|
|
GQueue queue;
|
|
|
|
liEventTimer queue_watcher;
|
|
|
|
|
|
|
|
GAsyncQueue *async_queue;
|
|
|
|
liEventAsync async_queue_watcher;
|
|
|
|
};
|
|
|
|
|
|
|
|
LI_API void li_job_queue_init(liJobQueue *jq, liEventLoop *loop);
|
|
|
|
LI_API void li_job_queue_clear(liJobQueue *jq); /* runs until all jobs are done */
|
|
|
|
|
|
|
|
LI_API void li_job_init(liJob *job, liJobCB callback);
|
|
|
|
LI_API void li_job_reset(liJob *job);
|
|
|
|
LI_API void li_job_stop(liJob *job); /* remove job from queue if active and detach references */
|
|
|
|
LI_API void li_job_clear(liJob *job);
|
|
|
|
|
|
|
|
/* marks the job for later execution */
|
|
|
|
LI_API void li_job_later(liJobQueue *jq, liJob *job);
|
|
|
|
LI_API void li_job_later_ref(liJobRef *jobref); /* NOT thread-safe! */
|
|
|
|
/* if the job didn't run in this generation yet, run it now; otherwise mark it for later execution */
|
|
|
|
LI_API void li_job_now(liJobQueue *jq, liJob *job);
|
|
|
|
LI_API void li_job_now_ref(liJobRef *jobref); /* NOT thread-safe! */
|
|
|
|
|
|
|
|
LI_API void li_job_async(liJobRef *jobref);
|
|
|
|
/* marks the job for later execution; this is the only threadsafe way to push a job to the queue */
|
|
|
|
|
|
|
|
LI_API liJobRef* li_job_ref(liJobQueue *jq, liJob *job);
|
|
|
|
LI_API void li_job_ref_release(liJobRef *jobref);
|
|
|
|
LI_API void li_job_ref_acquire(liJobRef *jobref);
|
|
|
|
|
|
|
|
#endif
|