Linux-Sys-CPU-Affinity

 view release on metacpan or  search on metacpan

Affinity.xs  view on Meta::CPAN

OUTPUT:
    RETVAL


Linux_Sys_CPU_Affinity* cpu_or (cpusetA, cpusetB)
    Linux_Sys_CPU_Affinity *cpusetA
    Linux_Sys_CPU_Affinity *cpusetB
CODE:
    char* class_name = cpusetA->class_name;

    if (cpusetA->size != cpusetB->size)
        croak("The size of given cpusets are different");
    
    Linux_Sys_CPU_Affinity *new_cpuset = make_from_object(cpusetA, 1);

    CPU_OR_S(cpusetA->size, new_cpuset->set, cpusetA->set, cpusetB->set);
    RETVAL = new_cpuset;
OUTPUT:
    RETVAL


Linux_Sys_CPU_Affinity* cpu_xor (cpusetA, cpusetB)
    Linux_Sys_CPU_Affinity *cpusetA
    Linux_Sys_CPU_Affinity *cpusetB
CODE:
    char* class_name = cpusetA->class_name;

    if (cpusetA->size != cpusetB->size)
        croak("The size of given cpusets are different");
    
    Linux_Sys_CPU_Affinity *new_cpuset = make_from_object(cpusetA, 1);

    CPU_XOR_S(cpusetA->size, new_cpuset->set, cpusetA->set, cpusetB->set);
    RETVAL = new_cpuset;
OUTPUT:
    RETVAL


void cpu_zero(cpuset)
    Linux_Sys_CPU_Affinity *cpuset
CODE:
    init_set(cpuset, NULL);
    XSRETURN_EMPTY;


void reset(cpuset, sv = &PL_sv_undef)
    Linux_Sys_CPU_Affinity *cpuset
    SV *sv
PREINIT:
    AV* av = NULL;
CODE:
    if (SvOK(sv))
        av = _extract_and_validate_av(sv);
    init_set(cpuset, av);
    XSRETURN_EMPTY;


IV cpu_isset (cpuset, cpu)
    Linux_Sys_CPU_Affinity *cpuset
    UV cpu
PPCODE:
    int res = CPU_ISSET_S((uint32_t) cpu, cpuset->size, cpuset->set);
    mXPUSHu( res );
    XSRETURN(1);


void cpu_set (cpuset, cpu)
    Linux_Sys_CPU_Affinity *cpuset
    UV cpu
PPCODE:
    CPU_SET_S((uint32_t) cpu, cpuset->size, cpuset->set);
    XSRETURN_EMPTY;


void cpu_clr (cpuset, cpu)
    Linux_Sys_CPU_Affinity *cpuset
    UV cpu
PPCODE:
    CPU_CLR_S((uint32_t) cpu, cpuset->size, cpuset->set);
    XSRETURN_EMPTY;


UV cpu_count(cpuset)
    Linux_Sys_CPU_Affinity *cpuset
PPCODE:
    int cpu_count = CPU_COUNT_S(cpuset->size, cpuset->set);
    mXPUSHu( cpu_count ); // PUSHs(sv_2mortal(newSVuv(cpu_count)));
    XSRETURN(1);


IV cpu_equal (cpusetA, cpusetB)
    Linux_Sys_CPU_Affinity *cpusetA
    Linux_Sys_CPU_Affinity *cpusetB
PPCODE:
    int res = 0;
    if (cpusetA->size == cpusetB->size)
        res = CPU_EQUAL_S(cpusetA->size, cpusetA->set, cpusetB->set);
    mXPUSHu( res );
    XSRETURN(1);


AV* get_cpus(cpuset)
    Linux_Sys_CPU_Affinity *cpuset
CODE:
    RETVAL = get_cpus_from_cpuset(cpuset);
OUTPUT:
    RETVAL


AV* get_affinity(cpuset, pid)
    Linux_Sys_CPU_Affinity *cpuset
    UV pid
CODE:
    Linux_Sys_CPU_Affinity *new_cpuset = make_from_object(cpuset, 0);
    int res = sched_getaffinity((pid_t) pid, new_cpuset->size, new_cpuset->set);
    if (res == -1) {
        SV *error = get_sched_error_text(errno, 1);
        croak((char *) SvPV_nolen(error));
    }
    RETVAL = get_cpus_from_cpuset(new_cpuset);
    safefree(new_cpuset);
OUTPUT:
    RETVAL


IV set_affinity(cpuset, pid)
    Linux_Sys_CPU_Affinity *cpuset
    UV pid
PPCODE:
    int res = sched_setaffinity((pid_t) pid, cpuset->size, cpuset->set);
    if (res == -1) {
        SV *error = get_sched_error_text(errno, 0);
        croak((char *) SvPV_nolen(error));
    }
    mXPUSHi( res );
    XSRETURN(1);


void DESTROY (cpuset)
PPCODE:
    Linux_Sys_CPU_Affinity *self = (Linux_Sys_CPU_Affinity *) SvUV(SvRV(ST(0)));
    if (PL_dirty)
        return;
    CPU_FREE(self->set);
    safefree(self);
    XSRETURN_EMPTY;


IV get_nprocs ()
PPCODE:
    int nprocs = get_available_nprocs();
    mXPUSHi( nprocs );
    XSRETURN(1);



( run in 0.464 second using v1.01-cache-2.11-cpan-5511b514fd6 )