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 )