@@ -167,10 +167,11 @@ sub _start {
167
167
elsif ($pid ) { # parent ===================================================
168
168
warn " [$pid ] Child starting ($args ->{program} @{$args ->{program_args}})\n " if DEBUG;
169
169
$self -> {pid } = $pid ;
170
- $self -> {stdin_write } = $stdin_write ;
171
170
$self -> {stdout_read } = $stdout_read ;
172
171
$stdout_read -> close_slave if defined $stdout_read and UNIVERSAL::isa($stdout_read , ' IO::Pty' );
173
172
173
+ $self -> _stdin($stdin_write );
174
+
174
175
Scalar::Util::weaken($self );
175
176
$self -> reactor-> io($stdout_read => sub {
176
177
$self -> {stop } and return ;
@@ -254,19 +255,33 @@ sub _setup_recurring_child_alive_check {
254
255
255
256
=head2 write
256
257
257
- $self->write($buffer);
258
+ $self = $self->write($chunk);
259
+ $self = $self->write($chunk, $cb);
260
+
261
+ Used to write data to the child process STDIN. An optional callback will be
262
+ called once STDIN is drained.
258
263
259
- Used to write data to the child process.
264
+ Example:
265
+
266
+ $self->write("some data\n", sub {
267
+ my ($self) = @_;
268
+ $self->close_gracefully;
269
+ });
260
270
261
271
=cut
262
272
263
273
sub write {
264
- my ($self , $buffer ) = @_ ;
274
+ my $self = shift ;
275
+
276
+ if ($self -> {stdin }) {
277
+ $self -> {stdin }-> write (@_ );
278
+ warn " [${ \$ self->pid }] Wrote buffer (" .url_escape($_ [0]) ." )\n " if DEBUG;
279
+ }
280
+ else {
281
+ push @{ $self -> {stdin_buffer } }, [@_ ];
282
+ }
265
283
266
- $self -> {stdin_write } or return ;
267
- print { $self -> {stdin_write } } $buffer ;
268
- $self -> {stdin_write }-> flush or die " Write buffer (" .url_escape($buffer ) ." ) failed: $! " ;
269
- warn " [${ \$ self->pid }] Wrote buffer (" .url_escape($buffer ) ." )\n " if DEBUG;
284
+ $self ;
270
285
}
271
286
272
287
=head2 kill
@@ -295,7 +310,8 @@ sub _cleanup {
295
310
$reactor -> watch($self -> {stdout_read }, 0, 0) if $self -> {stdout_read };
296
311
$reactor -> remove(delete $self -> {stdout_read }) if $self -> {stdout_read };
297
312
$reactor -> remove(delete $self -> {delay }) if $self -> {delay };
298
- $reactor -> remove(delete $self -> {stdin_write }) if $self -> {stdin_write };
313
+ $reactor -> remove(delete $self -> {delay }) if $self -> {delay };
314
+ $self -> {stdin }-> close if $self -> {stdin };
299
315
}
300
316
301
317
sub _read {
@@ -311,6 +327,19 @@ sub _read {
311
327
$self -> emit_safe(read => $buffer );
312
328
}
313
329
330
+ sub _stdin {
331
+ my ($self , $handle ) = @_ ;
332
+ my $stream = Mojo::IOLoop::Stream-> new($handle );
333
+
334
+ Scalar::Util::weaken($self );
335
+ $stream -> reactor($self -> reactor);
336
+ $stream -> timeout(0);
337
+ $stream -> start;
338
+
339
+ $self -> {stdin } = $stream ;
340
+ $self -> write (@$_ ) for @{ delete $self -> {stdin_buffer } || [] };
341
+ }
342
+
314
343
sub DESTROY { shift -> _cleanup }
315
344
316
345
=head1 AUTHOR
0 commit comments