X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sched.c;h=0585162142be5238a7fa463a64f05fa192a6713d;hp=ae82b23338284d9278c1fffd90c93460b65bd6da;hb=01f8023b7fe59abc29072c7b84caec5961f8f14b;hpb=ff12b505b227585daf5aecc822d6b2e8841c2be7 diff --git a/sched.c b/sched.c index ae82b233..05851621 100644 --- a/sched.c +++ b/sched.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2012 Andre Noll + * Copyright (C) 2006-2013 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -50,20 +50,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); } } @@ -130,28 +122,21 @@ again: s->max_fileno = -1; gettimeofday(now, NULL); 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); } + gettimeofday(now, NULL); sched_post_select(s); if (list_empty(&s->pre_select_list) && list_empty(&s->post_select_list)) return 0;