if ($n <= $want) {
PublicInbox::DS::block_signals() if !$sigfd;
for my $i ($n..$want) {
+ my $seed = rand(0xffffffff);
my $pid = fork;
if (!defined $pid) {
warn "failed to fork worker[$i]: $!\n";
} elsif ($pid == 0) {
+ srand($seed);
+ eval { Net::SSLeay::randomize() };
$set_user->() if $set_user;
return $p0; # run normal work code
} else {
pipe(my ($r_res, $w_res)) or die "pipe: $!";
my $sigset = $oldset // PublicInbox::DS::block_signals();
$self->ipc_atfork_prepare;
- defined(my $pid = fork) or die "fork: $!";
+ my $seed = rand(0xffffffff);
+ my $pid = fork // die "fork: $!";
if ($pid == 0) {
+ srand($seed);
eval { PublicInbox::DS->Reset };
delete @$self{qw(-wq_s1 -wq_workers -wq_ppid)};
$w_req = $r_res = undef;
sub _wq_worker_start ($$) {
my ($self, $oldset) = @_;
+ my $seed = rand(0xffffffff);
my $pid = fork // die "fork: $!";
if ($pid == 0) {
+ srand($seed);
eval { PublicInbox::DS->Reset };
delete @$self{qw(-wq_s1 -wq_workers -wq_ppid)};
$SIG{$_} = 'IGNORE' for (qw(PIPE TTOU TTIN));
my ($self, $url_intvl) = @_;
my ($url, $intvl) = @$url_intvl;
pipe(my ($r, $w)) or die "pipe: $!";
+ my $seed = rand(0xffffffff);
defined(my $pid = fork) or die "fork: $!";
if ($pid == 0) {
+ srand($seed);
+ eval { Net::SSLeay::randomize() };
close $r;
watch_atfork_child($self);
watch_imap_idle_1($self, $url, $intvl);
return if $self->{quit};
pipe(my ($r, $w)) or die "pipe: $!";
my $oldset = watch_atfork_parent($self);
+ my $seed = rand(0xffffffff);
my $pid = fork;
if (defined($pid) && $pid == 0) {
+ srand($seed);
+ eval { Net::SSLeay::randomize() };
close $r;
watch_atfork_child($self);
if ($urls->[0] =~ m!\Aimaps?://!i) {
sub cb_spawn {
my ($cb, $args, $opt) = @_; # $cb = cpdb() or compact()
- defined(my $pid = fork) or die "fork: $!";
+ my $seed = rand(0xffffffff);
+ my $pid = fork // die "fork: $!";
return $pid if $pid > 0;
+ srand($seed);
$cb->($args, $opt);
POSIX::_exit(0);
}