]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - sched.c
vss: Clean up timeout computations.
[paraslash.git] / sched.c
diff --git a/sched.c b/sched.c
index b0e9ce12f221e901d761108899d98190ccf984d6..65176bd91a875ab16ce07194299dbc9bde5a00a5 100644 (file)
--- a/sched.c
+++ b/sched.c
@@ -7,7 +7,6 @@
 /** \file sched.c Paraslash's scheduling functions. */
 
 #include <regex.h>
-#include <dirent.h> /* readdir() */
 #include <assert.h>
 #include <sys/time.h>
 
@@ -38,21 +37,20 @@ static void unregister_task(struct task *t)
 {
        if (!initialized)
                return;
+       assert(t->error < 0);
        PARA_INFO_LOG("unregistering %s (%s)\n", t->status,
-               t->error <0? para_strerror(-t->error) : "shutdown");
+               para_strerror(-t->error));
        if (t->pre_select)
                list_del(&t->pre_select_node);
        if (t->post_select)
                list_del(&t->post_select_node);
-       t->error = -E_TASK_UNREGISTERED;
 }
 
-
 static void sched_preselect(struct sched *s)
 {
        struct task *t, *tmp;
        list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
-               if (t->error >= 0 && t->pre_select)
+               if (t->pre_select)
                        t->pre_select(s, t);
 //             PARA_INFO_LOG("%s \n", t->status);
                if (t->error >= 0)
@@ -207,10 +205,14 @@ void sched_shutdown(void)
 
        if (!initialized)
                return;
-       list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node)
+       list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
+               t->error = -E_SCHED_SHUTDOWN;
                unregister_task(t);
-       list_for_each_entry_safe(t, tmp, &post_select_list, post_select_node)
+       }
+       list_for_each_entry_safe(t, tmp, &post_select_list, post_select_node) {
+               t->error = -E_SCHED_SHUTDOWN;
                unregister_task(t);
+       }
        initialized = 0;
 }
 
@@ -219,8 +221,7 @@ void sched_shutdown(void)
  *
  * \return The task list.
  *
- * Each entry of the list contains an identifier which is simply a hex number
- * that may be used in \a kill_task() to terminate the task.
+ * Each entry of the list contains an identifier which is simply a hex number.
  * The result is dynamically allocated and must be freed by the caller.
  */
 char *get_task_list(void)
@@ -248,41 +249,6 @@ char *get_task_list(void)
        return msg;
 }
 
-/**
- * Simulate an error for the given task.
- *
- * \param id The task identifier.
- *
- * Find the task identified by \a id, set the tasks' error value to
- * \p -E_TASK_KILLED and unregister the task.
- *
- * \return Positive on success, negative on errors (e.g. if \a id does not
- * correspond to a registered task).
- */
-int kill_task(char *id)
-{
-       struct task *t, *tmp;
-       char buf[20];
-
-       if (!initialized)
-               return -E_NOT_INITIALIZED;
-       list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
-               sprintf(buf, "%p", t);
-               if (strcmp(id, buf))
-                       continue;
-               t->error = -E_TASK_KILLED;
-               return 1;
-       }
-       list_for_each_entry_safe(t, tmp, &post_select_list, post_select_node) {
-               sprintf(buf, "%p", t);
-               if (strcmp(id, buf))
-                       continue;
-               t->error = -E_TASK_KILLED;
-               return 1;
-       }
-       return -E_NO_SUCH_TASK;
-}
-
 /**
  * Set the select timeout to the minimal possible value.
  *
@@ -336,17 +302,19 @@ void sched_request_timeout_ms(long unsigned ms, struct sched *s)
  * \param barrier Absolute time before select() should return.
  * \param s Pointer to the scheduler struct.
  *
- * If \a barrier is in the past, this function does nothing.
+ * \return If \a barrier is in the past, this function does nothing and returns
+ * zero. Otherwise it returns one.
  *
  * \sa sched_request_barrier_or_min_delay().
  */
-void sched_request_barrier(struct timeval *barrier, struct sched *s)
+int sched_request_barrier(struct timeval *barrier, struct sched *s)
 {
        struct timeval diff;
 
        if (tv_diff(now, barrier, &diff) > 0)
-               return;
+               return 0;
        sched_request_timeout(&diff, s);
+       return 1;
 }
 
 /**
@@ -355,15 +323,19 @@ void sched_request_barrier(struct timeval *barrier, struct sched *s)
  * \param barrier Absolute time before select() should return.
  * \param s Pointer to the scheduler struct.
  *
- * If \a barrier is in the past, this function requests a minimal timeout.
+ * If \a barrier is in the past, this function requests a minimal timeout and
+ * returns zero. Otherwise it returns one.
  *
  * \sa sched_min_delay(), sched_request_barrier().
  */
-void sched_request_barrier_or_min_delay(struct timeval *barrier, struct sched *s)
+int sched_request_barrier_or_min_delay(struct timeval *barrier, struct sched *s)
 {
        struct timeval diff;
 
-       if (tv_diff(now, barrier, &diff) > 0)
-               return sched_min_delay(s);
+       if (tv_diff(now, barrier, &diff) > 0) {
+               sched_min_delay(s);
+               return 0;
+       }
        sched_request_timeout(&diff, s);
+       return 1;
 }