From: Andre Date: Mon, 12 Jun 2006 13:17:06 +0000 (+0200) Subject: Add scheduler documentation X-Git-Tag: v0.2.14~62^2~15 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=bc5f28a9274c3b8ed5086399cec3b1c9b3e250b9 Add scheduler documentation and a GPL header --- diff --git a/sched.h b/sched.h index bd1ad796..8a6ed1a8 100644 --- a/sched.h +++ b/sched.h @@ -1,22 +1,92 @@ +/* + * Copyright (C) 2006 Andre Noll + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + */ + +/** \file sched.c Paraslash's task and scheduling functions */ + + +/** + * paraslash's scheduler + * + * desinged with KISS in mind. It maintains two lists: The pre_select list + * and the post_select list. Tasks add hokks 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. + * + * The pre_select or the post_select pointer, but not both may be NULL. Once + * a task is registered, its pre_select and post_select function gets called + * from the scheduler's mainloop. The purpose of the pre_select loop is to add + * file descriptors to the fd sets of the scheduler and to decrease the select + * timeout if neccessary. The post_select function may then evaluate these fd + * sets and act upon the results. + + * 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 happend). 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; + /** pre_select hook */ void (*pre_select)(struct sched *s, struct task *t); + /** post_select hook */ void (*post_select)(struct sched *s, struct task *t); + /** gets called */ 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]; }; +/** + * 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);