Add buffering to StdinReader

This commit is contained in:
Pragmatic Software 2017-10-10 14:31:31 -07:00
parent 3464df6901
commit fda67f3739
1 changed files with 13 additions and 3 deletions

View File

@ -28,25 +28,29 @@ sub initialize {
$self->{pbot} = delete $conf{pbot} // Carp::croak("Missing pbot reference in SelectHandler"); $self->{pbot} = delete $conf{pbot} // Carp::croak("Missing pbot reference in SelectHandler");
$self->{select} = IO::Select->new(); $self->{select} = IO::Select->new();
$self->{readers} = {}; $self->{readers} = {};
$self->{buffers} = {};
} }
sub add_reader { sub add_reader {
my ($self, $handle, $sub) = @_; my ($self, $handle, $sub) = @_;
$self->{select}->add($handle); $self->{select}->add($handle);
$self->{readers}->{$handle} = $sub; $self->{readers}->{$handle} = $sub;
$self->{buffers}->{$handle} = "";
} }
sub remove_reader { sub remove_reader {
my ($self, $handle) = @_; my ($self, $handle) = @_;
$self->{select}->remove($handle); $self->{select}->remove($handle);
delete $self->{readers}->{$handle}; delete $self->{readers}->{$handle};
delete $self->{buffers}->{$handle};
} }
sub do_select { sub do_select {
my ($self) = @_; my ($self) = @_;
my $length = 8192;
my @ready = $self->{select}->can_read(0); my @ready = $self->{select}->can_read(0);
foreach my $fh (@ready) { foreach my $fh (@ready) {
my $ret = sysread($fh, my $buf, 8192); my $ret = sysread($fh, my $buf, $length);
if(not defined $ret) { if(not defined $ret) {
$self->{pbot}->{logger}->log("Error with $fh: $!\n"); $self->{pbot}->{logger}->log("Error with $fh: $!\n");
@ -55,16 +59,22 @@ sub do_select {
} }
if($ret == 0) { if($ret == 0) {
if (length $self->{buffers}->{$fh}) {
$self->{readers}->{$fh}->($self->{buffers}->{$fh});
}
$self->remove_reader($fh); $self->remove_reader($fh);
next; next;
} }
chomp $buf; $self->{buffers}->{$fh} .= $buf;
if(not exists $self->{readers}->{$fh}) { if(not exists $self->{readers}->{$fh}) {
$self->{pbot}->{logger}->log("Error: no reader for $fh\n"); $self->{pbot}->{logger}->log("Error: no reader for $fh\n");
} else { } else {
$self->{readers}->{$fh}->($buf); if ($ret < $length) {
$self->{readers}->{$fh}->($self->{buffers}->{$fh});
$self->{buffers}->{$fh} = "";
}
} }
} }
} }