This source file includes following definitions.
- hwloc_get_type_or_below_depth
- hwloc_get_type_or_above_depth
- hwloc_get_nbobjs_by_type
- hwloc_get_obj_by_type
- hwloc_get_next_obj_by_depth
- hwloc_get_next_obj_by_type
- hwloc_get_root_obj
- hwloc_obj_get_info_by_name
- hwloc_alloc_membind_policy
1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef HWLOC_INLINES_H
14 #define HWLOC_INLINES_H
15
16 #ifndef HWLOC_H
17 #error Please include the main hwloc.h instead
18 #endif
19
20 #include <stdlib.h>
21 #include <errno.h>
22
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
28 static __hwloc_inline int
29 hwloc_get_type_or_below_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
30 {
31 int depth = hwloc_get_type_depth(topology, type);
32
33 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN)
34 return depth;
35
36
37 for(depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PU); ; depth--)
38 if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) < 0)
39 return depth+1;
40
41
42
43 }
44
45 static __hwloc_inline int
46 hwloc_get_type_or_above_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
47 {
48 int depth = hwloc_get_type_depth(topology, type);
49
50 if (depth != HWLOC_TYPE_DEPTH_UNKNOWN)
51 return depth;
52
53
54 for(depth = 0; ; depth++)
55 if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) > 0)
56 return depth-1;
57
58
59
60 }
61
62 static __hwloc_inline int
63 hwloc_get_nbobjs_by_type (hwloc_topology_t topology, hwloc_obj_type_t type)
64 {
65 int depth = hwloc_get_type_depth(topology, type);
66 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
67 return 0;
68 if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
69 return -1;
70 return (int) hwloc_get_nbobjs_by_depth(topology, depth);
71 }
72
73 static __hwloc_inline hwloc_obj_t
74 hwloc_get_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx)
75 {
76 int depth = hwloc_get_type_depth(topology, type);
77 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
78 return NULL;
79 if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
80 return NULL;
81 return hwloc_get_obj_by_depth(topology, depth, idx);
82 }
83
84 static __hwloc_inline hwloc_obj_t
85 hwloc_get_next_obj_by_depth (hwloc_topology_t topology, int depth, hwloc_obj_t prev)
86 {
87 if (!prev)
88 return hwloc_get_obj_by_depth (topology, depth, 0);
89 if (prev->depth != depth)
90 return NULL;
91 return prev->next_cousin;
92 }
93
94 static __hwloc_inline hwloc_obj_t
95 hwloc_get_next_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type,
96 hwloc_obj_t prev)
97 {
98 int depth = hwloc_get_type_depth(topology, type);
99 if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
100 return NULL;
101 return hwloc_get_next_obj_by_depth (topology, depth, prev);
102 }
103
104 static __hwloc_inline hwloc_obj_t
105 hwloc_get_root_obj (hwloc_topology_t topology)
106 {
107 return hwloc_get_obj_by_depth (topology, 0, 0);
108 }
109
110 static __hwloc_inline const char *
111 hwloc_obj_get_info_by_name(hwloc_obj_t obj, const char *name)
112 {
113 unsigned i;
114 for(i=0; i<obj->infos_count; i++) {
115 struct hwloc_info_s *info = &obj->infos[i];
116 if (!strcmp(info->name, name))
117 return info->value;
118 }
119 return NULL;
120 }
121
122 static __hwloc_inline void *
123 hwloc_alloc_membind_policy(hwloc_topology_t topology, size_t len, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags)
124 {
125 void *p = hwloc_alloc_membind(topology, len, set, policy, flags);
126 if (p)
127 return p;
128
129 if (hwloc_set_membind(topology, set, policy, flags) < 0)
130
131 return NULL;
132
133 p = hwloc_alloc(topology, len);
134 if (p && policy != HWLOC_MEMBIND_FIRSTTOUCH)
135
136 memset(p, 0, len);
137 return p;
138 }
139
140
141 #ifdef __cplusplus
142 }
143 #endif
144
145
146 #endif