X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=sched.h;h=f89b89ffc012551e17febc9de463882eb5c678b6;hb=742c8b3f79a59278ced71e1855da1846b157b494;hp=ada1cc106c068706fc175cc883450c17a237f4b7;hpb=68630d8b55d688a7c7ce116951c310150aa9c166;p=paraslash.git diff --git a/sched.h b/sched.h index ada1cc10..f89b89ff 100644 --- a/sched.h +++ b/sched.h @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2006 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2006 Andre Noll , see file COPYING. */ /** \file sched.h Sched and task structures and exported symbols from sched.c. */ @@ -15,12 +11,14 @@ * function which is called from the scheduler main loop before it calls * select(). Similarly, each task must define a post_select function which is * called after the select call. + * + * \sa select(2), poll(2). */ struct sched { - /** Initial value before any pre_select call. */ - struct timeval default_timeout; - /** The current timeout for the upcoming select call. */ - struct timeval select_timeout; + /** Initial value (in milliseconds) before any pre_select call. */ + int default_timeout; + /** The timeout (also in milliseconds) for the next select call. */ + int timeout; /** fds that should be watched for readability. */ fd_set rfds; /** fds that should be watched for writability. */ @@ -28,7 +26,7 @@ struct sched { /** Highest numbered file descriptor in any of the above fd sets. */ int max_fileno; /** If non-NULL, use this function instead of para_select. */ - int (*select_function)(int, fd_set *, fd_set *, struct timeval *); + int (*select_function)(int, fd_set *, fd_set *, int timeout); /** Tasks which have been registered to the scheduler. */ struct list_head task_list; }; @@ -40,18 +38,27 @@ struct task_info { /** Used for log messages and by \ref get_task_list(). */ const char *name; /** - * The optional pre select method. + * Configure watch fds and impose an upper bound on the I/O timeout. + * + * If this is not NULL, the function is called at each iteration of the + * scheduler's main loop. Its purpose is to tell the scheduler that + * certain file descriptors should be monitored for readiness for I/O. + * The function may also lower the scheduler's timeout value (but shall + * never increase it) to impose an upper bound on the waiting time in + * case no file descriptors happen to be ready. * - * Its purpose is to add file descriptors to the fd sets of the - * scheduler and to decrease the select timeout if necessary. + * \sa \ref time.c. */ void (*pre_select)(struct sched *s, void *context); /** - * The mandatory post select method. + * Perform I/O on file descriptors which are ready for I/O. * - * 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. + * This mandatory hook is called after the system call which monitors + * file descriptors returns. The function should perform non-blocking + * I/O on those file descriptors which are reported as being ready. + * + * If this function returns a negative value, the scheduler unregisters + * the task. */ int (*post_select)(struct sched *s, void *context); /** @@ -84,3 +91,15 @@ void sched_request_timeout(struct timeval *to, struct sched *s); void sched_request_timeout_ms(long unsigned ms, 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); +void sched_monitor_readfd(int fd, struct sched *s); +void sched_monitor_writefd(int fd, struct sched *s); + +static inline bool sched_read_ok(int fd, const struct sched *s) +{ + return FD_ISSET(fd, &s->rfds); +} + +static inline bool sched_write_ok(int fd, const struct sched *s) +{ + return FD_ISSET(fd, &s->wfds); +}