hwloc 0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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