X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.h;h=26aaabe9a5678621b9e3fe4d1ba4c27d34fbfb4f;hp=9855475d0a7311708306417a77fca071d238ef4c;hb=3f9051d22fcf6e968259946eaf521ac3daac470e;hpb=37db6c718cbd9e350d46703c36dc6860477de476 diff --git a/sched.h b/sched.h index 9855475d..26aaabe9 100644 --- a/sched.h +++ b/sched.h @@ -1,29 +1,81 @@ +/* + * Copyright (C) 2006-2009 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 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. + */ 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 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. */ + int (*select_function)(int, fd_set *, fd_set *, struct timeval *); }; +/** + * Paraslash's task structure. + * + * 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. + */ struct task { - void *private_data; - unsigned flags; - int ret; + /** + * The 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. + * + * Evaluate and act upon the results of the previous select call. + */ void (*post_select)(struct sched *s, struct task *t); - void (*event_handler)(struct task *t); + /** Whether this task is in error state. */ + 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; + /** Descriptive text and current status of the task. */ char status[MAXLINE]; }; -enum task_flags { - PRE_ADD_TAIL = 1, - POST_ADD_TAIL = 2, -}; +/** + * 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. + */ +extern struct timeval *now; -void *register_task(struct task *t); -void unregister_task(struct task *t); -int sched(struct sched *s); -void init_sched(void); +void register_task(struct task *t); +int schedule(struct sched *s); +char *get_task_list(void); +int kill_task(char *id); +void sched_shutdown(void);