X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.h;h=6a35f0e8e56a2f7fa4609ce63906d57981dbff0b;hp=c706b5093fba47f3173cc183daa07f0b77120a48;hb=ba0c0797c76a2c94cb4a9f6938274fea5ba0226f;hpb=00cedf20a69178ac3ec3e43035a2d54868f1bc6d diff --git a/sched.h b/sched.h index c706b509..6a35f0e8 100644 --- a/sched.h +++ b/sched.h @@ -36,35 +36,55 @@ struct sched { /** * Paraslash's task structure. * - * Before registering a task to the scheduler, the task structure must be - * filled in properly by the caller. + * This is considered an internal structure and will eventually be made private. * * \sa \ref sched. */ struct task { + /** Copied from the task_info struct during task_register(). */ + void (*pre_select)(struct sched *s, struct task *t); + /** Copied from the task_info struct during task_register(). */ + 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 task list of the scheduler. */ + struct list_head node; + /** The task name supplied when the task was registered(). */ + char status[255]; + /** If less than zero, the task was notified by another task. */ + int notification; + /** True if task is in error state and exit status has been queried. */ + bool dead; + /** Usually a pointer to the struct containing this task. */ + void *context; +}; + +/** 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 hook of \a t. + * 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, struct task *t); /** - * The mandatory post select hook of \a t. + * 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, struct task *t); - /** Whether this task is active (>=0) or in error state (<0). */ - int error; - /** 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 pointer is saved when the task is register(ed). It may be + * queried from ->pre_select() and ->post_select() via \ref + * task_context(). Usually this is a pointer to the struct owned by the + * caller which contains the task pointer as one member. + */ + void *context; }; /** @@ -75,12 +95,16 @@ struct task { */ extern struct timeval *now; -void register_task(struct sched *s, struct task *t); +struct task *task_register(struct task_info *info, struct sched *s); +void *task_context(struct task *t); 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(struct task *t); +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);