hwloc 0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61e8806d799ed1d37e565e888eed0de26488116a
4
- data.tar.gz: 541e27b80809c3d14acade623fbcdbaab8b25810
3
+ metadata.gz: '081b8121d7a652135e9b3737780c298fa7344cb6'
4
+ data.tar.gz: 17d522c1332cda3854e27599c77427c04f2d84e7
5
5
  SHA512:
6
- metadata.gz: 0bf475374cc8559d3552ddb2810aee513b1a50aa2d22d23a95e9580f38e4797c171fb123cc32e63b9fc4e41bdfb1bc2c78a4bf18577a8342bd13f1140d2216f8
7
- data.tar.gz: 917a4118dd5ea19bb4f95385cda8cf8ffc331534e9e77ed04c54b0c57f870de687db2406167c5bb8e26e79472afa069fc2a859f0611709ffeccc39fb63e6a062
6
+ metadata.gz: 425b74b3084abe8c680cdcd8b2179e892a87c3c2b27fa8350107be21e489c68664d87c21838399aeef66297d0e2dce1ce491a156893e3258c8ad92c5a6269ee6
7
+ data.tar.gz: 48d341cb5425bc74dc089183e476d37335e90255e699d5bbf734a18e261e2b78188dcb545756693d34e7fe7a3e67fd18cf4ec5ef57e4284824f578dbb3f0055b
data/README.md CHANGED
@@ -27,7 +27,11 @@ def print_pointer_location(ptr, t)
27
27
  end
28
28
 
29
29
  t = Hwloc::Topology::new
30
- t.flags = Hwloc::Topology::FLAG_ICACHES
30
+ if Hwloc::API_VERSION < Hwloc::API_VERSION_2_0
31
+ t.flags = Hwloc::Topology::FLAG_ICACHES
32
+ else
33
+ t.set_icache_types_filter(:TYPE_FILTER_KEEP_ALL)
34
+ end
31
35
  t.load
32
36
 
33
37
  $page_size = t.machines.first.memory.page_types.first.size
@@ -50,7 +54,7 @@ t.depth.times { |d|
50
54
 
51
55
  # find the number of level of caches on the machine and their size:
52
56
  first_core = t.cores.first
53
- caches = first_core.ancestors.take_while{ |o| o.type == :OBJ_CACHE }
57
+ caches = first_core.ancestors.take_while{ |o| o.is_a_cache? }
54
58
  caches.each_with_index { |c,i|
55
59
  puts "#{c.type_name}: #{c.attr.size/1024}KiB"
56
60
  }
data/hwloc.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'hwloc'
3
- s.version = "0.1"
3
+ s.version = "0.2.0"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://github.com/Nanosim-LIG/hwloc-ruby"
data/lib/hwloc/Bind.rb CHANGED
@@ -6,15 +6,26 @@ module Hwloc
6
6
  :CPUBIND_NOMEMBIND, 1<<3
7
7
  ] )
8
8
 
9
- MembindPolicy = enum( :membind_policy, [
10
- :MEMBIND_DEFAULT, 0,
11
- :MEMBIND_FIRSTTOUCH, 1,
12
- :MEMBIND_BIND, 2,
13
- :MEMBIND_INTERLEAVE, 3,
14
- :MEMBIND_REPLICATE, 4,
15
- :MEMBIND_NEXTTOUCH, 5,
16
- :MEMBIND_MIXED, -1
17
- ] )
9
+ if API_VERSION < API_VERSION_2_0 then
10
+ MembindPolicy = enum( :membind_policy, [
11
+ :MEMBIND_DEFAULT, 0,
12
+ :MEMBIND_FIRSTTOUCH, 1,
13
+ :MEMBIND_BIND, 2,
14
+ :MEMBIND_INTERLEAVE, 3,
15
+ :MEMBIND_REPLICATE, 4,
16
+ :MEMBIND_NEXTTOUCH, 5,
17
+ :MEMBIND_MIXED, -1
18
+ ] )
19
+ else
20
+ MembindPolicy = enum( :membind_policy, [
21
+ :MEMBIND_DEFAULT, 0,
22
+ :MEMBIND_FIRSTTOUCH, 1,
23
+ :MEMBIND_BIND, 2,
24
+ :MEMBIND_INTERLEAVE, 3,
25
+ :MEMBIND_NEXTTOUCH, 4,
26
+ :MEMBIND_MIXED, -1
27
+ ] )
28
+ end
18
29
 
