Use Select in examples

This commit is contained in:
Keegan McAllister
2012-04-30 23:32:13 -04:00
committed by Keith Winstein
parent 2112a3865c
commit 043f9af260
4 changed files with 40 additions and 56 deletions
+17 -24
View File
@@ -23,7 +23,6 @@
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <sys/poll.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
@@ -51,6 +50,7 @@
#include "fatal_assert.h"
#include "locale_utils.h"
#include "sigfd.h"
#include "select.h"
/* For newer skalibs */
extern "C" {
@@ -190,7 +190,7 @@ bool tick( Terminal::Framebuffer &state, Terminal::Framebuffer &new_frame,
3. Resize events (from a SIGWINCH signal) get turned into
"Resize" actions and applied to the terminal.
At every event from poll(), we run the tick() function to
At every event from select(), we run the tick() function to
possibly print a new frame (if we haven't printed one in the
last 1/50 second). The new frames are "differential" -- they
assume the previous frame was sent to the real terminal.
@@ -227,36 +227,30 @@ void emulate_terminal( int fd )
/* open display */
Terminal::Display display( true ); /* use TERM to initialize */
struct pollfd pollfds[ 3 ];
pollfds[ 0 ].fd = STDIN_FILENO;
pollfds[ 0 ].events = POLLIN;
pollfds[ 1 ].fd = fd;
pollfds[ 1 ].events = POLLIN;
pollfds[ 2 ].fd = signal_fd;
pollfds[ 2 ].events = POLLIN;
Select sel;
sel.add_fd( STDIN_FILENO );
sel.add_fd( fd );
sel.add_fd( signal_fd );
swrite( STDOUT_FILENO, Terminal::Emulator::open().c_str() );
int poll_timeout = -1;
int timeout = -1;
while ( 1 ) {
int active_fds = poll( pollfds, 3, poll_timeout );
int active_fds = sel.select( timeout );
if ( active_fds < 0 && errno == EINTR ) {
continue;
} else if ( active_fds < 0 ) {
perror( "poll" );
perror( "select" );
break;
}
if ( pollfds[ 0 ].revents & POLLIN ) {
if ( sel.read( STDIN_FILENO ) ) {
/* input from user */
char buf[ buf_size ];
/* fill buffer if possible */
ssize_t bytes_read = read( pollfds[ 0 ].fd, buf, buf_size );
ssize_t bytes_read = read( STDIN_FILENO, buf, buf_size );
if ( bytes_read == 0 ) { /* EOF */
return;
} else if ( bytes_read < 0 ) {
@@ -274,12 +268,12 @@ void emulate_terminal( int fd )
if ( swrite( fd, terminal_to_host.c_str(), terminal_to_host.length() ) < 0 ) {
break;
}
} else if ( pollfds[ 1 ].revents & POLLIN ) {
} else if ( sel.read( fd ) ) {
/* input from host */
char buf[ buf_size ];
/* fill buffer if possible */
ssize_t bytes_read = read( pollfds[ 1 ].fd, buf, buf_size );
ssize_t bytes_read = read( fd, buf, buf_size );
if ( bytes_read == 0 ) { /* EOF */
return;
} else if ( bytes_read < 0 ) {
@@ -291,7 +285,7 @@ void emulate_terminal( int fd )
if ( swrite( fd, terminal_to_host.c_str(), terminal_to_host.length() ) < 0 ) {
break;
}
} else if ( pollfds[ 2 ].revents & POLLIN ) {
} else if ( sel.read( signal_fd ) ) {
/* resize */
fatal_assert( sigfd_read() == SIGWINCH );
@@ -310,17 +304,16 @@ void emulate_terminal( int fd )
perror( "ioctl TIOCSWINSZ" );
return;
}
} else if ( (pollfds[ 0 ].revents | pollfds[ 1 ].revents)
& (POLLERR | POLLHUP | POLLNVAL) ) {
} else if ( sel.error( STDIN_FILENO ) || sel.error( fd ) ) {
break;
}
Terminal::Framebuffer new_frame( complete.get_fb() );
if ( tick( state, new_frame, display ) ) { /* there was a frame */
poll_timeout = -1;
timeout = -1;
} else {
poll_timeout = 20;
timeout = 20;
}
}