Si un thread est en attente sur la terminaison d'un processus Unix,

toujours limiter a au plus Thread_timeout le delai du select().


git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@866 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 1996-06-10 09:15:58 +00:00
parent 3702e4aa5d
commit 3fa081f403
1 changed files with 8 additions and 9 deletions

View File

@ -273,9 +273,10 @@ try_again:
need_select = 1; need_select = 1;
} }
if (th->status & (BLOCKED_DELAY - 1)) { if (th->status & (BLOCKED_DELAY - 1)) {
double th_delay = Double_val(th->delay); double th_delay;
if (now < 0.0) now = timeofday(); if (now < 0.0) now = timeofday();
if (th_delay < now) { th_delay = Double_val(th->delay) - now;
if (th_delay <= 0) {
th->status = RUNNABLE; th->status = RUNNABLE;
Assign(th->delay, NO_DELAY); Assign(th->delay, NO_DELAY);
th->retval = RESUMED_DELAY; th->retval = RESUMED_DELAY;
@ -313,25 +314,23 @@ try_again:
if (need_select || run_thread == NULL) { if (need_select || run_thread == NULL) {
struct timeval delay_tv, * delay_ptr; struct timeval delay_tv, * delay_ptr;
int retcode; int retcode;
/* If a thread is blocked on wait, don't block forever */
if (need_wait && delay > Thread_timeout * 1e-6) {
delay = Thread_timeout * 1e-6;
}
/* Convert delay to a timeval */ /* Convert delay to a timeval */
/* If a thread is runnable, just poll */ /* If a thread is runnable, just poll */
/* If a thread is blocked on wait, don't block forever */
if (run_thread != NULL) { if (run_thread != NULL) {
delay_tv.tv_sec = 0; delay_tv.tv_sec = 0;
delay_tv.tv_usec = 0; delay_tv.tv_usec = 0;
delay_ptr = &delay_tv; delay_ptr = &delay_tv;
} }
else if (delay != DELAY_INFTY) { else if (delay != DELAY_INFTY) {
delay = delay - now;
delay_tv.tv_sec = (unsigned int) delay; delay_tv.tv_sec = (unsigned int) delay;
delay_tv.tv_usec = (delay - (double) delay_tv.tv_sec) * 1E6; delay_tv.tv_usec = (delay - (double) delay_tv.tv_sec) * 1E6;
delay_ptr = &delay_tv; delay_ptr = &delay_tv;
} }
else if (need_wait) { else {
delay_tv.tv_sec = 0;
delay_tv.tv_usec = Thread_timeout;
delay_ptr = &delay_tv;
} else {
delay_ptr = NULL; delay_ptr = NULL;
} }
retcode = select(FD_SETSIZE, &readfds, &writefds, NULL, delay_ptr); retcode = select(FD_SETSIZE, &readfds, &writefds, NULL, delay_ptr);