diff options
Diffstat (limited to 'lib/workqueue.h')
| -rw-r--r-- | lib/workqueue.h | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/workqueue.h b/lib/workqueue.h index df35d44fbc..c9785de09a 100644 --- a/lib/workqueue.h +++ b/lib/workqueue.h @@ -28,7 +28,7 @@ DECLARE_MTYPE(WORK_QUEUE) /* Hold time for the initial schedule of a queue run, in millisec */ -#define WORK_QUEUE_DEFAULT_HOLD 50 +#define WORK_QUEUE_DEFAULT_HOLD 50 /* action value, for use by item processor and item error handlers */ typedef enum { @@ -93,8 +93,9 @@ struct work_queue { } spec; /* remaining fields should be opaque to users */ - STAILQ_HEAD(work_queue_items, work_queue_item) items; /* queue item list */ - int item_count; /* queued items */ + STAILQ_HEAD(work_queue_items, work_queue_item) + items; /* queue item list */ + int item_count; /* queued items */ unsigned long runs; /* runs count */ unsigned long yields; /* yields count */ @@ -120,7 +121,8 @@ static inline bool work_queue_empty(struct work_queue *wq) return (wq->item_count == 0) ? true : false; } -static inline struct work_queue_item *work_queue_last_item(struct work_queue *wq) +static inline struct work_queue_item * +work_queue_last_item(struct work_queue *wq) { return STAILQ_LAST(&wq->items, work_queue_item, wq); } @@ -146,8 +148,22 @@ static inline void work_queue_item_dequeue(struct work_queue *wq, * anything to it */ extern struct work_queue *work_queue_new(struct thread_master *, const char *); + /* destroy work queue */ -extern void work_queue_free(struct work_queue *); +/* + * The usage of work_queue_free is being transitioned to pass + * in the double pointer to remove use after free's. + */ +#if CONFDATE > 20190205 +CPP_NOTICE("work_queue_free without double pointer is deprecated, please fixup") +#endif +extern void work_queue_free_and_null(struct work_queue **); +extern void work_queue_free_original(struct work_queue *); +#define work_queue_free(X) \ + do { \ + work_queue_free_original((X)); \ + CPP_WARN("Please use work_queue_free_and_null"); \ + } while (0) /* Add the supplied data as an item onto the workqueue */ extern void work_queue_add(struct work_queue *, void *); |
