App-MHFS

 view release on metacpan or  search on metacpan

lib/MHFS/Process.pm  view on Meta::CPAN

package MHFS::Process v0.7.0;
use 5.014;
use strict; use warnings;
use feature 'say';
use Symbol 'gensym';
use Time::HiRes qw( usleep clock_gettime CLOCK_REALTIME CLOCK_MONOTONIC);
use POSIX ":sys_wait_h";
use IO::Socket::INET;
use IO::Poll qw(POLLIN POLLOUT POLLHUP);
use Errno qw(EINTR EIO :POSIX);
use Fcntl qw(:seek :mode);
use File::stat;
use IPC::Open3;
use Scalar::Util qw(looks_like_number weaken);
use Data::Dumper;
use Devel::Peek;
use MHFS::FD::Reader;
use MHFS::FD::Writer;
use MHFS::EventLoop::Poll;
use Carp;

#my %CHILDREN;
#$SIG{CHLD} = sub {
#    while((my $child = waitpid(-1, WNOHANG)) > 0) {
#        my ($wstatus, $exitcode) = ($?, $?>> 8);
#        if(defined $CHILDREN{$child}) {
#            say "PID $child reaped (func) $exitcode";
#            $CHILDREN{$child}->($exitcode);
#            # remove file handles here?
#            $CHILDREN{$child} = undef;
#        }
#        else {
#            say "PID $child reaped (No func) $exitcode";
#        }
#    }
#};

sub _setup_handlers {
    my ($self, $in, $out, $err, $fddispatch, $handlesettings) = @_;
    my $pid = $self->{'pid'};
    my $evp = $self->{'evp'};

    if($fddispatch->{'SIGCHLD'}) {
        say "PID $pid custom SIGCHLD handler";
        #$CHILDREN{$pid} = $fddispatch->{'SIGCHLD'};
        $evp->register_child($pid, $fddispatch->{'SIGCHLD'});
    }
    if($fddispatch->{'STDIN'}) {
        $self->{'fd'}{'stdin'} = MHFS::FD::Writer->new($self, $in, $fddispatch->{'STDIN'});
        $evp->set($in, $self->{'fd'}{'stdin'}, POLLOUT | MHFS::EventLoop::Poll->ALWAYSMASK);
    }
    else {
        $self->{'fd'}{'stdin'}{'fd'} = $in;
    }
    if($fddispatch->{'STDOUT'}) {
        $self->{'fd'}{'stdout'} = MHFS::FD::Reader->new($self, $out, $fddispatch->{'STDOUT'});
        $evp->set($out, $self->{'fd'}{'stdout'}, POLLIN | MHFS::EventLoop::Poll->ALWAYSMASK());
    }
    else {
        $self->{'fd'}{'stdout'}{'fd'} = $out;
    }
    if($fddispatch->{'STDERR'}) {
        $self->{'fd'}{'stderr'} = MHFS::FD::Reader->new($self, $err, $fddispatch->{'STDERR'});
        $evp->set($err, $self->{'fd'}{'stderr'}, POLLIN | MHFS::EventLoop::Poll->ALWAYSMASK);
    }
    else {
        $self->{'fd'}{'stderr'}{'fd'} = $err;
    }

    if($handlesettings->{'O_NONBLOCK'}) {
        # stderr
        {
            my $flags =  fcntl($err, Fcntl::F_GETFL, 0) or die "$!";
            fcntl($err, Fcntl::F_SETFL, $flags | Fcntl::O_NONBLOCK) or die "$!";



( run in 0.699 second using v1.01-cache-2.11-cpan-39bf76dae61 )