X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.h;h=303877a4435d0b31fc779ac03d68e20326af17b2;hp=7681567be31534e3ef98af3dc19f16f0958290d7;hb=0b38d56fdd56cc51ee4286a49a4aa91d83618fc1;hpb=ffb2eaa90429f6d5c3d369509efcdf91c5463dad diff --git a/sched.h b/sched.h index 7681567b..303877a4 100644 --- a/sched.h +++ b/sched.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2014 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -10,25 +10,27 @@ /** * Paraslash's scheduler. * - * Designed with KISS in mind. It manages two lists of tasks. The pre_select - * list contains pointers to functions that are called before calling select() - * from the main loop. Similarly, \a post_select_list is a list of function - * pointers each of which is called after the select call. Tasks add hooks to - * these lists by registering themselves to the 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 { /** Initial value before any pre_select call. */ struct timeval default_timeout; /** The current timeout for the upcoming select call. */ - struct timeval timeout; + 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; - /** In non-NULL, use this function instead of para_select. */ + /** 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; }; /** @@ -37,50 +39,50 @@ struct sched { * Before registering a task to the scheduler, the task structure must be * filled in properly by the caller. * - * If one of these functions sets \a t->error to a negative value, the - * task gets unregistered automatically. - * - * \sa struct sched. + * \sa \ref sched. */ struct task { /** - * The pre select hook of \a t. + * The optional pre select hook of \a t. * * 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, struct task *t); /** - * The postselect hook of \a t. + * The mandatory post select hook of \a t. * - * Evaluate and act upon the results of the previous select call. + * 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. */ - void (*post_select)(struct sched *s, struct task *t); - /** Whether this task is in error state. */ + int (*post_select)(struct sched *s, struct task *t); + /** Whether this task is active (>=0) or in error state (<0). */ int error; - /** Position of the task in the pre_select list of the scheduler. */ - struct list_head pre_select_node; - /** Position of the task in the post_select list of the scheduler. */ - struct list_head post_select_node; + /** Position of the task in the task list of the scheduler. */ + struct list_head node; /** Descriptive text and current status of the task. */ char status[255]; + /** If less than zero, the task was notified by another task. */ + int notification; }; /** * 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 gettimeofday() directly. + * there is no need to call clock_gettime() directly. */ extern struct timeval *now; -void register_task(struct task *t); +void register_task(struct sched *s, struct task *t); int schedule(struct sched *s); -char *get_task_list(void); -int kill_task(char *id); -void sched_shutdown(void); +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); void sched_min_delay(struct sched *s); -void sched_request_timeout(struct timeval *timeout, struct sched *s); +void sched_request_timeout(struct timeval *to, struct sched *s); void sched_request_timeout_ms(long unsigned ms, struct sched *s); -void sched_request_barrier(struct timeval *barrier, struct sched *s); -void sched_request_barrier_or_min_delay(struct timeval *barrier, 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);