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-0dff7051ff02master
parent
3702e4aa5d
commit
3fa081f403
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue