Forks-Super

 view release on metacpan or  search on metacpan

t/66b-daemon.t  view on Meta::CPAN

    if ($base_priority == 19 && $new_priority == 19) {
	# why did it take until 0.70 for this issue to show up?
	skip "can't lower priority (19) of daemon process any more", 1;
    }

    # on FreeBSD lowest priority is 20 ?
    if ($^O =~ /bsd/i && $base_priority == 20 && $new_priority == 20) {
	skip "can't lower priority (20) of daemon process any more", 1;
    }

    ok($new_priority == $base_priority + 1,		        ### 1 ###
       "set os priority on daemon process")
	or diag("failed to update priority $base_priority => $new_priority");
}

SKIP: {
    if ($np <= 1) {
	skip "one processor, can't test set CPU affinity", 1;
    }
    if (!Forks::Super::Config::CONFIG('Sys::CpuAffinity')) {
	skip 'Sys::CpuAffinity not avail. Skip CPU affinity test', 1;
    }
    if (${^TAINT} > 0) {
        skip 'Sys::CpuAffinity might not be avail in taint mode.', 1;
    }
    ok($affinity == 2, "set CPU affinity on daemon process")    ### 2 ###
	or diag("affinity of $daemon was $affinity, expected 2; ",
	        "Sys::CpuAffinity v. $Sys::CpuAffinity::VERSION");
}
$daemon->kill('KILL');


my $t = Time::HiRes::time();
my $d1 = fork sub { sleep 5 }, {
    daemon => 1,
    delay => 3
};
ok($d1->{state} eq 'DEFERRED', 'daemon job was delayed');	### 3 ###
for (1..5) {
    Forks::Super::pause(1) while $d1->{state} eq 'DEFERRED';
}
ok($d1->{state} ne 'DEFERRED', 'daemon job was started');	### 4 ###
ok(!Forks::Super::Util::isValidPid($d1->{pid}),"pid is for deferred job");
ok(Forks::Super::Util::isValidPid($d1->{real_pid}),"real pid is valid");

my $n1 = fork sub {
        print time-$^T," DAEMON 1 MONITOR START\n";
	sleep 1 while CORE::kill 0, $d1->{real_pid};
        print time-$^T," DAEMON 1 MONITOR COMPLETE\n";
    },
    daemon => 0,
    name => 'daemon1 monitor';

sleep 1;

my $d2 = fork {
    daemon => 1,
    name => 'daemon2',
    depend_on => 'daemon1 monitor',
    sub => sub { sleep 1 },
    on_busy => 'queue',
    debug => 0,
};

ok($d2->{state} eq 'DEFERRED', '2nd daemon is deferred');	### 7 ###
Forks::Super::Util::pause(6);

ok($d1 && $d2, "daemon procs launched") or diag("d1=$d1, d2=$d2");
ok($d1->{start} > $t + 2, "daemon1 launch was delayed");
ok($d2->{start} >= ($n1->{end} || 0),                          ### 10 ###
   "daemon2 launch waited for daemon1")
    or diag("expected d2 start $d2->{start} >= $n1->{end} d1 monitor end");


#############################################################################

sub get_os_priority {
    my ($pid) = @_;

    # freebsd: on error, getpriority returns -1 and sets $!

    my $p;
    local $! = 0;
    eval {
	$p = getpriority(0, $pid);
    };
    if ($@ eq '') {
	if ($p == -1 && $!) {
	    carp "get_os_priority($pid): $!";
	    return -99;
	}
	return $p;
    }

    if ($^O eq 'MSWin32') {
	return Forks::Super::Job::OS::Win32::get_priority($pid);
    }
    return;
}



( run in 0.578 second using v1.01-cache-2.11-cpan-ceb78f64989 )