X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.h;h=9c5c098e0fbe38dbe7d5f2b77e33994ffa4ed1bc;hp=1da5a220aa8b5f52c2b31685a985cf58997a5e4a;hb=a28eef552dc779eac12c1df430522dc4e20ae428;hpb=5bf80b0268b0afb3984aea74d41eddef34d50d03 diff --git a/sched.h b/sched.h index 1da5a220..9c5c098e 100644 --- a/sched.h +++ b/sched.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2010 Andre Noll + * Copyright (C) 2006-2013 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -29,6 +29,10 @@ struct sched { int max_fileno; /** If non-NULL, use this function instead of para_select. */ int (*select_function)(int, fd_set *, fd_set *, struct timeval *); + /** Currently active pre_select functions. */ + struct list_head pre_select_list; + /** Currently active post_select functions. */ + struct list_head post_select_list; }; /** @@ -51,11 +55,13 @@ struct task { */ void (*pre_select)(struct sched *s, struct task *t); /** - * The postselect hook of \a t. + * The 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); + int (*post_select)(struct sched *s, struct task *t); /** Whether this task is in error state. */ int error; /** Position of the task in the pre_select list of the scheduler. */ @@ -64,23 +70,26 @@ struct task { struct list_head post_select_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(struct task *t); 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); -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);