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