19
30
  MembindFlags = enum( :membind_flags, [
20
31
  :MEMBIND_PROCESS, 1<<0,
@@ -43,9 +54,16 @@ module Hwloc
43
54
  class Topology
44
55
 
45
56
  def set_cpubind(cpuset, flags = 0)
46
- err = Hwloc.hwloc_set_cpubind(@ptr, cpuset, flags)
47
- raise CpubindError if err == -1
48
- return self
57
+ if block_given? then
58
+ oldcpuset = get_cpubind(flags)
59
+ set_cpubind(cpuset, flags)
60
+ yield
61
+ set_cpubind(oldcpuset, flags)
62
+ else
63
+ err = Hwloc.hwloc_set_cpubind(@ptr, cpuset, flags)
64
+ raise CpubindError if err == -1
65
+ return self
66
+ end
49
67
  end
50
68
 
51
69
  def get_cpubind(flags = 0)
@@ -100,18 +118,21 @@ module Hwloc
100
118
  class MembindError < BindError
101
119
  end
102
120
 
103
- attach_function :hwloc_set_membind_nodeset, [:topology, :nodeset, :membind_policy, :int], :int
121
+ if API_VERSION < API_VERSION_2_0 then
122
+ attach_function :hwloc_set_membind_nodeset, [:topology, :nodeset, :membind_policy, :int], :int
123
+ attach_function :hwloc_get_membind_nodeset, [:topology, :nodeset, :pointer, :int], :int
124
+ attach_function :hwloc_set_proc_membind_nodeset, [:topology, :hwloc_pid_t, :nodeset, :membind_policy, :int], :int
125
+ attach_function :hwloc_get_proc_membind_nodeset, [:topology, :hwloc_pid_t, :nodeset, :pointer, :int], :int
126
+ attach_function :hwloc_set_area_membind_nodeset, [:topology, :pointer, :size_t, :nodeset, :membind_policy, :int], :int
127
+ attach_function :hwloc_get_area_membind_nodeset, [:topology, :pointer, :size_t, :nodeset, :pointer, :int], :int
128
+ attach_function :hwloc_alloc_membind_nodeset, [:topology, :size_t, :nodeset, :membind_policy, :int], :pointer
129
+ end
104
130
  attach_function :hwloc_set_membind, [:topology, :bitmap, :membind_policy, :int], :int
105
- attach_function :hwloc_get_membind_nodeset, [:topology, :nodeset, :pointer, :int], :int
106
131
  attach_function :hwloc_get_membind, [:topology, :bitmap, :pointer, :int], :int
107
- attach_function :hwloc_set_proc_membind_nodeset, [:topology, :hwloc_pid_t, :nodeset, :membind_policy, :int], :int
108
132
  attach_function :hwloc_set_proc_membind, [:topology, :hwloc_pid_t, :bitmap, :membind_policy, :int], :int
109
- attach_function :hwloc_get_proc_membind_nodeset, [:topology, :hwloc_pid_t, :nodeset, :pointer, :int], :int
110
133
  attach_function :hwloc_get_proc_membind, [:topology, :hwloc_pid_t, :bitmap, :pointer, :int], :int
111
134
 
112
- attach_function :hwloc_set_area_membind_nodeset, [:topology, :pointer, :size_t, :nodeset, :membind_policy, :int], :int
113
135
  attach_function :hwloc_set_area_membind, [:topology, :pointer, :size_t, :bitmap, :membind_policy, :int], :int
114
- attach_function :hwloc_get_area_membind_nodeset, [:topology, :pointer, :size_t, :nodeset, :pointer, :int], :int
115
136
  attach_function :hwloc_get_area_membind, [:topology, :pointer, :size_t, :bitmap, :pointer, :int], :int
116
137
 
117
138
  begin
@@ -121,31 +142,88 @@ module Hwloc
121
142
  end
122
143
 
123
144
  attach_function :hwloc_alloc, [:topology, :size_t], :pointer
124
- attach_function :hwloc_alloc_membind_nodeset, [:topology, :size_t, :nodeset, :membind_policy, :int], :pointer
125
145
  attach_function :hwloc_alloc_membind, [:topology, :size_t, :bitmap, :membind_policy, :int], :pointer
126
146
  attach_function :hwloc_free, [:topology, :pointer, :size_t], :int
127
147
 
128
148
  class Topology
129
149
 
130
- def set_membind_nodeset(nodeset, policy, flags=0)
131
- err = Hwloc.hwloc_set_membind_nodeset(@ptr, nodeset, policy, flags)
132
- raise MembindError if err == -1
133
- return self
134
- end
150
+ if API_VERSION < API_VERSION_2_0 then
151
+ def set_membind_nodeset(nodeset, policy, flags=0)
152
+ err = Hwloc.hwloc_set_membind_nodeset(@ptr, nodeset, policy, flags)
153
+ raise MembindError if err == -1
154
+ return self
155
+ end
156
+
157
+ def get_membind_nodeset(flags=0)
158
+ nodeset = Nodeset::new
159
+ policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
160
+ err = Hwloc.hwloc_get_membind_nodeset(@ptr, nodeset, policy_p, flags)
161
+ raise MembindError if err == -1
162
+ policy = policy_p.read_int
163
+ return [nodeset, MembindPolicy[policy]]
164
+ end
165
+
166
+ def set_proc_membind_nodeset(pid, nodeset, policy, flags=0)
167
+ err = Hwloc.hwloc_set_proc_membind_nodeset(@ptr, pid, nodeset, policy, flags)
168
+ raise MembindError if err == -1
169
+ return self
170
+ end
171
+
172
+ def get_proc_membind_nodeset(pid, flags=0)
173
+ nodeset = Nodeset::new
174
+ policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
175
+ err = Hwloc.hwloc_get_proc_membind_nodeset(@ptr, pid, nodeset, policy_p, flags)
176
+ raise MembindError if err == -1
177
+ policy = MembindPolicy[policy_p.read_int]
178
+ return [nodeset, policy]
179
+ end
180
+
181
+ def set_area_membind_nodeset(pointer, nodeset, policy, flags=0)
182
+ err = Hwloc.hwloc_set_area_membind_nodeset(@ptr, pointer, pointer.size, nodeset, policy, flags)
183
+ raise MembindError if err == -1
184
+ return self
185
+ end
186
+
187
+ def get_area_membind_nodeset(pointer, flags=0)
188
+ nodeset = Nodeset::new
189
+ policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
190
+ err = Hwloc.hwloc_get_area_membind_nodeset(@ptr, pointer, pointer.size, nodeset, policy_p, flags)
191
+ raise MembindError if err == -1
192
+ policy = MembindPolicy[policy_p.read_int]
193
+ return [nodeset, policy]
194
+ end
195
+
196
+ def alloc_membind_nodeset(size, nodeset, policy, flags=0)
197
+ ptr = Hwloc.hwloc_alloc_membind_nodeset(@ptr, size, nodeset, policy, flags)
198
+ raise MembindError if ptr.null?
199
+ ptr = ptr.slice(0, size)
200
+ return FFI::AutoPointer::new(ptr, self.method(:free))
201
+ end
202
+
203
+ def alloc_membind_policy_nodeset(size, nodeset, policy, flags=0)
204
+ begin
205
+ return alloc_membind_nodeset(size, nodeset, policy, flags)
206
+ rescue MembindError
207
+ set_membind_nodeset(nodeset, policy, flags)
208
+ ptr = alloc(size)
209
+ ptr.clear if policy != Hwloc::MEMBIND_FIRSTTOUCH
210
+ return ptr
211
+ end
212
+ end
135
213
 
136
- def set_membind(set, policy, flags=0)
137
- err = Hwloc.hwloc_set_membind(@ptr, set, policy, flags)
138
- raise MembindError if err == -1
139
- return self
140
214
  end
141
215
 
142
- def get_membind_nodeset(flags=0)
143
- nodeset = Nodeset::new
144
- policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
145
- err = Hwloc.hwloc_get_membind_nodeset(@ptr, nodeset, policy_p, flags)
146
- raise MembindError if err == -1
147
- policy = policy_p.read_int
148
- return [nodeset, MembindPolicy[policy]]
216
+ def set_membind(set, policy, flags=0)
217
+ if block_given? then
218
+ oldset, oldpolicy = get_membind(flags)
219
+ set_membind(set, policy, flags)
220
+ yield
221
+ set_membind(oldset, oldpolicy, flags)
222
+ else
223
+ err = Hwloc.hwloc_set_membind(@ptr, set, policy, flags)
224
+ raise MembindError if err == -1
225
+ return self
226
+ end
149
227
  end
150
228
 
151
229
  def get_membind(flags=0)
@@ -157,27 +235,12 @@ module Hwloc
157
235
  return [set, MembindPolicy[policy]]
158
236
  end
159
237
 
160
- def set_proc_membind_nodeset(pid, nodeset, policy, flags=0)
161
- err = Hwloc.hwloc_set_proc_membind_nodeset(@ptr, pid, nodeset, policy, flags)
162
- raise MembindError if err == -1
163
- return self
164
- end
165
-
166
238
  def set_proc_membind(pid, set, policy, flags=0)
167
239
  err = Hwloc.hwloc_set_proc_membind(@ptr, pid, set, policy, flags)
168
240
  raise MembindError if err == -1
169
241
  return self
170
242
  end
171
243
 
172
- def get_proc_membind_nodeset(pid, flags=0)
173
- nodeset = Nodeset::new
174
- policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
175
- err = Hwloc.hwloc_get_proc_membind_nodeset(@ptr, pid, nodeset, policy_p, flags)
176
- raise MembindError if err == -1
177
- policy = MembindPolicy[policy_p.read_int]
178
- return [nodeset, policy]
179
- end
180
-
181
244
  def get_proc_membind(pid, flags=0)
182
245
  set = Bitmap::new
183
246
  policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
@@ -187,27 +250,12 @@ module Hwloc
187
250
  return [set, policy]
188
251
  end
189
252
 
190
- def set_area_membind_nodeset(pointer, nodeset, policy, flags=0)
191
- err = Hwloc.hwloc_set_area_membind_nodeset(@ptr, pointer, pointer.size, nodeset, policy, flags)
192
- raise MembindError if err == -1
193
- return self
194
- end
195
-
196
253
  def set_area_membind(pointer, set, policy, flags=0)
197
254
  err = Hwloc.hwloc_set_area_membind(@ptr, pointer, pointer.size, set, policy, flags)
198
255
  raise MembindError if err == -1
199
256
  return self
200
257
  end
201
258
 
202
- def get_area_membind_nodeset(pointer, flags=0)
203
- nodeset = Nodeset::new
204
- policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
205
- err = Hwloc.hwloc_get_area_membind_nodeset(@ptr, pointer, pointer.size, nodeset, policy_p, flags)
206
- raise MembindError if err == -1
207
- policy = MembindPolicy[policy_p.read_int]
208
- return [nodeset, policy]
209
- end
210
-
211
259
  def get_area_membind(pointer, flags=0)
212
260
  set = Bitmap::new
213
261
  policy_p = FFI::MemoryPointer::new(MembindPolicy.native_type)
@@ -233,13 +281,6 @@ module Hwloc
233
281
  return FFI::AutoPointer::new(ptr, self.method(:free))
234
282
  end
235
283
 
236
- def alloc_membind_nodeset(size, nodeset, policy, flags=0)
237
- ptr = Hwloc.hwloc_alloc_membind_nodeset(@ptr, size, nodeset, policy, flags)
238
- raise MembindError if ptr.null?
239
- ptr = ptr.slice(0, size)
240
- return FFI::AutoPointer::new(ptr, self.method(:free))
241
- end
242
-
243
284
  def alloc_membind(size, set, policy, flags=0)
244
285
  ptr = Hwloc.hwloc_alloc_membind(@ptr, size, set, policy, flags)
245
286
  raise MembindError if ptr.null?
@@ -247,17 +288,6 @@ module Hwloc
247
288
  return FFI::AutoPointer::new(ptr, self.method(:free))
248
289
  end
249
290
 
250
- def alloc_membind_policy_nodeset(size, nodeset, policy, flags=0)
251
- begin
252
- return alloc_membind_nodeset(size, nodeset, policy, flags)
253
- rescue MembindError
254
- set_membind_nodeset(nodeset, policy, flags)
255
- ptr = alloc(size)
256
- ptr.clear if policy != Hwloc::MEMBIND_FIRSTTOUCH
257
- return ptr
258
- end
259
- end
260
-
261
291
  def alloc_membind_policy(size, set, policy, flags=0)
262
292
  begin
263
293
  return alloc_membind(size, set, policy, flags)
data/lib/hwloc/Edition.rb CHANGED
@@ -1,35 +1,75 @@
1
1
  module Hwloc
2
2
 
3
- attach_function :hwloc_topology_insert_misc_object_by_cpuset, [:topology, :cpuset, :string], Obj.ptr
4
- attach_function :hwloc_topology_insert_misc_object_by_parent, [:topology, Obj.ptr, :string], Obj.ptr
3
+ if API_VERSION < API_VERSION_2_0 then
4
+ attach_function :hwloc_topology_insert_misc_object_by_cpuset, [:topology, :cpuset, :string], Obj.ptr
5
+ attach_function :hwloc_topology_insert_misc_object_by_parent, [:topology, Obj.ptr, :string], Obj.ptr
6
+ attach_function :hwloc_custom_insert_topology, [:topology, Obj.ptr, :topology, Obj.ptr,], :int
7
+ attach_function :hwloc_custom_insert_group_object_by_parent, [:topology, Obj.ptr, :int], Obj.ptr
8
+ else
9
+ attach_function :hwloc_topology_insert_misc_object, [:topology, Obj.ptr, :string], Obj.ptr
10
+ attach_function :hwloc_topology_alloc_group_object, [:topology], Obj.ptr
11
+ attach_function :hwloc_topology_insert_group_object, [:topology, Obj.ptr], Obj.ptr
12
+ attach_function :hwloc_obj_add_other_obj_sets, [Obj.ptr, Obj.ptr], :int
13
+ end
5
14
 
6
- RestrictFlags = enum( FFI::find_type(:ulong), :restrict_flags, [
7
- :RESTRICT_FLAG_ADAPT_DISTANCES, 1<<0,
8
- :RESTRICT_FLAG_ADAPT_MISC, 1<<1,
9
- :RESTRICT_FLAG_ADAPT_IO, 1<<2
10
- ] )
15
+ if API_VERSION < API_VERSION_2_0 then
16
+ RestrictFlags = enum( FFI::find_type(:ulong), :restrict_flags, [
17
+ :RESTRICT_FLAG_ADAPT_DISTANCES, 1<<0,
18
+ :RESTRICT_FLAG_ADAPT_MISC, 1<<1,
19
+ :RESTRICT_FLAG_ADAPT_IO, 1<<2
20
+ ] )
21
+ else
22
+ RestrictFlags = enum( FFI::find_type(:ulong), :restrict_flags, [
23
+ :RESTRICT_FLAG_REMOVE_CPULESS, 1<<0,
24
+ :RESTRICT_FLAG_ADAPT_MISC, 1<<1,
25
+ :RESTRICT_FLAG_ADAPT_IO, 1<<2
26
+ ] )
27
+ end
11
28
 
12
29
  attach_function :hwloc_topology_restrict, [:topology, :cpuset, :ulong], :int
13
- attach_function :hwloc_custom_insert_topology, [:topology, Obj.ptr, :topology, Obj.ptr,], :int
14
- attach_function :hwloc_custom_insert_group_object_by_parent, [:topology, Obj.ptr, :int], Obj.ptr
15
30
 
16
31
  class EditionError < TopologyError
17
32
  end
18
33
 
19
34
  class Topology
20
35
 
21
- def insert_misc_object_by_cpuset(cpuset, name)
22
- obj = Hwloc.hwloc_topology_insert_misc_object_by_cpuset(@ptr, cpuset, name)
23
- raise EditionError if obj.to_ptr.null?
24
- obj.instance_variable_set(:@topology, self)
25
- return obj
26
- end
36
+ if API_VERSION < API_VERSION_2_0 then
37
+ def insert_misc_object_by_cpuset(cpuset, name)
38
+ obj = Hwloc.hwloc_topology_insert_misc_object_by_cpuset(@ptr, cpuset, name)
39
+ raise EditionError if obj.to_ptr.null?
40
+ obj.instance_variable_set(:@topology, self)
41
+ return obj
42
+ end
43
+
44
+ def insert_misc_object_by_parent(parent, name)
45
+ obj = Hwloc.hwloc_topology_insert_misc_object_by_parent(@ptr, parent, name)
46
+ raise EditionError if obj.to_ptr.null?
47
+ obj.instance_variable_set(:@topology, self)
48
+ return obj
49
+ end
50
+
51
+ alias insert_misc_object insert_misc_object_by_parent
52
+
53
+ def custom_insert_topology(newparent, oldtopology, oldroot = nil)
54
+ err = Hwloc.hwloc_custom_insert_topology(@ptr, newparent, oldtopology.ptr, oldroot)
55
+ raise EditionError if err == -1
56
+ return self
57
+ end
58
+
59
+ def custom_insert_group_object_by_parent(parent, groupdepth)
60
+ obj = Hwloc.hwloc_custom_insert_group_object_by_parent(@ptr, parent, groupdepth)
61
+ raise EditionError if obj.to_ptr.null?
62
+ obj.instance_variable_set(:@topology, self)
63
+ return obj
64
+ end
27
65
 
28
- def insert_misc_object_by_parent(parent, name)
29
- obj = Hwloc.hwloc_topology_insert_misc_object_by_parent(@ptr, parent, name)
30
- raise EditionError if obj.to_ptr.null?
31
- obj.instance_variable_set(:@topology, self)
32
- return obj
66
+ else
67
+ def insert_misc_object(parent, name)
68
+ obj = Hwloc.hwloc_topology_insert_misc_object(@ptr, parent, name)
69
+ raise EditionError if obj.to_ptr.null?
70
+ obj.instance_variable_set(:@topology, self)
71
+ return obj
72
+ end
33
73
  end
34
74
 
35
75
  def restrict(cpuset, flags)
@@ -38,19 +78,6 @@ module Hwloc
38
78
  return self
39
79
  end
40
80
 
41
- def custom_insert_topology(newparent, oldtopology, oldroot = nil)
42
- err = Hwloc.hwloc_custom_insert_topology(@ptr, newparent, oldtopology.ptr, oldroot)
43
- raise EditionError if err == -1
44
- return self
45
- end
46
-
47
- def custom_insert_group_object_by_parent(parent, groupdepth)
48
- obj = Hwloc.hwloc_custom_insert_group_object_by_parent(@ptr, parent, groupdepth)
49
- raise EditionError if obj.to_ptr.null?
50
- obj.instance_variable_set(:@topology, self)
51
- return obj
52
- end
53
-
54
81
  end
55
82
 
56
83
  class Obj
data/lib/hwloc/Export.rb CHANGED
@@ -1,7 +1,16 @@
1
1
  module Hwloc
2
2
 
3
- attach_function :hwloc_topology_export_xml, [:topology, :string], :int
4
- attach_function :hwloc_topology_export_xmlbuffer, [:topology, :pointer, :pointer], :int
3
+ if API_VERSION < API_VERSION_2_0 then
4
+ attach_function :hwloc_topology_export_xml, [:topology, :string], :int
5
+ attach_function :hwloc_topology_export_xmlbuffer, [:topology, :pointer, :pointer], :int
6
+ else
7
+ TopologyExportXmlFlags = enum( FFI::find_type(:ulong), :topology_export_xml_flags, [
8
+ :TOPOLOGY_EXPORT_XML_FLAG_V1, 1<<0
9
+ ] )
10
+ attach_function :hwloc_topology_export_xml, [:topology, :string, :ulong], :int
11
+ attach_function :hwloc_topology_export_xmlbuffer, [:topology, :pointer, :pointer, :ulong], :int
12
+ end
13
+
5
14
  attach_function :hwloc_free_xmlbuffer, [:topology, :pointer], :void
6
15
 
7
16
  callback :hwloc_topology_set_userdata_export_callback_callback, [:pointer, :topology, Obj.ptr], :void
@@ -25,19 +34,36 @@ module Hwloc
25
34
 
26
35
  class Topology
27
36
 
28
- def export_xml(xmlpath)
29
- err = Hwloc.hwloc_topology_export_xml(@ptr, xmlpath)
30
- raise ExportError if err == -1
31
- return self
32
- end
37
+ if API_VERSION < API_VERSION_2_0 then
38
+ def export_xml(xmlpath)
39
+ err = Hwloc.hwloc_topology_export_xml(@ptr, xmlpath)
40
+ raise ExportError if err == -1
41
+ return self
42
+ end
33
43
 
34
- def export_xmlbuffer
35
- data_p = FFI::MemoryPointer::new(:pointer)
36
- count_p = FFI::MemoryPointer::new(:int)
37
- err = Hwloc.hwloc_topology_export_xmlbuffer(@ptr, data_p, count_p)
38
- raise ExportError if err == -1
39
- xmlbuffer_p = data_p.read_pointer.slice(0, count_p.read_int)
40
- return FFI::AutoPointer::new(xmlbuffer_p, self.method(:free_xmlbuffer))
44
+ def export_xmlbuffer
45
+ data_p = FFI::MemoryPointer::new(:pointer)
46
+ count_p = FFI::MemoryPointer::new(:int)
47
+ err = Hwloc.hwloc_topology_export_xmlbuffer(@ptr, data_p, count_p)
48
+ raise ExportError if err == -1
49
+ xmlbuffer_p = data_p.read_pointer.slice(0, count_p.read_int)
50
+ return FFI::AutoPointer::new(xmlbuffer_p, self.method(:free_xmlbuffer))
51
+ end
52
+ else
53
+ def export_xml(xmlpath, flags=0)
54
+ err = Hwloc.hwloc_topology_export_xml(@ptr, xmlpath, flags)
55
+ raise ExportError if err == -1
56
+ return self
57
+ end
58
+
59
+ def export_xmlbuffer(flags = 0)
60
+ data_p = FFI::MemoryPointer::new(:pointer)
61
+ count_p = FFI::MemoryPointer::new(:int)
62
+ err = Hwloc.hwloc_topology_export_xmlbuffer(@ptr, data_p, count_p, flags)
63
+ raise ExportError if err == -1
64
+ xmlbuffer_p = data_p.read_pointer.slice(0, count_p.read_int)
65
+ return FFI::AutoPointer::new(xmlbuffer_p, self.method(:free_xmlbuffer))
66
+ end
41
67
  end
42
68
 
43
69
  def free_xmlbuffer(pointer)
data/lib/hwloc/Hwloc.rb CHANGED
@@ -6,7 +6,11 @@ module Hwloc
6
6
 
7
7
  attach_function :hwloc_get_api_version, [], :uint
8
8
 
9
- raise RuntimeError, "Wrong hwloc api version (#{Hwloc.hwloc_get_api_version.to_a(16)})!" if Hwloc.hwloc_get_api_version < 0x00010a00
9
+ API_VERSION = Hwloc.hwloc_get_api_version
10
+ API_VERSION_1_10 = 0x00010a00
11
+ API_VERSION_2_0 = 0x00020000
12
+
13
+ raise RuntimeError, "Wrong hwloc api version (#{API_VERSION.to_s(16)})!" if API_VERSION < 0x00010a00
10
14
 
11
15
  attach_function :strerror, [:int], :string
12
16
 
data/lib/hwloc/Obj.rb CHANGED
@@ -3,21 +3,39 @@ module Hwloc
3
3
  class ObjError < Error
4
4
  end
5
5
 
6
- ObjType = enum( :obj_type, [
6
+ obj_types = [
7
7
  :OBJ_SYSTEM,
8
8
  :OBJ_MACHINE,
9
9
  :OBJ_NUMANODE,
10
- :OBJ_PACKAGE,
11
- :OBJ_CACHE,
10
+ :OBJ_PACKAGE
11
+ ]
12
+ obj_types.push :OBJ_CACHE if API_VERSION < API_VERSION_2_0
13
+ obj_types += [
12
14
  :OBJ_CORE,
13
- :OBJ_PU,
15
+ :OBJ_PU
16
+ ]
17
+ if API_VERSION >= API_VERSION_2_0 then
18
+ obj_types += [
19
+ :OBJ_L1CACHE,
20
+ :OBJ_L2CACHE,
21
+ :OBJ_L3CACHE,
22
+ :OBJ_L4CACHE,
23
+ :OBJ_L5CACHE,
24
+ :OBJ_L1ICACHE,
25
+ :OBJ_L2ICACHE,
26
+ :OBJ_L3ICACHE
27
+ ]
28
+ end
29
+ obj_types += [
14
30
  :OBJ_GROUP,
15
31
  :OBJ_MISC,
16
32
  :OBJ_BRIDGE,
17
33
  :OBJ_PCI_DEVICE,
18
34
  :OBJ_OS_DEVICE,
19
35
  :OBJ_TYPE_MAX
20
- ] )
36
+ ]
37
+
38
+ ObjType = enum( :obj_type, obj_types )
21
39
 
22
40
  attach_function :hwloc_compare_types, [:obj_type, :obj_type], :int
23
41
 
@@ -109,12 +127,57 @@ module Hwloc
109
127
 
110
128
  end
111
129
 
112
- class Distances < Struct
113
- layout :relative_depth, :uint,
114
- :nbobjs, :uint,
115
- :latency, :pointer,
116
- :latency_max, :float,
117
- :latency_base, :float
130
+ if API_VERSION < API_VERSION_2_0 then
131
+ class Distances < Struct
132
+ layout :relative_depth, :uint,
133
+ :nbobjs, :uint,
134
+ :latency, :pointer,
135
+ :latency_max, :float,
136
+ :latency_base, :float
137
+ end
138
+ else
139
+
140
+ DistancesKind = enum(FFI::find_type(:ulong), :distances_kind, [
141
+ :DISTANCES_KIND_FROM_OS, 1<<0,
142
+ :DISTANCES_KIND_FROM_USER, 1<<1,
143
+ :DISTANCES_KIND_MEANS_LATENCY, 1<<2,
144
+ :DISTANCES_KIND_MEANS_BANDWIDTH, 1<<3
145
+ ])
146
+
147
+ DistancesFlag = enum(FFI::find_type(:ulong), :distances_flag, [
148
+ :DISTANCES_FLAG_GROUP, 1<<0,
149
+ :DISTANCES_FLAG_GROUP_INACCURATE, 1<<1
150
+ ])
151
+
152
+ class Distances < Struct
153
+ layout :nbobjs, :uint,
154
+ :objs, :pointer,
155
+ :kind, :ulong,
156
+ :values, :pointer
157
+
158
+ def objs
159
+ arity = self[:nbobjs]
160
+ if arity == 0 then
161
+ return []
162
+ else
163
+ return self[:objs].read_array_of_pointer(arity).collect { |p|
164
+ c = Obj::new(p)
165
+ c.instance_variable_set(:@topology, @topology)
166
+ c
167
+ }
168
+ end
169
+ end
170
+
171
+ def values
172
+ arity = self[:nbobjs]
173
+ arity *= arity
174
+ if arity == 0 then
175
+ return []
176
+ else
177
+ return self[:values].read_array_of_uint64(arity)
178
+ end
179
+ end
180
+ end
118
181
  end
119
182
 
120
183
  class ObjInfo < Struct
@@ -162,7 +225,14 @@ module Hwloc
162
225
  end
163
226
 
164
227
  class GroupAttr < Struct
165
- layout :depth, :uint
228
+ group_layout = [ :depth, :uint ]
229
+ if API_VERSION >= API_VERSION_2_0 then
230
+ group_layout += [
231
+ :kind, :uint,
232
+ :subkind, :uint
233
+ ]
234
+ end
235
+ layout( *group_layout )
166
236
  end
167
237
 
168
238
  class PcidevAttr < Struct
@@ -216,43 +286,86 @@ module Hwloc
216
286
  class Obj < Struct
217
287
  end
218
288
 
289
+ if API_VERSION < API_VERSION_2_0 then
290
+ attach_function :hwloc_obj_type_string, [:obj_type], :string
291
+ else
292
+ attach_function :hwloc_type_name, [:obj_type], :string
293
+ end
219
294
  attach_function :hwloc_obj_type_snprintf, [:pointer, :size_t, Obj.ptr, :int], :int
220
295
  attach_function :hwloc_obj_attr_snprintf, [:pointer, :size_t, Obj.ptr, :string, :int], :int
221
296
 
222
297
  class Obj
223
- layout_array = [
224
- :type, :obj_type,
225
- :os_index, :uint,
226
- :name, :string,
227
- :memory, ObjMemory,
228
- :attr, ObjAttr.ptr,
229
- :depth, :uint,
230
- :logical_index, :uint,
231
- :os_level, :int,
232
- :next_cousin, Obj.ptr,
233
- :prev_cousin, Obj.ptr,
234
- :parent, Obj.ptr,
235
- :sibling_rank, :uint,
236
- :next_sibling, Obj.ptr,
237
- :prev_sibling, Obj.ptr,
238
- :arity, :uint,
239
- :children, :pointer,
240
- :first_child, Obj.ptr,
241
- :last_child, Obj.ptr,
242
- :user_data, :pointer,
243
- :cpuset, :cpuset,
244
- :complete_cpuset, :cpuset,
245
- :online_cpuset, :cpuset,
246
- :allowed_cpuset, :cpuset,
247
- :nodeset, :nodeset,
248
- :complete_nodeset, :nodeset,
249
- :allowed_nodeset, :nodeset,
250
- :distances, :pointer,
251
- :distances_count, :uint,
252
- :infos, :pointer,
253
- :infos_count, :uint,
254
- :symmetric_subtree,:int
255
- ]
298
+ if API_VERSION < API_VERSION_2_0 then
299
+ layout_array = [
300
+ :type, :obj_type,
301
+ :os_index, :uint,
302
+ :name, :string,
303
+ :memory, ObjMemory,
304
+ :attr, ObjAttr.ptr,
305
+ :depth, :uint,
306
+ :logical_index, :uint,
307
+ :os_level, :int,
308
+ :next_cousin, Obj.ptr,
309
+ :prev_cousin, Obj.ptr,
310
+ :parent, Obj.ptr,
311
+ :sibling_rank, :uint,
312
+ :next_sibling, Obj.ptr,
313
+ :prev_sibling, Obj.ptr,
314
+ :arity, :uint,
315
+ :children, :pointer,
316
+ :first_child, Obj.ptr,
317
+ :last_child, Obj.ptr,
318
+ :user_data, :pointer,
319
+ :cpuset, :cpuset,
320
+ :complete_cpuset, :cpuset,
321
+ :online_cpuset, :cpuset,
322
+ :allowed_cpuset, :cpuset,
323
+ :nodeset, :nodeset,
324
+ :complete_nodeset, :nodeset,
325
+ :allowed_nodeset, :nodeset,
326
+ :distances, :pointer,
327
+ :distances_count, :uint,
328
+ :infos, :pointer,
329
+ :infos_count, :uint,
330
+ :symmetric_subtree,:int
331
+ ]
332
+ else
333
+ layout_array = [
334
+ :type, :obj_type,
335
+ :subtype, :string,
336
+ :os_index, :uint,
337
+ :name, :string,
338
+ :memory, ObjMemory,
339
+ :attr, ObjAttr.ptr,
340
+ :depth, :uint,
341
+ :logical_index, :uint,
342
+ :next_cousin, Obj.ptr,
343
+ :prev_cousin, Obj.ptr,
344
+ :parent, Obj.ptr,
345
+ :sibling_rank, :uint,
346
+ :next_sibling, Obj.ptr,
347
+ :prev_sibling, Obj.ptr,
348
+ :arity, :uint,
349
+ :children, :pointer,
350
+ :first_child, Obj.ptr,
351
+ :last_child, Obj.ptr,
352
+ :symmetric_subtree,:int,
353
+ :io_arity, :uint,
354
+ :io_first_child, Obj.ptr,
355
+ :misc_arity, :uint,
356
+ :misc_first_child, Obj.ptr,
357
+ :cpuset, :cpuset,
358
+ :complete_cpuset, :cpuset,
359
+ :allowed_cpuset, :cpuset,
360
+ :nodeset, :nodeset,
361
+ :complete_nodeset, :nodeset,
362
+ :allowed_nodeset, :nodeset,
363
+ :infos, :pointer,
364
+ :infos_count, :uint,
365
+ :user_data, :pointer,
366
+ :gp_index, :uint64
367
+ ]
368
+ end
256
369
 
257
370
  layout *layout_array
258
371
 
@@ -267,7 +380,16 @@ module Hwloc
267
380
  return str_ptr.read_string
268
381
  end
269
382
 
270
- alias type_name type_snprintf
383
+ if API_VERSION < API_VERSION_2_0 then
384
+ def type_string
385
+ return Hwloc.hwloc_obj_type_string(type)
386
+ end
387
+ alias type_name type_string
388
+ else
389
+ def type_name
390
+ return Hwloc.hwloc_type_name(type)
391
+ end
392
+ end
271
393
 
272
394
  def attr_snprintf(verbose=0, separator=",")
273
395
  sz = Hwloc.hwloc_obj_attr_snprintf(nil, 0, self, separator, verbose) + 1
@@ -330,6 +452,83 @@ module Hwloc
330
452
  return children.each(*args, &block)
331
453
  end
332
454
 
455
+ if API_VERSION < API_VERSION_2_0 then
456
+ def each_obj(&block)
457
+ if block then
458
+ block.call self
459
+ children.each { |c|
460
+ c.each_obj(&block)
461
+ }
462
+ return self
463
+ else
464
+ to_enum(:each_obj)
465
+ end
466
+ end
467
+
468
+ def each_descendant(&block)
469
+ if block then
470
+ children.each { |c|
471
+ c.each_obj(&block)
472
+ }
473
+ else
474
+ to_enum(:each_descendant)
475
+ end
476
+ end
477
+
478
+ else
479
+
480
+ def io_children
481
+ return [] if io_arity == 0
482
+ c = []
483
+ c.push( io_first_child )
484
+ (io_arity-1).times {
485
+ c.push( c[-1].next_sibling )
486
+ }
487
+ return c
488
+ end
489
+
490
+ def each_io_child(*args, &block)
491
+ return io_children.each(*args, &block)
492
+ end
493
+
494
+ def misc_children
495
+ return [] if misc_arity == 0
496
+ c = []
497
+ c.push( misc_first_child )
498
+ (misc_arity-1).times {
499
+ c.push( c[-1].next_sibling )
500
+ }
501
+ return c
502
+ end
503
+
504
+ def each_misc_child(*args, &block)
505
+ return misc_children.each(*args, &block)
506
+ end
507
+
508
+ def each_obj(&block)
509
+ if block then
510
+ block.call self
511
+ (children+io_children+misc_children).each { |c|
512
+ c.each_obj(&block)
513
+ }
514
+ return self
515
+ else
516
+ to_enum(:each_obj)
517
+ end
518
+ end
519
+
520
+ def each_descendant(&block)
521
+ if block then
522
+ (children+io_children+misc_children).each { |c|
523
+ c.each_obj(&block)
524
+ }
525
+ else
526
+ to_enum(:each_descendant)
527
+ end
528
+ end
529
+
530
+ end
531
+
333
532
  def each_parent(&block)
334
533
  if block then
335
534
  if parent then
@@ -349,44 +548,24 @@ module Hwloc
349
548
  alias ancestors parents
350
549
  alias each_ancestor each_parent
351
550
 
352
- def each_obj(&block)
353
- if block then
354
- block.call self
355
- children.each { |c|
356
- c.each_obj(&block)
357
- }
358
- return self
359
- else
360
- to_enum(:each_obj)
361
- end
362
- end
363
-
364
551
  alias traverse each_obj
365
552
 
366
- def each_descendant
367
- if block then
368
- children.each { |c|
369
- c.each_obj(&block)
370
- }
371
- else
372
- to_enum(:each_descendant)
373
- end
374
- end
375
-
376
553
  def descendants
377
554
  return each_descendant.to_a
378
555
  end
379
556
 
380
- def distances
381
- distances_count = self[:distances_count]
382
- if distances_count == 0 then
383
- return []
384
- else
385
- return self[:distances].read_array_of_pointer(distances_count).collect { |p|
386
- d = Distances::new(p)
387
- d.instance_variable_set(:@topology, @topology)
388
- d
389
- }
557
+ if API_VERSION < API_VERSION_2_0 then
558
+ def distances
559
+ distances_count = self[:distances_count]
560
+ if distances_count == 0 then
561
+ return []
562
+ else
563
+ return self[:distances].read_array_of_pointer(distances_count).collect { |p|
564
+ d = Distances::new(p)
565
+ d.instance_variable_set(:@topology, @topology)
566
+ d
567
+ }
568
+ end
390
569
  end
391
570
  end
392
571
 
@@ -413,8 +592,6 @@ module Hwloc
413
592
  return nil if at.to_ptr.null?
414
593
  t = self[:type]
415
594
  case t
416
- when :OBJ_CACHE
417
- return at[:cache]
418
595
  when :OBJ_GROUP
419
596
  return at[:group]
420
597
  when :OBJ_PCI_DEVICE
@@ -423,10 +600,26 @@ module Hwloc
423
600
  return at[:bridge]
424
601
  when :OBJ_OS_DEVICE
425
602
  return at[:osdev]
603
+ else
604
+ return at[:cache] if self.is_a_cache?
426
605
  end
427
606
  return nil
428
607
  end
429
608
 
609
+ ObjType.symbols[0..-1].each { |sym|
610
+ suffix = sym.to_s[4..-1].downcase
611
+ methname = "is_a_#{suffix}?"
612
+ define_method(methname) {
613
+ return type == sym
614
+ }
615
+ }
616
+
617
+ if API_VERSION >= API_VERSION_2_0 then
618
+ def is_a_cache?
619
+ (Hwloc::OBJ_L1CACHE..Hwloc::OBJ_L3ICACHE).include?(ObjType[type])
620
+ end
621
+ end
622
+
430
623
  end
431
624
 
432
625
  end
@@ -27,22 +27,27 @@ module Hwloc
27
27
  end
28
28
 
29
29
  class TopologyMemSupport < BoolStruct
30
- layout :set_thisproc_membind, :uchar,
31
- :get_thisproc_membind, :uchar,
32
- :set_proc_membind, :uchar,
33
- :get_proc_membind, :uchar,
34
- :set_thisthread_membind, :uchar,
35
- :get_thisthread_membind, :uchar,
36
- :set_area_membind, :uchar,
37
- :get_area_membind, :uchar,
38
- :alloc_membind, :uchar,
39
- :firsttouch_membind, :uchar,
40
- :bind_membind, :uchar,
41
- :interleave_membind, :uchar,
42
- :replicate_membind, :uchar,
43
- :nexttouch_membind, :uchar,
44
- :migrate_membind, :uchar,
45
- :get_area_memlocation, :uchar
30
+ topology_mem_support_layout = [
31
+ :set_thisproc_membind, :uchar,
32
+ :get_thisproc_membind, :uchar,
33
+ :set_proc_membind, :uchar,
34
+ :get_proc_membind, :uchar,
35
+ :set_thisthread_membind, :uchar,
36
+ :get_thisthread_membind, :uchar,
37
+ :set_area_membind, :uchar,
38
+ :get_area_membind, :uchar,
39
+ :alloc_membind, :uchar,
40
+ :firsttouch_membind, :uchar,
41
+ :bind_membind, :uchar,
42
+ :interleave_membind, :uchar
43
+ ]
44
+ topology_mem_support_layout.push(:replicate_membind, :uchar) if API_VERSION < API_VERSION_2_0
45
+ topology_mem_support_layout += [
46
+ :nexttouch_membind, :uchar,
47
+ :migrate_membind, :uchar,
48
+ :get_area_memlocation, :uchar
49
+ ]
50
+ layout( *topology_mem_support_layout )
46
51
  end
47
52
 
48
53
  class TopologySupport < Struct
@@ -61,33 +66,46 @@ module Hwloc
61
66
  attach_function :hwloc_topology_dup, [:pointer, :topology], :int
62
67
  attach_function :hwloc_topology_check, [:topology], :void
63
68
 
64
- attach_function :hwloc_topology_ignore_type, [:topology, :obj_type], :int
65
- attach_function :hwloc_topology_ignore_type_keep_structure, [:topology, :obj_type], :int
66
- attach_function :hwloc_topology_ignore_all_keep_structure, [:topology], :int
67
-
68
- TopologyFlags = enum( FFI::find_type(:ulong), :topology_flags, [
69
- :TOPOLOGY_FLAG_WHOLE_SYSTEM, 1<<0,
70
- :TOPOLOGY_FLAG_IS_THISSYSTEM, 1<<1,
71
- :TOPOLOGY_FLAG_IO_DEVICES, 1<<2,
72
- :TOPOLOGY_FLAG_IO_BRIDGES, 1<<3,
73
- :TOPOLOGY_FLAG_WHOLE_IO, 1<<4,
74
- :TOPOLOGY_FLAG_ICACHES, 1<<5
75
- ] )
69
+ if API_VERSION < API_VERSION_2_0 then
70
+ TopologyFlags = enum( FFI::find_type(:ulong), :topology_flags, [
71
+ :TOPOLOGY_FLAG_WHOLE_SYSTEM, 1<<0,
72
+ :TOPOLOGY_FLAG_IS_THISSYSTEM, 1<<1,
73
+ :TOPOLOGY_FLAG_IO_DEVICES, 1<<2,
74
+ :TOPOLOGY_FLAG_IO_BRIDGES, 1<<3,
75
+ :TOPOLOGY_FLAG_WHOLE_IO, 1<<4,
76
+ :TOPOLOGY_FLAG_ICACHES, 1<<5
77
+ ] )
78
+ else
79
+ TopologyFlags = enum( FFI::find_type(:ulong), :topology_flags, [
80
+ :TOPOLOGY_FLAG_WHOLE_SYSTEM, 1<<0,
81
+ :TOPOLOGY_FLAG_IS_THISSYSTEM, 1<<1,
82
+ :TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES, 1<<2
83
+ ] )
84
+ end
76
85
 
77
86
  attach_function :hwloc_topology_set_flags, [:topology, :ulong], :int
78
87
  attach_function :hwloc_topology_get_flags, [:topology], :ulong
79
88
 
80
89
  attach_function :hwloc_topology_set_pid, [:topology, :hwloc_pid_t], :int
81
- attach_function :hwloc_topology_set_fsroot, [:topology, :string], :int
90
+ if API_VERSION < API_VERSION_2_0 then
91
+ attach_function :hwloc_topology_set_fsroot, [:topology, :string], :int
92
+ end
82
93
  attach_function :hwloc_topology_set_synthetic, [:topology, :string], :int
83
94
  attach_function :hwloc_topology_set_xml, [:topology, :string], :int
84
95
  attach_function :hwloc_topology_set_xmlbuffer, [:topology, :pointer, :size_t], :int
85
- attach_function :hwloc_topology_set_custom, [:topology], :int
86
- attach_function :hwloc_topology_set_distance_matrix, [:topology, :obj_type, :uint, :pointer, :pointer], :int
96
+ if API_VERSION < API_VERSION_2_0 then
97
+ attach_function :hwloc_topology_set_custom, [:topology], :int
98
+ attach_function :hwloc_topology_set_distance_matrix, [:topology, :obj_type, :uint, :pointer, :pointer], :int
99
+ else
100
+ attach_function :hwloc_distances_get, [:topology, :pointer, :pointer, :ulong, :ulong], :int
101
+ attach_function :hwloc_distances_get_by_depth, [:topology, :uint, :pointer, :pointer, :ulong, :ulong], :int
102
+ attach_function :hwloc_distances_release, [:topology, Distances.ptr], :void
103
+ attach_function :hwloc_distances_add, [:topology, :uint, :pointer, :pointer, :ulong, :ulong], :int
104
+ attach_function :hwloc_distances_remove, [:topology], :int
105
+ attach_function :hwloc_distances_remove_by_depth, [:topology, :uint], :int
106
+ end
87
107
  attach_function :hwloc_topology_is_thissystem, [:topology], :int
88
-
89
108
  attach_function :hwloc_topology_get_support, [:topology], TopologySupport.ptr
90
-
91
109
  attach_function :hwloc_topology_get_depth, [:topology], :uint
92
110
 
93
111
  GetTypeDepth = enum(:get_type_depth, [
@@ -96,7 +114,7 @@ module Hwloc
96
114
  :TYPE_DEPTH_BRIDGE, -3,
97
115
  :TYPE_DEPTH_PCI_DEVICE, -4,
98
116
  :TYPE_DEPTH_OS_DEVICE, -5
99
- ] )
117
+ ] + ( API_VERSION >= API_VERSION_2_0 ? [ :TYPE_DEPTH_MISC, -6 ] : [] ) )
100
118
 
