static void * hwloc_win_alloc_membind(hwloc_topology_t topology __hwloc_attribute_unused, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { int node; switch (policy) { case HWLOC_MEMBIND_DEFAULT: case HWLOC_MEMBIND_BIND: break; default: errno = ENOSYS; return hwloc_alloc_or_fail(topology, len, flags); } if (flags & HWLOC_MEMBIND_STRICT) { errno = ENOSYS; return NULL; } if (hwloc_bitmap_weight(nodeset) != 1) { /* Not a single node, can't do this */ errno = EXDEV; return hwloc_alloc_or_fail(topology, len, flags); } node = hwloc_bitmap_first(nodeset); return VirtualAllocExNumaProc(GetCurrentProcess(), NULL, len, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE, node); }
static void* hwloc_hpux_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { int mmap_flags; /* Can not give a set of nodes. */ if (!hwloc_bitmap_isequal(nodeset, hwloc_topology_get_complete_nodeset(topology))) { errno = EXDEV; return hwloc_alloc_or_fail(topology, len, flags); } switch (policy) { case HWLOC_MEMBIND_DEFAULT: case HWLOC_MEMBIND_BIND: mmap_flags = 0; break; case HWLOC_MEMBIND_FIRSTTOUCH: mmap_flags = MAP_MEM_FIRST_TOUCH; break; case HWLOC_MEMBIND_INTERLEAVE: mmap_flags = MAP_MEM_INTERLEAVED; break; default: errno = ENOSYS; return NULL; } return mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | mmap_flags, -1, 0); }
static void * hwloc_aix_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { void *ret; rsid_t rsid; uint_t aix_policy; if (hwloc_aix_membind_policy_from_hwloc(&aix_policy, policy)) return hwloc_alloc_or_fail(topology, len, flags); if (hwloc_aix_prepare_membind(topology, &rsid.at_rset, nodeset, flags)) return hwloc_alloc_or_fail(topology, len, flags); ret = ra_mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0, R_RSET, rsid, aix_policy); rs_free(rsid.at_rset); return ret; }
static void * hwloc_osf_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) { memalloc_attr_t mattr; void *ptr; if (hwloc_osf_prepare_mattr(topology, &mattr, nodeset, policy, flags)) return hwloc_alloc_or_fail(topology, len, flags); /* TODO: rather use acreate/amalloc ? */ ptr = nmmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0, &mattr); radsetdestroy(&mattr.mattr_radset); return ptr; }