BSD-Process-Affinity
view release on metacpan or search on metacpan
Affinity.xs view on Meta::CPAN
if (cpuset_setid(CPU_WHICH_PID, target, info->setid) != 0){
PANIC("Can't set thread's cpuset");
}
void
update(obj)
SV* obj
CODE:
struct cpusetinfo* info = (struct cpusetinfo*)SvIV(SvRV(obj));
int result;
if (info->setid != 0){
result = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_CPUSET, info->setid, sizeof(info->mask), &(info->mask));
}else{
result = cpuset_setaffinity(CPU_LEVEL_WHICH, info->which, info->id, sizeof(info->mask), &(info->mask));
}
if (result != 0){
PANIC("Can't set affinity mask");
}
int
get_cpusetid(obj)
SV* obj
CODE:
struct cpusetinfo* info = (struct cpusetinfo*)SvIV(SvRV(obj));
RETVAL = info->setid;
OUTPUT:
RETVAL
SV*
get(obj)
SV* obj
CODE:
dSP;
struct cpusetinfo* info = (struct cpusetinfo*)SvIV(SvRV(obj));
UV result = 0;
int i;
for(i = 0; i < CPU_SETSIZE; i++){
if (CPU_ISSET(i, &(info->mask))){
if (i > sizeof(UV) * 8){
croak("Can't convert mask to number - too many bits set, got %d already set, but unsigned can hold only %d", i, sizeof(UV) * 8);
}
result |= ((UV)1 << i);
}
}
RETVAL = newSVuv(result);
OUTPUT:
RETVAL
void
set(obj, num)
SV* obj
SV* num
ALIAS:
from_num = 1
PPCODE:
struct cpusetinfo* info = (struct cpusetinfo*)SvIV(SvRV(obj));
CPU_ZERO(&(info->mask));
UV input = SvUV(num);
if (input > 0){
int i;
for(i = 0; i < sizeof(UV) * 8; i++){
if (input & ((UV)1 << i)){
if (i > CPU_SETSIZE){
croak("Can't convert number to mask - too many bits set, expecting at most %d set, but already got %d", CPU_SETSIZE, i);
}
CPU_SET(i, &(info->mask));
}
}
}
XSRETURN(1);
( run in 1.550 second using v1.01-cache-2.11-cpan-71847e10f99 )