101
119
  attach_function :hwloc_get_type_depth, [:topology, :obj_type], :int
102
120
  attach_function :hwloc_get_depth_type, [:topology, :uint], :obj_type
@@ -104,6 +122,22 @@ module Hwloc
104
122
 
105
123
  attach_function :hwloc_get_obj_by_depth, [:topology, :uint, :uint], Obj.ptr
106
124
 
125
+ if API_VERSION < API_VERSION_2_0 then
126
+ attach_function :hwloc_topology_ignore_type, [:topology, :obj_type], :int
127
+ attach_function :hwloc_topology_ignore_type_keep_structure, [:topology, :obj_type], :int
128
+ attach_function :hwloc_topology_ignore_all_keep_structure, [:topology], :int
129
+ else
130
+ TypeFilter = enum(:type_filter, [
131
+ :TYPE_FILTER_KEEP_ALL, 0,
132
+ :TYPE_FILTER_KEEP_NONE, 1,
133
+ :TYPE_FILTER_KEEP_STRUCTURE, 2,
134
+ :TYPE_FILTER_KEEP_IMPORTANT, 3
135
+ ] )
136
+ attach_function :hwloc_topology_set_type_filter, [:topology, :obj_type, :type_filter], :int
137
+ attach_function :hwloc_topology_get_type_filter, [:topology, :obj_type, :pointer], :int
138
+ attach_function :hwloc_topology_set_all_types_filter, [:topology, :type_filter], :int
139
+ end
140
+
107
141
  end
