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
+
+/* Retry for queue that is 'blocked' or 'retry later' */
+#define WORK_QUEUE_DEFAULT_RETRY 0
/* action value, for use by item processor and item error handlers */
typedef enum {
unsigned long
yield; /* yield time in us for associated thread */
+
+ uint32_t retry; /* Optional retry timeout if queue is blocked */
} 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 */
} cycles; /* cycle counts */
/* private state */
- u_int16_t flags; /* user set flag */
+ uint16_t flags; /* user set flag */
};
/* User API */
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);
}
* 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 *);