Index: ReadWrite.pm =================================================================== --- ReadWrite.pm (revision 2190) +++ ReadWrite.pm (working copy) @@ -238,7 +238,7 @@ } #------------------------------------------------------------------------------ -# Redefine the select-read handler. This uses stupid closure tricks +# Redefine the select-read handler. This uses clever closure tricks # to prevent keeping extra references to $self around. sub _define_read_state { @@ -275,13 +275,13 @@ my ($k, $me, $handle) = @_[KERNEL, SESSION, ARG0]; if (defined(my $raw_input = $driver->get($handle))) { $$input_filter->get_one_start($raw_input); + my @recs; while (1) { my $next_rec = $$input_filter->get_one(); last unless @$next_rec; - foreach my $cooked_input (@$next_rec) { - $k->call($me, $$event_input, $cooked_input, $unique_id); - } + push @recs, @$next_rec; } + $self->_cook_input($me, $$input_filter, $$event_input, $unique_id, \@recs); } else { $$event_error and $k->call( @@ -307,9 +307,7 @@ # The actual code starts here. my ($k, $me, $handle) = @_[KERNEL, SESSION, ARG0]; if (defined(my $raw_input = $driver->get($handle))) { - foreach my $cooked_input (@{$$input_filter->get($raw_input)}) { - $k->call($me, $$event_input, $cooked_input, $unique_id); - } + $self->_cook_input($me, $$input_filter, $$event_input, $unique_id, $$input_filter->get($raw_input)); } else { $$event_error and $k->call( @@ -320,16 +318,26 @@ } ); } - # register the state's select + # register the state's select $poe_kernel->select_read($self->[HANDLE_INPUT], $self->[STATE_READ]); } - # undefine the select, just in case + # undefine the select, just in case else { $poe_kernel->select_read($self->[HANDLE_INPUT]) } } #------------------------------------------------------------------------------ +# $self->_cook_input($me,$$event_input, $unique_id, \@recs); +sub _cook_input { + my ($self, $filter, $me, $event, $uid, $records) = @_; + foreach my $record ( $filter->get($raw_input) ){ + $k->call($me, $event, $record, $uid); + } +} + + +#------------------------------------------------------------------------------ # Redefine events. sub event { @@ -595,6 +603,7 @@ sub pause_input { my $self = shift; return unless defined $self->[HANDLE_INPUT]; + $self->[PAUSED_INPUT] = 1; $poe_kernel->select_pause_read( $self->[HANDLE_INPUT] ); } @@ -602,6 +611,7 @@ sub resume_input { my $self = shift; return unless defined $self->[HANDLE_INPUT]; + $self->[PAUSED_INPUT] = 0; $poe_kernel->select_resume_read( $self->[HANDLE_INPUT] ); }