use Sys::CpuAffinity; use Test::More tests => 6; use strict; use warnings; # version 0.90 had a bug for systems with 32-bit integers and 32 processors # (so that 1 << ncpu == 1) my $ncpus = Sys::CpuAffinity::getNumCpus(); if ($ncpus <= 1) { SKIP: { skip "can't test affinity on single cpu system", 6; } exit 0; } if ($^O =~ /darwin/i || $^O =~ /MacOS/i) { SKIP: { skip "test affinity on MacOS not supported", 6; } exit 0; } my $mask = getSimpleMask($ncpus); my $clear1 = getUnbindMask($ncpus); my $clear2 = -1; my $clear = $^O =~ /solaris|irix/i ? $clear2 : $clear1; if ($ncpus < 32) { no warnings 'redefine'; *Sys::CpuAffinity::getNumCpus = sub { return 32 }; diag "This system has $ncpus cpus. ", "Spoofing Sys::CpuAffinity::getNumCpus() to return 32\n"; } else { diag "This system actually has $ncpus cpus.\n"; } my $n = Sys::CpuAffinity::getNumCpus(); ok($n >= 32, "getNumCpus() returns $n>=32 (possibly after redefine)"); my $y0 = Sys::CpuAffinity::getAffinity($$) || 0; if ($^O =~ /solaris/i) { $y0 &= $clear1; } ok($y0 > 0 && $y0 <= $clear1, "got affinity $y0"); my $z1 = Sys::CpuAffinity::setAffinity($$, $mask); ok($z1 != 0, "set affinity ok on 32-cpu system $z1 != 0"); my $y1 = Sys::CpuAffinity::getAffinity($$) || 0; ok($y1 == $mask, "got affinity $y1 == $mask"); my $z2 = Sys::CpuAffinity::setAffinity($$, $clear); ok($z2 != 0, "clear affinity probably ok on 32-cpu system $z2 != 0"); my $y2 = Sys::CpuAffinity::getAffinity($$) || 0; if ($^O =~ /solaris/i) { $y2 &= $clear1; } ok($y2 == $clear1, "got affinity $y2 == $clear1"); sub getSimpleMask { my $n = shift; my $r = int(rand() * $n); return 1 << $r; } sub getUnbindMask { my $n = shift; return 2 ** $n - 1; }