int hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { nodeset = hwloc_fix_membind(topology, nodeset); if (!nodeset) return -1; if (flags & HWLOC_MEMBIND_PROCESS) { if (topology->binding_hooks.set_thisproc_membind) return topology->binding_hooks.set_thisproc_membind(topology, nodeset, policy, flags); } else if (flags & HWLOC_MEMBIND_THREAD) { if (topology->binding_hooks.set_thisthread_membind) return topology->binding_hooks.set_thisthread_membind(topology, nodeset, policy, flags); } else { if (topology->binding_hooks.set_thisproc_membind) { int err = topology->binding_hooks.set_thisproc_membind(topology, nodeset, policy, flags); if (err >= 0 || errno != ENOSYS) return err; /* ENOSYS, fallback */ } if (topology->binding_hooks.set_thisthread_membind) return topology->binding_hooks.set_thisthread_membind(topology, nodeset, policy, flags); } errno = ENOSYS; return -1; }
int hwloc_set_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { nodeset = hwloc_fix_membind(topology, nodeset); if (!nodeset) return -1; if (topology->binding_hooks.set_area_membind) return topology->binding_hooks.set_area_membind(topology, addr, len, nodeset, policy, flags); errno = ENOSYS; return -1; }
int hwloc_set_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { nodeset = hwloc_fix_membind(topology, nodeset); if (!nodeset) return -1; if (topology->binding_hooks.set_proc_membind) return topology->binding_hooks.set_proc_membind(topology, pid, nodeset, policy, flags); errno = ENOSYS; return -1; }
int hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { nodeset = hwloc_fix_membind(topology, nodeset); if (!nodeset) return -1; if (flags & HWLOC_MEMBIND_PROCESS) { if (topology->set_thisproc_membind) return topology->set_thisproc_membind(topology, nodeset, policy, flags); } else if (flags & HWLOC_MEMBIND_THREAD) { if (topology->set_thisthread_membind) return topology->set_thisthread_membind(topology, nodeset, policy, flags); } else { if (topology->set_thisproc_membind) return topology->set_thisproc_membind(topology, nodeset, policy, flags); else if (topology->set_thisthread_membind) return topology->set_thisthread_membind(topology, nodeset, policy, flags); } errno = ENOSYS; return -1; }
void * hwloc_alloc_membind_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { void *p; nodeset = hwloc_fix_membind(topology, nodeset); if (!nodeset) goto fallback; if (flags & HWLOC_MEMBIND_MIGRATE) { errno = EINVAL; goto fallback; } if (topology->binding_hooks.alloc_membind) return topology->binding_hooks.alloc_membind(topology, len, nodeset, policy, flags); else if (topology->binding_hooks.set_area_membind) { p = hwloc_alloc(topology, len); if (!p) return NULL; if (topology->binding_hooks.set_area_membind(topology, p, len, nodeset, policy, flags) && flags & HWLOC_MEMBIND_STRICT) { int error = errno; free(p); errno = error; return NULL; } return p; } else { errno = ENOSYS; } fallback: if (flags & HWLOC_MEMBIND_STRICT) /* Report error */ return NULL; /* Never mind, allocate anyway */ return hwloc_alloc(topology, len); }