X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.c;h=50e87b54e46d71162103776a7e499dd9435cfb1d;hp=7ee77027bc9c4cf6e26faed3533d37865c7cedbe;hb=74c88020bd325865fe26ed25ea8ad0ace0924136;hpb=f652ce6afe7f6fd0e42814505234cbf4321a736e diff --git a/sched.c b/sched.c index 7ee77027..50e87b54 100644 --- a/sched.c +++ b/sched.c @@ -8,7 +8,6 @@ #include #include -#include #include "para.h" #include "ipc.h" @@ -37,7 +36,7 @@ static void unregister_task(struct task *t) para_strerror(-t->error)); if (t->pre_select) list_del(&t->pre_select_node); - if (t->post_select) + if (t->new_post_select) list_del(&t->post_select_node); } @@ -50,20 +49,12 @@ static inline bool timeout_is_zero(struct sched *s) static void sched_preselect(struct sched *s) { struct task *t, *tmp; + list_for_each_entry_safe(t, tmp, &s->pre_select_list, pre_select_node) { - if (t->error < 0) { - unregister_task(t); - continue; - } - if (t->notification != 0) { + if (t->notification != 0) sched_min_delay(s); - break; - } - if (!t->pre_select) - continue; - t->pre_select(s, t); - if (timeout_is_zero(s)) - break; + if (t->pre_select) + t->pre_select(s, t); } } @@ -71,14 +62,14 @@ static void sched_preselect(struct sched *s) static inline void call_post_select(struct sched *s, struct task *t) { #ifndef SCHED_DEBUG - t->post_select(s, t); + t->error = t->new_post_select(s, t); #else struct timeval t1, t2, diff; unsigned long pst; - gettimeofday(&t1, NULL); - t->post_select(s, t); - gettimeofday(&t2, NULL); + clock_get_realtime(&t1); + t->error = t->new_post_select(s, t); + clock_get_realtime(&t2); tv_diff(&t1, &t2, &diff); pst = tv2ms(&diff); if (pst > 50) @@ -128,30 +119,23 @@ again: FD_ZERO(&s->wfds); s->select_timeout = s->default_timeout; s->max_fileno = -1; - gettimeofday(now, NULL); + clock_get_realtime(now); sched_preselect(s); - if (list_empty(&s->pre_select_list) && list_empty(&s->post_select_list)) - return 0; - if (!timeout_is_zero(s)) { - ret = s->select_function(s->max_fileno + 1, &s->rfds, &s->wfds, - &s->select_timeout); - if (ret < 0) - return ret; - if (ret == 0) { - /* - * APUE: Be careful not to check the descriptor sets on return - * unless the return value is greater than zero. The return - * state of the descriptor sets is implementation dependent if - * either a signal is caught or the timer expires. - */ - FD_ZERO(&s->rfds); - FD_ZERO(&s->wfds); - } - gettimeofday(now, NULL); - } else { + ret = s->select_function(s->max_fileno + 1, &s->rfds, &s->wfds, + &s->select_timeout); + if (ret < 0) + return ret; + if (ret == 0) { + /* + * APUE: Be careful not to check the descriptor sets on return + * unless the return value is greater than zero. The return + * state of the descriptor sets is implementation dependent if + * either a signal is caught or the timer expires. + */ FD_ZERO(&s->rfds); FD_ZERO(&s->wfds); } + clock_get_realtime(now); sched_post_select(s); if (list_empty(&s->pre_select_list) && list_empty(&s->post_select_list)) return 0; @@ -181,8 +165,8 @@ void register_task(struct sched *s, struct task *t) PARA_DEBUG_LOG("pre_select: %p\n", &t->pre_select); list_add_tail(&t->pre_select_node, &s->pre_select_list); } - if (t->post_select) { - PARA_DEBUG_LOG("post_select: %p\n", &t->post_select); + if (t->new_post_select) { + PARA_DEBUG_LOG("post_select: %p\n", &t->new_post_select); list_add_tail(&t->post_select_node, &s->post_select_list); } }