From 43d7a3200464561d83100a9152748b381e1ad44f Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 4 Mar 2012 23:24:19 -0600 Subject: use IO::Select instead of Select::Retry --- lib/Term/Filter.pm | 72 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/lib/Term/Filter.pm b/lib/Term/Filter.pm index d8be0fa..3769150 100644 --- a/lib/Term/Filter.pm +++ b/lib/Term/Filter.pm @@ -2,8 +2,8 @@ package Term::Filter; use Moose; use IO::Pty::Easy; +use IO::Select; use Scope::Guard; -use Select::Retry; use Term::ReadKey; has callbacks => ( @@ -70,6 +70,18 @@ sub _build_input_handles { [ $self->input, $self->pty ] } +has select => ( + is => 'ro', + isa => 'IO::Select', + lazy => 1, + builder => '_build_select', +); + +sub _build_select { + my $self = shift; + return IO::Select->new($self->input_handles); +} + has _raw_mode => ( is => 'rw', isa => 'Bool', @@ -93,36 +105,42 @@ sub run { my $guard = $self->_setup(@cmd); - while (1) { - my ($rout, $eout) = retry_select($self->input_handles); - - $self->_callback('read_error', $eout); + LOOP: while (1) { + my ($r, undef, $e) = IO::Select->select( + $self->select, undef, $self->select, + ); - if (vec($rout, fileno($self->input), 1)) { - my $got = $self->_read_from_handle($self->input, "STDIN"); - last unless defined $got; - - $got = $self->_callback('munge_input', $got) - if $self->_has_callback('munge_input'); - - # XXX should i select here, or buffer, to make sure this doesn't - # block? - syswrite $self->pty, $got; + for my $fh (@$e) { + $self->_callback('read_error', $fh); } - if (vec($rout, fileno($self->pty), 1)) { - my $got = $self->_read_from_handle($self->pty, "pty"); - last unless defined $got; - - $got = $self->_callback('munge_output', $got) - if $self->_has_callback('munge_output'); - - # XXX should i select here, or buffer, to make sure this doesn't - # block? - syswrite $self->output, $got; + for my $fh (@$r) { + if ($fh == $self->input) { + my $got = $self->_read_from_handle($self->input, "STDIN"); + last LOOP unless defined $got; + + $got = $self->_callback('munge_input', $got) + if $self->_has_callback('munge_input'); + + # XXX should i select here, or buffer, to make sure this + # doesn't block? + syswrite $self->pty, $got; + } + elsif ($fh == $self->pty) { + my $got = $self->_read_from_handle($self->pty, "pty"); + last LOOP unless defined $got; + + $got = $self->_callback('munge_output', $got) + if $self->_has_callback('munge_output'); + + # XXX should i select here, or buffer, to make sure this + # doesn't block? + syswrite $self->output, $got; + } + else { + $self->_callback('read', $fh); + } } - - $self->_callback('read', $rout); } } -- cgit v1.2.3