mirror of
https://github.com/pragma-/pbot.git
synced 2025-02-09 02:54:23 +01:00
Add buffering to StdinReader
This commit is contained in:
parent
3464df6901
commit
fda67f3739
@ -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} = "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user