Skip to content
Snippets Groups Projects
Commit e3b7e335 authored by Simon Marlow's avatar Simon Marlow Committed by Ian Lynagh
Browse files

Fix bug causing polling instead of blocking in the non-threaded RTS (#5773)

This was a regression introduced accidentally in
6b109851.  We were previously passing
a large time value to select() to simulate blocking, and this broke
due to a change from unsigned to signed arithmetic.  I've refactored
it to be less fragile now - we just pass NULL as the timeval parameter
to select(), which is the correct way to do blocking.
parent c0037d25
No related merge requests found
......@@ -118,13 +118,9 @@ awaitEvent(rtsBool wait)
int maxfd = -1;
rtsBool select_succeeded = rtsTrue;
rtsBool unblock_all = rtsFalse;
struct timeval tv;
Time min;
struct timeval tv, *ptv;
LowResTime now;
tv.tv_sec = 0;
tv.tv_usec = 0;
IF_DEBUG(scheduler,
debugBelch("scheduler: checking for threads blocked on I/O");
if (wait) {
......@@ -145,15 +141,7 @@ awaitEvent(rtsBool wait)
return;
}
if (!wait) {
min = 0;
} else if (sleeping_queue != END_TSO_QUEUE) {
min = LowResTimeToTime(sleeping_queue->block_info.target - now);
} else {
min = (Time)-1;
}
/*
/*
* Collect all of the fd's that we're interested in
*/
FD_ZERO(&rfd);
......@@ -194,12 +182,23 @@ awaitEvent(rtsBool wait)
}
}
if (wait) {
ptv = NULL;
} else if (sleeping_queue != END_TSO_QUEUE) {
Time min = LowResTimeToTime(sleeping_queue->block_info.target - now);
tv.tv_sec = TimeToSeconds(min);
tv.tv_usec = TimeToUS(min) % 1000000;
ptv = &tv;
} else {
// just poll
tv.tv_sec = 0;
tv.tv_usec = 0;
ptv = &tv;
}
/* Check for any interesting events */
tv.tv_sec = TimeToSeconds(min);
tv.tv_usec = TimeToUS(min) % 1000000;
while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, &tv)) < 0) {
while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, ptv)) < 0) {
if (errno != EINTR) {
/* Handle bad file descriptors by unblocking all the
waiting threads. Why? Because a thread might have been
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment