([RunLoop -acceptInputForMode:beforeDate:]): If LIMIT_DATE is nil,

poll the inputs, but don't wait if there is nothing available
immediately.  Check to make sure that the LIMIT_DATE hasn't already
past; if it has, return immediately, before polling input sources.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@1220 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Andrew McCallum 1996-03-19 17:10:41 +00:00
parent 9874e6ab48
commit a737a8e65f

View file

@ -25,7 +25,6 @@
It is still in the early stages of development, and will most likely It is still in the early stages of development, and will most likely
evolve quite a bit more before the interface settles. evolve quite a bit more before the interface settles.
Distinguishing between different MODES is not currently implemented.
Handling NSTimers is implemented, but currently disabled. Handling NSTimers is implemented, but currently disabled.
Does it strike anyone else that NSNotificationCenter, Does it strike anyone else that NSNotificationCenter,
@ -239,7 +238,8 @@ static RunLoop *current_run_loop;
} }
/* Listen to input sources */ /* Listen to input sources.
If LIMIT_DATE is nil, then don't wait; i.e. call select() with 0 timeout */
- (void) acceptInputForMode: (id <String>)mode - (void) acceptInputForMode: (id <String>)mode
beforeDate: limit_date beforeDate: limit_date
@ -267,9 +267,17 @@ static RunLoop *current_run_loop;
#endif #endif
/* Find out how much time we should wait, and set SELECT_TIMEOUT. */ /* Find out how much time we should wait, and set SELECT_TIMEOUT. */
if (limit_date if (!limit_date)
&& ((ti = [limit_date timeIntervalSinceNow]) < LONG_MAX))
{ {
/* Don't wait at all. */
timeout.tv_sec = 0;
timeout.tv_usec = 0;
select_timeout = &timeout;
}
else if ((ti = [limit_date timeIntervalSinceNow]) < LONG_MAX
&& ti > 0.0)
{
/* Wait until the LIMIT_DATE. */
if (debug_run_loop) if (debug_run_loop)
printf ("\tRunLoop accept input before %f (seconds from now %f)\n", printf ("\tRunLoop accept input before %f (seconds from now %f)\n",
[limit_date timeIntervalSinceReferenceDate], ti); [limit_date timeIntervalSinceReferenceDate], ti);
@ -280,13 +288,19 @@ static RunLoop *current_run_loop;
printf ("\tRunLoop limit date past, returning\n"); printf ("\tRunLoop limit date past, returning\n");
return; return;
} }
timeout.tv_sec = ti; timeout.tv_sec = ti;
timeout.tv_usec = ti * 1000000.0; timeout.tv_usec = ti * 1000000.0;
select_timeout = &timeout; select_timeout = &timeout;
} }
else if (ti <= 0.0)
{
/* The LIMIT_DATE has already past; return immediately without
polling any inputs. */
return;
}
else else
{ {
/* Wait forever. */
if (debug_run_loop) if (debug_run_loop)
printf ("\tRunLoop accept input waiting forever\n"); printf ("\tRunLoop accept input waiting forever\n");
select_timeout = NULL; select_timeout = NULL;
@ -401,6 +415,10 @@ static RunLoop *current_run_loop;
[self acceptInputForMode: mode [self acceptInputForMode: mode
beforeDate: d]; beforeDate: d];
/* xxx Is this where we detect if the RunLoop is idle, and whether
we should dispatch the notifications from NotificationQueue's
idle queue? */
return YES; return YES;
} }