mirror of
https://github.com/xmrig/xmrig.git
synced 2026-01-19 21:43:01 -05:00
Update hwloc for MSVC.
This commit is contained in:
55
src/3rdparty/hwloc/src/topology.c
vendored
55
src/3rdparty/hwloc/src/topology.c
vendored
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||
* Copyright © 2009-2021 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012, 2020 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
@@ -567,8 +567,9 @@ hwloc_free_unlinked_object(hwloc_obj_t obj)
|
||||
}
|
||||
|
||||
/* Replace old with contents of new object, and make new freeable by the caller.
|
||||
* Only updates next_sibling/first_child pointers,
|
||||
* so may only be used during early discovery.
|
||||
* Requires reconnect (for siblings pointers and group depth),
|
||||
* fixup of sets (only the main cpuset was likely compared before merging),
|
||||
* and update of total_memory and group depth.
|
||||
*/
|
||||
static void
|
||||
hwloc_replace_linked_object(hwloc_obj_t old, hwloc_obj_t new)
|
||||
@@ -1348,7 +1349,7 @@ merge_insert_equal(hwloc_obj_t new, hwloc_obj_t old)
|
||||
|
||||
/* returns the result of merge, or NULL if not merged */
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc__insert_try_merge_group(hwloc_obj_t old, hwloc_obj_t new)
|
||||
hwloc__insert_try_merge_group(hwloc_topology_t topology, hwloc_obj_t old, hwloc_obj_t new)
|
||||
{
|
||||
if (new->type == HWLOC_OBJ_GROUP && old->type == HWLOC_OBJ_GROUP) {
|
||||
/* which group do we keep? */
|
||||
@@ -1359,6 +1360,7 @@ hwloc__insert_try_merge_group(hwloc_obj_t old, hwloc_obj_t new)
|
||||
|
||||
/* keep the new one, it doesn't want to be merged */
|
||||
hwloc_replace_linked_object(old, new);
|
||||
topology->modified = 1;
|
||||
return new;
|
||||
|
||||
} else {
|
||||
@@ -1366,9 +1368,12 @@ hwloc__insert_try_merge_group(hwloc_obj_t old, hwloc_obj_t new)
|
||||
/* keep the old one, it doesn't want to be merged */
|
||||
return old;
|
||||
|
||||
/* compare subkinds to decice who to keep */
|
||||
if (new->attr->group.kind < old->attr->group.kind)
|
||||
/* compare subkinds to decide which group to keep */
|
||||
if (new->attr->group.kind < old->attr->group.kind) {
|
||||
/* keep smaller kind */
|
||||
hwloc_replace_linked_object(old, new);
|
||||
topology->modified = 1;
|
||||
}
|
||||
return old;
|
||||
}
|
||||
}
|
||||
@@ -1394,6 +1399,7 @@ hwloc__insert_try_merge_group(hwloc_obj_t old, hwloc_obj_t new)
|
||||
* and let the caller free the new object
|
||||
*/
|
||||
hwloc_replace_linked_object(old, new);
|
||||
topology->modified = 1;
|
||||
return old;
|
||||
|
||||
} else {
|
||||
@@ -1435,7 +1441,7 @@ hwloc___insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t cur
|
||||
int setres = res;
|
||||
|
||||
if (res == HWLOC_OBJ_EQUAL) {
|
||||
hwloc_obj_t merged = hwloc__insert_try_merge_group(child, obj);
|
||||
hwloc_obj_t merged = hwloc__insert_try_merge_group(topology, child, obj);
|
||||
if (merged)
|
||||
return merged;
|
||||
/* otherwise compare actual types to decide of the inclusion */
|
||||
@@ -1931,12 +1937,24 @@ hwloc_topology_insert_group_object(struct hwloc_topology *topology, hwloc_obj_t
|
||||
|
||||
if (!res)
|
||||
return NULL;
|
||||
if (res != obj)
|
||||
/* merged */
|
||||
|
||||
if (res != obj && res->type != HWLOC_OBJ_GROUP)
|
||||
/* merged, not into a Group, nothing to update */
|
||||
return res;
|
||||
|
||||
/* res == obj means that the object was inserted.
|
||||
* We need to reconnect levels, fill all its cpu/node sets,
|
||||
* compute its total memory, group depth, etc.
|
||||
*
|
||||
* res != obj usually means that our new group was merged into an
|
||||
* existing object, no need to recompute anything.
|
||||
* However, if merging with an existing group, depending on their kinds,
|
||||
* the contents of obj may overwrite the contents of the old group.
|
||||
* This requires reconnecting levels, filling sets, recomputing total memory, etc.
|
||||
*/
|
||||
|
||||
/* properly inserted */
|
||||
hwloc_obj_add_children_sets(obj);
|
||||
hwloc_obj_add_children_sets(res);
|
||||
if (hwloc_topology_reconnect(topology, 0) < 0)
|
||||
return NULL;
|
||||
|
||||
@@ -1948,7 +1966,7 @@ hwloc_topology_insert_group_object(struct hwloc_topology *topology, hwloc_obj_t
|
||||
#endif
|
||||
hwloc_topology_check(topology);
|
||||
|
||||
return obj;
|
||||
return res;
|
||||
}
|
||||
|
||||
hwloc_obj_t
|
||||
@@ -4658,6 +4676,9 @@ hwloc__check_misc_children(hwloc_topology_t topology, hwloc_bitmap_t gp_indexes,
|
||||
static void
|
||||
hwloc__check_object(hwloc_topology_t topology, hwloc_bitmap_t gp_indexes, hwloc_obj_t obj)
|
||||
{
|
||||
hwloc_uint64_t total_memory;
|
||||
hwloc_obj_t child;
|
||||
|
||||
assert(!hwloc_bitmap_isset(gp_indexes, obj->gp_index));
|
||||
hwloc_bitmap_set(gp_indexes, obj->gp_index);
|
||||
|
||||
@@ -4715,6 +4736,18 @@ hwloc__check_object(hwloc_topology_t topology, hwloc_bitmap_t gp_indexes, hwloc_
|
||||
assert(hwloc_cache_type_by_depth_type(obj->attr->cache.depth, obj->attr->cache.type) == obj->type);
|
||||
}
|
||||
|
||||
/* check total memory */
|
||||
total_memory = 0;
|
||||
if (obj->type == HWLOC_OBJ_NUMANODE)
|
||||
total_memory += obj->attr->numanode.local_memory;
|
||||
for_each_child(child, obj) {
|
||||
total_memory += child->total_memory;
|
||||
}
|
||||
for_each_memory_child(child, obj) {
|
||||
total_memory += child->total_memory;
|
||||
}
|
||||
assert(total_memory == obj->total_memory);
|
||||
|
||||
/* check children */
|
||||
hwloc__check_normal_children(topology, gp_indexes, obj);
|
||||
hwloc__check_memory_children(topology, gp_indexes, obj);
|
||||
|
||||
Reference in New Issue
Block a user