X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.h;h=ada1cc106c068706fc175cc883450c17a237f4b7;hp=9855475d0a7311708306417a77fca071d238ef4c;hb=99708bef7ad12ccb9399186f6055004d11bcf3db;hpb=37db6c718cbd9e350d46703c36dc6860477de476 diff --git a/sched.h b/sched.h index 9855475d..ada1cc10 100644 --- a/sched.h +++ b/sched.h @@ -1,29 +1,86 @@ +/* + * Copyright (C) 2006 Andre Noll + * + * Licensed under the GPL v2. For licencing details see COPYING. + */ + +/** \file sched.h Sched and task structures and exported symbols from sched.c. */ + + +/** + * Paraslash's scheduler. + * + * Designed with KISS in mind. It maintains a list of task structures which is + * extended when a new task is registered. Each task may define a pre_select + * function which is called from the scheduler main loop before it calls + * select(). Similarly, each task must define a post_select function which is + * called after the select call. + */ struct sched { - struct timeval now, timeout; - int max_fileno; - fd_set rfds, wfds; - int select_ret; + /** Initial value before any pre_select call. */ struct timeval default_timeout; + /** The current timeout for the upcoming select call. */ + struct timeval select_timeout; + /** fds that should be watched for readability. */ + fd_set rfds; + /** fds that should be watched for writability. */ + fd_set wfds; + /** Highest numbered file descriptor in any of the above fd sets. */ + int max_fileno; + /** If non-NULL, use this function instead of para_select. */ + int (*select_function)(int, fd_set *, fd_set *, struct timeval *); + /** Tasks which have been registered to the scheduler. */ + struct list_head task_list; }; -struct task { - void *private_data; - unsigned flags; - int ret; - void (*pre_select)(struct sched *s, struct task *t); - void (*post_select)(struct sched *s, struct task *t); - void (*event_handler)(struct task *t); - struct list_head pre_select_node; - struct list_head post_select_node; - char status[MAXLINE]; -}; +struct task; -enum task_flags { - PRE_ADD_TAIL = 1, - POST_ADD_TAIL = 2, +/** Information that must be supplied by callers of \ref task_register(). */ +struct task_info { + /** Used for log messages and by \ref get_task_list(). */ + const char *name; + /** + * The optional pre select method. + * + * Its purpose is to add file descriptors to the fd sets of the + * scheduler and to decrease the select timeout if necessary. + */ + void (*pre_select)(struct sched *s, void *context); + /** + * The mandatory post select method. + * + * Its purpose is to evaluate and act upon the results of the previous + * select call. If this function returns a negative value, the + * scheduler unregisters the task. + */ + int (*post_select)(struct sched *s, void *context); + /** + * This pointer is saved when the task is registered. It is passed to + * ->pre_select() and ->post_select(). Usually this is a pointer to the + * struct owned by the caller which contains the task pointer. + */ + void *context; }; -void *register_task(struct task *t); -void unregister_task(struct task *t); -int sched(struct sched *s); -void init_sched(void); +/** + * This is set by the scheduler at the beginning of its main loop. It may be + * used (read-only) from everywhere. As none of the functions called by the + * scheduler are allowed to block, this value should be accurate enough so that + * there is no need to call clock_gettime() directly. + */ +extern const struct timeval *now; + +struct task *task_register(struct task_info *info, struct sched *s); +int schedule(struct sched *s); +void sched_shutdown(struct sched *s); +char *get_task_list(struct sched *s); +void task_notify(struct task *t, int err); +void task_notify_all(struct sched *s, int err); +int task_get_notification(const struct task *t); +int task_status(const struct task *t); +int task_reap(struct task **tptr); +void sched_min_delay(struct sched *s); +void sched_request_timeout(struct timeval *to, struct sched *s); +void sched_request_timeout_ms(long unsigned ms, struct sched *s); +int sched_request_barrier(struct timeval *barrier, struct sched *s); +int sched_request_barrier_or_min_delay(struct timeval *barrier, struct sched *s);