kjartan@rhi.hi.is (Kjartan R. Gudmundsson) (10/28/88)
Keyboard input in MicroEmacs 3.9e on Unix system V is implemented
with busy wait.
In the file termio.c we have the functions "typahead()" and "ttgetc()" as
follows (the comments are mine):
ttgetc()
{
... some code for other operating systems left out ....
#if USG
if( kbdqp )
kbdqp = FALSE;
else
{
if( kbdpoll && fcntl( 0, F_SETFL, kbdflgs ) < 0 )
return FALSE;
kbdpoll = FALSE;
/*the next sentence might be OK on pc runing XINIX with 1 user
but when 10 users on a bigger UNIX machine are using MicroEmacs
this one sentence consumes a lot of the CPU: */
while (read(0, &kbdq, 1) != 1)
; /* !!!!!! ????*/
}
return ( kbdq & 127 ); /* americans don't like 8 bit characters*/
#endif
#if TYPEAH & (~ST520)
/* typahead: Check to see if any characters are already in the
keyboard buffer
*/
typahead()
{
#if USG
if( !kbdqp )
{
if( !kbdpoll && fcntl( 0, F_SETFL, kbdflgs | O_NDELAY ) < 0 )
return(FALSE);
kbdqp = (1 == read( 0, &kbdq, 1 ));
}
return ( kbdqp );
#endif
return(FALSE);
}
#endif
---------------------------------------------------------
/* improved code is: */
#if USG
if( kbdqp )
kbdqp = FALSE;
else
{ /* we desperatly seek a character so we turn off
the NO_DELAY flag and simply wait for the bastard*/
if( fcntl( 0, F_SETFL, kbdflgs & ~NO_DELAY ) < 0 )
return FALSE;
read(0, &kbdq, 1);
}
return ( kbdq & 0xFF ); /* 8 bit characters returned */
#endif
}
#if TYPEAH & (~ST520)
/* typahead: Check to see if any characters are already in the
keyboard buffer
*/
typahead()
{
#if USG
if( !kbdqp )
{ /* we want to check to see if a character is ready
if it is, we read the character and set the
character_ready flag otherwise the character_ready
flag is turned off*/
/* it would of course be possible to misuse this function
for ex. like this
while (!typahead())
;
but every tool can be misused.*/
if( fcntl( 0, F_SETFL, kbdflgs | O_NDELAY ) < 0 )
return(FALSE);
kbdqp = (1 == read( 0, &kbdq, 1 ));
}
return ( kbdqp );
#endif
return(FALSE);
}
#endif