/* Copyright (c) 2015 Google Inc
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Hacked BSD taskqueues.  In lieu of actually running a kproc or something that
 * sleeps on a queue of tasks, we'll just blast out a kmsg.  We can always
 * change the implementation if we need more control.
 *
 *
 * Linux workqueue wrappers:
 *
 * Caveats:
 * - Workqueues have no core affinity or anything.  queued work goes to the
 * calling core.  Scheduled work goes to core 0.
 * - There are no extra delays in time.  All work are RKMs.
 * - You can't cancel a message.  The differences btw work and delayed_work
 * aren't entirely clear.
 */

#pragma once

typedef void (*task_fn_t)(void *context, int pending);
struct taskqueue {};
struct task {
	task_fn_t					ta_func;		/*	task handler */
	void						*ta_context;	/*	argument for handler */
};

#define taskqueue_drain(x, y)
#define taskqueue_free(x)
#define taskqueue_create(a, b, c, d) ((struct taskqueue*)(0xcafebabe))
#define taskqueue_create_fast taskqueue_create
#define taskqueue_start_threads(a, b, c, d, e) (1)

int taskqueue_enqueue(struct taskqueue *queue, struct task *task);
/* We're already fast, no need for another function! */
#define taskqueue_enqueue_fast taskqueue_enqueue
#define TASK_INIT(str, dummy, func, arg)                                       \
	(str)->ta_func = func;                                                     \
	(str)->ta_context = (void*)arg;

struct workqueue_struct {
};

struct work_struct {
	void (*func)(struct work_struct *);
	/* TODO: args and bookkeeping to support cancel{,_sync}. */
	void *arg;
};

/* Delayed work is embedded in other structs.  Handlers will expect to get a
 * work_struct pointer. */
struct delayed_work {
	struct work_struct 			work;
	/* TODO: support for the actual alarm / timer */
};

static inline struct delayed_work *to_delayed_work(struct work_struct *work)
{
	return container_of(work, struct delayed_work, work);
}

#define INIT_DELAYED_WORK(dwp, funcp) (dwp)->work.func = (funcp)
#define INIT_WORK(wp, funcp) (wp)->func = (funcp)
void flush_workqueue(struct workqueue_struct *wq);
void destroy_workqueue(struct workqueue_struct *wq);
struct workqueue_struct *create_singlethread_workqueue(char *name);

bool queue_work(struct workqueue_struct *wq, struct work_struct *dwork);
bool schedule_work(struct work_struct *dwork);
bool cancel_work(struct work_struct *dwork);
bool cancel_work_sync(struct work_struct *dwork);

bool queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork,
                        unsigned long delay);
bool schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);
bool cancel_delayed_work(struct delayed_work *dwork);
bool cancel_delayed_work_sync(struct delayed_work *dwork);
