]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - sched.h
Misc documentation cleanups related to select().
[paraslash.git] / sched.h
diff --git a/sched.h b/sched.h
index ada1cc106c068706fc175cc883450c17a237f4b7..f89b89ffc012551e17febc9de463882eb5c678b6 100644 (file)
--- a/sched.h
+++ b/sched.h
@@ -1,8 +1,4 @@
-/*
- * Copyright (C) 2006 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2006 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
 /** \file sched.h Sched and task structures and exported symbols from sched.c. */
 
  * 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);
+}