Haineko

 view release on metacpan or  search on metacpan

lib/Haineko/Sendmail.pm  view on Meta::CPAN

        # |____/|_____|_| \_|____/|_|  |_/_/   \_\___|_____|
        #                                                   
        require Module::Load;

        my $maxworkers = scalar @$recipients;
        my $preforkset = undef;     # (Parallel::Prefork) object
        my $preforkarg = undef;     # (Ref->Hash) arguments for Parallel::Prefork
        my $preforkipc = [];        # (Ref->Array) IO::Pipe objects
        my $useprefork = 0;         # (Integer) use fork() or not
        my $procnumber = 0;         # (Integer) Job ID of each child process
        my $trappedsig = 0;         # (Integer) The number of received USR2 signal

        if( $maxworkers > 1 ) {
            # Adjust the number of max worker processes.
            my $xprocesses = $serverconf->{'max_workers'} // $defaultset->{'smtpd'}->{'max_workers'};

            if( Scalar::Util::looks_like_number $xprocesses ) {
                # Limit the value of max_workers to the value defined in 
                # etc/haineko.cf or Haineko::Default.
                $maxworkers = $xprocesses if $maxworkers > $xprocesses;

lib/Haineko/Sendmail.pm  view on Meta::CPAN

                    if( $procnumber < $maxworkers ) {
                        $preforkipc->[ $procnumber ] = IO::Pipe->new;;
                        $procnumber++;
                    }
                }
            };
            $preforkset = Parallel::Prefork->new( $preforkarg );

            $SIG{'USR2'} = sub {
                # Trap signal from each child process
                $trappedsig++;
                kill( 'TERM', $$ ) if $trappedsig >= $maxworkers;
            };
        }

        my $sendmailto = sub {
            # Code reference for sending an email to each recipient which called
            # from Parallel::Prefork->start().
            my $thisworker = undef;

            local $SIG{'TERM'} = 'IGNORE';



( run in 0.333 second using v1.01-cache-2.11-cpan-71847e10f99 )