108
142
 
109
143
  module Hwloc
@@ -167,21 +201,76 @@ module Hwloc
167
201
  return self
168
202
  end
169
203
 
170
- def ignore_type(type)
171
- err = Hwloc.hwloc_topology_ignore_type(@ptr, type)
172
- raise TopologyError if err == -1
173
- return self
174
- end
175
-
176
- def ignore_type_keep_structure(type)
177
- if type == :all then
178
- err = Hwloc.hwloc_topology_ignore_all_keep_structure(@ptr)
204
+ if API_VERSION < API_VERSION_2_0 then
205
+ def ignore_type(type)
206
+ err = Hwloc.hwloc_topology_ignore_type(@ptr, type)
179
207
  raise TopologyError if err == -1
180
- else
181
- err = Hwloc.hwloc_topology_ignore_type_keep_structure(@ptr, type)
208
+ return self
209
+ end
210
+
211
+ def ignore_type_keep_structure(type)
212
+ if type == :all then
213
+ err = Hwloc.hwloc_topology_ignore_all_keep_structure(@ptr)
214
+ raise TopologyError if err == -1
215
+ else
216
+ err = Hwloc.hwloc_topology_ignore_type_keep_structure(@ptr, type)
217
+ raise TopologyError if err == -1
218
+ end
219
+ return self
220
+ end
221
+ else
222
+ def set_type_filter(type, filter)
223
+ if type == :all then
224
+ err = Hwloc.hwloc_topology_set_all_types_filter(@ptr, filter)
225
+ raise TopologyError if err == -1
226
+ else
227
+ err = Hwloc.hwloc_topology_set_type_filter(@ptr, type, filter)
228
+ raise TopologyError if err == -1
229
+ end
230
+ return self
231
+ end
232
+
233
+ def set_all_types_filter(filter)
234
+ return set_type_filter(:all, filter)
235
+ end
236
+
237
+ def get_type_filter(type)
238
+ filter_p = FFI::MemoryPointer::new(TypeFilter.native_type)
239
+ err = Hwloc.hwloc_topology_get_type_filter(@ptr, type, filter_p)
182
240
  raise TopologyError if err == -1
