sched: add support for scheduling functions to be executed later
This commit is contained in:
@@ -20,6 +20,7 @@ struct cpu_data {
|
||||
int c_preempt_count;
|
||||
|
||||
struct runqueue c_rq;
|
||||
struct workqueue c_wq;
|
||||
struct queue c_timers;
|
||||
};
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
struct runqueue;
|
||||
struct work_item;
|
||||
|
||||
enum task_state {
|
||||
TASK_RUNNING,
|
||||
@@ -135,6 +136,24 @@ struct waitqueue {
|
||||
spin_lock_t wq_lock;
|
||||
};
|
||||
|
||||
typedef void(*work_func_t)(struct work_item *);
|
||||
|
||||
struct work_item {
|
||||
void *w_data;
|
||||
work_func_t w_func;
|
||||
struct queue_entry w_head;
|
||||
};
|
||||
|
||||
struct worker_pool {
|
||||
struct thread **wp_workers;
|
||||
size_t wp_nworkers;
|
||||
};
|
||||
|
||||
struct workqueue {
|
||||
spin_lock_t wq_lock;
|
||||
struct queue wq_queue; /* list of struct work_item */
|
||||
};
|
||||
|
||||
extern kern_status_t sched_init(void);
|
||||
extern void schedule(enum sched_mode mode);
|
||||
extern void preempt_disable(void);
|
||||
@@ -151,6 +170,7 @@ static inline void rq_unlock(struct runqueue *rq, unsigned long flags)
|
||||
{
|
||||
spin_unlock_irqrestore(&rq->rq_lock, flags);
|
||||
}
|
||||
extern void rq_remove_thread(struct runqueue *rq, struct thread *thr);
|
||||
extern struct runqueue *cpu_rq(unsigned int cpu);
|
||||
|
||||
extern struct task *task_alloc(void);
|
||||
@@ -192,6 +212,7 @@ extern void add_timer(struct timer *timer);
|
||||
extern void remove_timer(struct timer *timer);
|
||||
extern unsigned long schedule_timeout(unsigned long clock_ticks);
|
||||
extern unsigned long milli_sleep(unsigned long ms);
|
||||
extern void sleep_forever(void);
|
||||
|
||||
extern void wait_item_init(struct wait_item *item, struct thread *thr);
|
||||
extern void thread_wait_begin(struct wait_item *waiter, struct waitqueue *q);
|
||||
@@ -200,6 +221,15 @@ extern void wait_on_queue(struct waitqueue *q);
|
||||
extern void wakeup_queue(struct waitqueue *q);
|
||||
extern void wakeup_one(struct waitqueue *q);
|
||||
|
||||
extern void work_item_init(work_func_t func, void *data, struct work_item *out);
|
||||
extern void workqueue_init(struct workqueue *wq);
|
||||
extern struct worker_pool *worker_pool_create(size_t nworkers);
|
||||
extern struct worker_pool *global_worker_pool(void);
|
||||
extern bool schedule_work_on(struct workqueue *wq, struct work_item *work);
|
||||
extern bool schedule_work(struct work_item *work);
|
||||
|
||||
extern void wake_workers(struct workqueue *wq, struct worker_pool *pool);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
||||
#define MAX(x, y) ((x) > (y) ? (x) : (y))
|
||||
#define CLAMP(x, lo, hi) (MIN(MAX(x, lo), hi))
|
||||
|
||||
extern uint64_t hash_string(const char *s);
|
||||
extern void data_size_to_string(size_t value, char *out, size_t outsz);
|
||||
static inline bool power_of_2(size_t x) { return (x > 0 && (x & (x - 1)) == 0); }
|
||||
|
||||
Reference in New Issue
Block a user