X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.h;h=7ab830861a940bff99c3085d3e07be055eb5c513;hp=632fddde19c62782aa89b5db9cc68e1f7c3b8e41;hb=5b972aabaf27931cae6ac318c9b920d33593f07b;hpb=704605b466aca3ae6ca6d1e03b6af55e3d245502 diff --git a/sched.h b/sched.h index 632fddde..7ab83086 100644 --- a/sched.h +++ b/sched.h @@ -1,25 +1,88 @@ +/* + * 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 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; + /** 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; - fd_set rfds, wfds; + /** the return value of the previous select call */ int select_ret; - struct timeval default_timeout; }; +/** + * 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 return a negative value via \a t->ret the + * (optional) event_handler gets called (it may also be called in case another + * event happened). In many cases the only possible event is an error or an eof + * condition and the event handler simply unregisters the task from the + * scheduler. + * + * \sa struct sched + */ struct task { + /** pointer to the struct this task is embedded in */ void *private_data; - 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); + /** gets called if pre_select or post_select returned an error */ void (*event_handler)(struct task *t); + /** pre_select() and post_select store their return value here */ + int ret; + /** 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]; }; -void *register_task(struct task *t); +/** + * 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); +int schedule(struct sched *s); char *get_task_list(void); int kill_task(char *id);