241
+ filter = filter_p.read_int
242
+ return TypeFilter[filter]
243
+ end
244
+
245
+ def set_cache_types_filter(filter)
246
+ (Hwloc::OBJ_L1CACHE..Hwloc::OBJ_L3ICACHE).each { |cl|
247
+ set_type_filter(cl, filter)
248
+ }
249
+ return self
250
+ end
251
+
252
+ def set_icache_types_filter(filter)
253
+ (Hwloc::OBJ_L1ICACHE..Hwloc::OBJ_L3ICACHE).each { |cl|
254
+ set_type_filter(cl, filter)
255
+ }
256
+ return self
257
+ end
258
+
259
+ def set_io_types_filter(filter)
260
+ set_type_filter(Hwloc::OBJ_MISC, filter)
261
+ set_type_filter(Hwloc::OBJ_BRIDGE, filter)
262
+ set_type_filter(Hwloc::OBJ_PCI_DEVICE, filter)
263
+ set_type_filter(Hwloc::OBJ_OS_DEVICE, filter)
264
+ return self
265
+ end
266
+
267
+ def ignore_type(type)
268
+ return set_type_filter(type, Hwloc::TYPE_FILTER_KEEP_NONE)
269
+ end
270
+
271
+ def ignore_type_keep_structure(type)
272
+ set_type_filter(type, Hwloc::TYPE_FILTER_KEEP_STRUCTURE)
183
273
  end
