ken@gvax.cs.cornell.edu (Ken Birman) (12/02/89)
I tracked down and fixed the bug that caused isis_accept_events(ISIS_BLOCK) to block indefinitely, even if an event occurs. Patches to clib/cl_isis.c: LINE CONTENTS (OLD, NEW) old 596 int set_scheduler = 0, ran = 0; new 596 int set_scheduler = 0, ran = 0, sync_count = 0; new 607 if(t_waiting(&accept_events)) new 608 ++sync_count; old 711: if(ran == 0 && async_accept_count) old 712: t_sig_all(&accept_events, 0); new 713: if((ran == 0 && async_accept_count) || (ran && sync_count)) new 714: t_sig_all(&accept_events, 0);
ken@gvax.cs.cornell.edu (Ken Birman) (07/21/90)
X11 users have reported the following annoyance with ISIS. To
write an X mainloop that deals with ISIS you want to do something
like this:
forever
{
XFlushInput();
isis_accept_events(0);
}
This is because X doesn't have a routine that will know how long ISIS
wants to delay (ISIS has timers) and doesn't know that it should
watch for input on the ISIS input channels. Likewise, ISIS doesn't
know about X. This loop is an infinite one, though, since both ISIS
and X are being used asynchronously.
Now, since telling X about the ISIS input channels won't deal with the
issue of ISIS timers, if we want something to block here, it should
probably be ISIS. But,
isis_accept_events(ISIS_BLOCK);
would mean that ISIS won't notice button input events. This
motivates a new mechanism
isis_accept_events(ISIS_TIMEOUT, struct timeval *tp);
which tells ISIS to BLOCK for at most the specified amount of time,
as in a call to select(). This mechanism will be in V2.1
With this loop, ISIS might fail to notice a mouse input but never for
longer than the timeout specified in the timeval.
forever
{
XFlushInput();
isis_accept_events(ISIS_TIMEOUT, struct timeval *tp);
}
-- Ken
PS: You may be wondering why we don't use isis_input to call XFlushInput
when an X11 input channel has input data on it.
Really sophisticated X11 users are probably (painfully) aware that X
sometimes reads ahead on its input channels and stuffs the resulting
data into a "re-read" queue. This means that even though ISIS could
be told to watch for IO available on the X input channels, there
would be situations where ISIS might block incorrectly instead of calling
calling XFlushINput, because ISIS would not know how to check one of
X "pseudo" input channels. There is a way to deal with this (see
isis_pseudo_io()) but the loop given above is probably easier to understand.