184
- return self
185
274
  end
186
275
 
187
276
  def set_flags(flags)
@@ -204,10 +293,12 @@ module Hwloc
204
293
  return self
205
294
  end
206
295
 
207
- def set_fsroot(fsroot_path)
208
- err = Hwloc.hwloc_topology_set_fsroot(@ptr, fsroot_path)
209
- raise TopologyError if err == -1
210
- return self
296
+ if API_VERSION < API_VERSION_2_0 then
297
+ def set_fsroot(fsroot_path)
298
+ err = Hwloc.hwloc_topology_set_fsroot(@ptr, fsroot_path)
299
+ raise TopologyError if err == -1
300
+ return self
301
+ end
211
302
  end
212
303
 
213
304
  def set_synthetic(description)
@@ -228,10 +319,12 @@ module Hwloc
228
319
  return self
229
320
  end
230
321
 
231
- def set_custom
232
- err = Hwloc.hwloc_topology_set_custom(@ptr)
233
- raise TopologyError if err == -1
234
- return self
322
+ if API_VERSION < API_VERSION_2_0 then
323
+ def set_custom
324
+ err = Hwloc.hwloc_topology_set_custom(@ptr)
325
+ raise TopologyError if err == -1
326
+ return self
327
+ end
235
328
  end
236
329
 
237
330
  ## Will need some work to define properly...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hwloc
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brice Videau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-06 00:00:00.000000000 Z
11
+ date: 2017-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi