hwloc 0.3.1 → 0.3.2

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
- SHA1:
3
- metadata.gz: f89b0959a676f9e73b6106c10b5e01e3d8aaf481
4
- data.tar.gz: 2c62e5c5a50b74ca18606641080c7f5b6ddd19c8
2
+ SHA256:
3
+ metadata.gz: da58c0475ef675dc9333d71319fa2224a40f60faef278163bbfa63b85827ab46
4
+ data.tar.gz: 1ab3eb8ec7c39586d3a60198995cce73027c056d1199db8e4175180362b85a9d
5
5
  SHA512:
6
- metadata.gz: 7a3701dac946fe6d69f99c1ea953879adfa189641f2ddd9c19496e06d7256dd9f8e63a89217bbdc0eda07cc377c4d03a6a741c5ebcbf4e49e49c7558671c4172
7
- data.tar.gz: 90d9f7f805ed738b199ee2e82662303f7ef5633f077d38b388fa98d8f5d98f3f3366a32905de92841b3422c731da215aba6f132e39c84dfe1c6cc7e203bda48e
6
+ metadata.gz: ef53f35ef86622c63c20ff1f787d8f0dc71ca395009c226886185683afec6c616887ee2f5a4532cc90ea31fa26ae8be20085040f03d63c3d73934ca25efd7e5c
7
+ data.tar.gz: 3a91c268149748eeac76b9ff40787cb685e28e60dae668e61d3cd3d1f81b2a12cd4e82fe05efcf182dc10e15e64fc155193a67318176288f1e31c215c14a5974
@@ -1,13 +1,12 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'hwloc'
3
- s.version = "0.3.1"
3
+ s.version = "0.3.2"
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"
7
7
  s.summary = "hwloc ruby bindings"
8
8
  s.description = "hwloc ruby bindings for versions 1.10 onward"
9
9
  s.files = Dir['hwloc.gemspec', 'LICENSE', 'README.md', 'lib/**/*']
10
- s.has_rdoc = false
11
10
  s.license = 'BSD-2-Clause'
12
11
  s.required_ruby_version = '>= 1.9.3'
13
12
  s.add_dependency 'ffi', '~> 1.9', '>=1.9.3'
@@ -147,6 +147,7 @@ module Hwloc
147
147
  class Topology
148
148
 
149
149
  if API_VERSION < API_VERSION_2_0 then
150
+
150
151
  def set_membind_nodeset(nodeset, policy, *flags)
151
152
  err = Hwloc.hwloc_set_membind_nodeset(@ptr, nodeset, policy, flags)
152
153
  raise MembindError if err == -1
@@ -210,6 +211,51 @@ module Hwloc
210
211
  end
211
212
  end
212
213
 
214
+ else
215
+
216
+ def set_membind_nodeset(nodeset, policy, *flags)
217
+ flags.push :MEMBIND_BYNODESET
218
+ set_membind(nodeset, policy, *flags)
219
+ return self
220
+ end
221
+
222
+ def get_membind_nodeset(*flags)
223
+ flags.push :MEMBIND_BYNODESET
224
+ get_membind(*flags)
225
+ end
226
+
227
+ def set_proc_membind_nodeset(pid, nodeset, policy, *flags)
228
+ flags.push :MEMBIND_BYNODESET
229
+ set_proc_membind(pid, nodeset, policy, flags)
230
+ return self
231
+ end
232
+
233
+ def get_proc_membind_nodeset(pid, *flags)
234
+ flags.push :MEMBIND_BYNODESET
235
+ get_proc_membind(pid, *flags)
236
+ end
237
+
238
+ def set_area_membind_nodeset(pointer, nodeset, policy, *flags)
239
+ flags.push :MEMBIND_BYNODESET
240
+ set_area_membind(pointer, nodeset, policy, *flags)
241
+ return self
242
+ end
243
+
244
+ def get_area_membind_nodeset(pointer, *flags)
245
+ flags.push :MEMBIND_BYNODESET
246
+ get_area_membind(pointer, *flags)
247
+ end
248
+
249
+ def alloc_membind_nodeset(size, nodeset, policy, *flags)
250
+ flags.push :MEMBIND_BYNODESET
251
+ alloc_membind(size, nodeset, policy, *flags)
252
+ end
253
+
254
+ def alloc_membind_policy_nodeset(size, nodeset, policy, *flags)
255
+ flags.push :MEMBIND_BYNODESET
256
+ alloc_membind_policy_nodeset(size, nodeset, policy, *flags)
257
+ end
258
+
213
259
  end
214
260
 
215
261
  def set_membind(set, policy, *flags)
@@ -113,11 +113,15 @@ module Hwloc
113
113
  s_ptr.read_string
114
114
  end
115
115
 
116
- def to_a
116
+ def list_to_s
117
117
  size = Hwloc.hwloc_bitmap_list_snprintf(nil, 0, @ptr)
118
118
  s_ptr = FFI::MemoryPointer::new(size+1)
119
119
  Hwloc.hwloc_bitmap_list_snprintf(s_ptr, size+1, @ptr)
120
- str = s_ptr.read_string
120
+ s_ptr.read_string
121
+ end
122
+
123
+ def to_a
124
+ str = list_to_s
121
125
  str.split(",").collect { |e|
122
126
  if e.match("-") then
123
127
  rgs = e.split("-")
@@ -1,3 +1,5 @@
1
+ require 'stringio'
2
+
1
3
  module Hwloc
2
4
 
3
5
  if API_VERSION < API_VERSION_2_0 then
@@ -66,6 +68,15 @@ module Hwloc
66
68
  end
67
69
  end
68
70
 
71
+ def to_xml(flags = 0)
72
+ a = if API_VERSION >= API_VERSION_2_0
73
+ export_xmlbuffer(flags)
74
+ else
75
+ export_xmlbuffer
76
+ end
77
+ a.read_string
78
+ end
79
+
69
80
  def free_xmlbuffer(pointer)
70
81
  Hwloc.hwloc_free_xmlbuffer(@self, pointer)
71
82
  end
@@ -3,8 +3,12 @@ require 'ffi/bitmask'
3
3
 
4
4
  module Hwloc
5
5
  extend FFI::Library
6
- ffi_lib 'hwloc'
7
6
 
7
+ if ENV['HWLOC_LIBRARY_PATH']
8
+ ffi_lib ENV['HWLOC_LIBRARY_PATH']
9
+ else
10
+ ffi_lib 'hwloc'
11
+ end
8
12
  attach_function :hwloc_get_api_version, [], :uint
9
13
 
10
14
  API_VERSION = Hwloc.hwloc_get_api_version
@@ -3,42 +3,32 @@ module Hwloc
3
3
  class ObjError < Error
4
4
  end
5
5
 
6
- obj_types = [
7
- :OBJ_SYSTEM,
8
- :OBJ_MACHINE,
9
- :OBJ_NUMANODE,
10
- :OBJ_PACKAGE
11
- ]
12
- obj_types.push :OBJ_CACHE if API_VERSION < API_VERSION_2_0
13
- obj_types += [
14
- :OBJ_CORE,
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
- ]
6
+ attach_function :hwloc_obj_type_string, [:int], :string
7
+
8
+ obj_types = []
9
+
10
+ i = 0
11
+ loop do
12
+ str = Hwloc.hwloc_obj_type_string(i)
13
+ break if str == "Unknown"
14
+ obj_types.push :"OBJ_#{str.upcase.gsub("PCIDEV", "PCI_DEVICE").gsub("OSDEV", "OS_DEVICE")}"
15
+ i += 1
28
16
  end
29
- obj_types += [
30
- :OBJ_GROUP,
31
- :OBJ_MISC,
32
- :OBJ_BRIDGE,
33
- :OBJ_PCI_DEVICE,
34
- :OBJ_OS_DEVICE,
35
- :OBJ_TYPE_MAX
36
- ]
37
17
 
38
18
  ObjType = enum( :obj_type, obj_types )
39
19
 
20
+ attach_function :hwloc_obj_type_string, [:obj_type], :string
40
21
  attach_function :hwloc_compare_types, [:obj_type, :obj_type], :int
41
22
 
23
+ if API_VERSION >= API_VERSION_2_0 then
24
+ attach_function :hwloc_obj_type_is_normal, [:obj_type], :int
25
+ attach_function :hwloc_obj_type_is_io, [:obj_type], :int
26
+ attach_function :hwloc_obj_type_is_memory, [:obj_type], :int
27
+ attach_function :hwloc_obj_type_is_cache, [:obj_type], :int
28
+ attach_function :hwloc_obj_type_is_dcache, [:obj_type], :int
29
+ attach_function :hwloc_obj_type_is_icache, [:obj_type], :int
30
+ end
31
+
42
32
  def self.compare_types(type1, type2)
43
33
  return Hwloc.hwloc_compare_types(type1, type2)
44
34
  end
@@ -144,9 +134,9 @@ module Hwloc
144
134
  :DISTANCES_KIND_MEANS_BANDWIDTH
145
135
  ])
146
136
 
147
- DistancesFlag = bitmask(FFI::find_type(:ulong), :distances_flag, [
148
- :DISTANCES_FLAG_GROUP,
149
- :DISTANCES_FLAG_GROUP_INACCURATE
137
+ DistancesAddFlag = bitmask(FFI::find_type(:ulong), :distances_add_flag, [
138
+ :DISTANCES_ADD_FLAG_GROUP,
139
+ :DISTANCES_ADD_FLAG_GROUP_INACCURATE
150
140
  ])
151
141
 
152
142
  class Distances < Struct
@@ -157,26 +147,42 @@ module Hwloc
157
147
 
158
148
  def objs
159
149
  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
150
+ return [] if arity == 0
151
+ return self[:objs].read_array_of_pointer(arity).collect { |p|
152
+ c = Obj::new(p)
153
+ c.instance_variable_set(:@topology, @topology)
154
+ c
155
+ }
156
+ end
157
+
158
+ def kind
159
+ self[:kind]
169
160
  end
170
161
 
171
162
  def values
172
163
  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
164
+ return [] if arity == 0
165
+ return self[:values].read_array_of_uint64(arity*arity).each_slice(arity).to_a
166
+ end
167
+
168
+ def self.release(ptr)
169
+ Hwloc.hwloc_distances_release(@topology.ptr, ptr)
179
170
  end
171
+
172
+ def obj_index(obj)
173
+ arity = self[:nbobjs]
174
+ return nil if arity == 0
175
+ self[:objs].read_array_of_pointer(arity).index(obj.to_ptr)
176
+ end
177
+
178
+ def obj_pair_values(obj1, obj2)
179
+ i1 = obj_index(obj1)
180
+ i2 = obj_index(obj2)
181
+ return nil unless i1 && i2
182
+ v = values
183
+ return [v[i1][i2], v[i2][i1]]
184
+ end
185
+
180
186
  end
181
187
  end
182
188
 
@@ -213,6 +219,20 @@ module Hwloc
213
219
  end
214
220
  end
215
221
 
222
+ class NumanodeAttr < Struct
223
+ layout :local_memory, :uint64,
224
+ :page_types_len, :uint,
225
+ :page_types, :pointer
226
+ def page_types
227
+ page_types_ptr = self[:page_types]
228
+ return page_types_len.times.collect { |i|
229
+ pt = ObjMemoryPageType::new(page_types_ptr+i*ObjMemoryPageType.size)
230
+ pt.instance_variable_set(:@topology, @topology)
231
+ pt
232
+ }
233
+ end
234
+ end
235
+
216
236
  class CacheAttr < Struct
217
237
  layout :size, :uint64,
218
238
  :depth, :uint,
@@ -276,23 +296,28 @@ module Hwloc
276
296
  end
277
297
 
278
298
  class ObjAttr < Union
279
- layout :cache, CacheAttr,
280
- :group, GroupAttr,
281
- :pcidev, PcidevAttr,
282
- :bridge, BridgeAttr,
283
- :osdev, OsdevAttr
299
+ if API_VERSION < API_VERSION_2_0 then
300
+ layout :cache, CacheAttr,
301
+ :group, GroupAttr,
302
+ :pcidev, PcidevAttr,
303
+ :bridge, BridgeAttr,
304
+ :osdev, OsdevAttr
305
+ else
306
+ layout :numanode, NumanodeAttr,
307
+ :cache, CacheAttr,
308
+ :group, GroupAttr,
309
+ :pcidev, PcidevAttr,
310
+ :bridge, BridgeAttr,
311
+ :osdev, OsdevAttr
312
+ end
284
313
  end
285
314
 
286
315
  class Obj < Struct
287
316
  end
288
317
 
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
294
318
  attach_function :hwloc_obj_type_snprintf, [:pointer, :size_t, Obj.ptr, :int], :int
295
319
  attach_function :hwloc_obj_attr_snprintf, [:pointer, :size_t, Obj.ptr, :string, :int], :int
320
+ attach_function :hwloc_obj_add_info, [Obj.ptr, :string, :string], :int
296
321
 
297
322
  class Obj
298
323
  if API_VERSION < API_VERSION_2_0 then
@@ -331,39 +356,39 @@ module Hwloc
331
356
  ]
332
357
  else
333
358
  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
359
+ :type, :obj_type,
360
+ :subtype, :string,
361
+ :os_index, :uint,
362
+ :name, :string,
363
+ :total_memory, :uint64,
364
+ :attr, ObjAttr.ptr,
365
+ :depth, :uint,
366
+ :logical_index, :uint,
367
+ :next_cousin, Obj.ptr,
368
+ :prev_cousin, Obj.ptr,
369
+ :parent, Obj.ptr,
370
+ :sibling_rank, :uint,
371
+ :next_sibling, Obj.ptr,
372
+ :prev_sibling, Obj.ptr,
373
+ :arity, :uint,
374
+ :children, :pointer,
375
+ :first_child, Obj.ptr,
376
+ :last_child, Obj.ptr,
377
+ :symmetric_subtree, :int,
378
+ :memory_arity, :uint,
379
+ :memory_first_child,Obj.ptr,
380
+ :io_arity, :uint,
381
+ :io_first_child, Obj.ptr,
382
+ :misc_arity, :uint,
383
+ :misc_first_child, Obj.ptr,
384
+ :cpuset, :cpuset,
385
+ :complete_cpuset, :cpuset,
386
+ :nodeset, :nodeset,
387
+ :complete_nodeset, :nodeset,
388
+ :infos, :pointer,
389
+ :infos_count, :uint,
390
+ :user_data, :pointer,
391
+ :gp_index, :uint64
367
392
  ]
368
393
  end
369
394
 
@@ -380,16 +405,10 @@ module Hwloc
380
405
  return str_ptr.read_string
381
406
  end
382
407
 
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
408
+ def type_string
409
+ return Hwloc.hwloc_obj_type_string(type)
392
410
  end
411
+ alias type_name type_string
393
412
 
394
413
  def attr_snprintf(verbose=0, separator=",")
395
414
  sz = Hwloc.hwloc_obj_attr_snprintf(nil, 0, self, separator, verbose) + 1
@@ -477,6 +496,20 @@ module Hwloc
477
496
 
478
497
  else
479
498
 
499
+ def memory_children
500
+ return [] if memory_arity == 0
501
+ c = []
502
+ c.push( memory_first_child )
503
+ (memory_arity-1).times {
504
+ c.push( c[-1].next_sibling )
505
+ }
506
+ return c
507
+ end
508
+
509
+ def each_memory_child(*args, &block)
510
+ return memory_children.each(*args, &block)
511
+ end
512
+
480
513
  def io_children
481
514
  return [] if io_arity == 0
482
515
  c = []
@@ -571,22 +604,27 @@ module Hwloc
571
604
 
572
605
  def infos
573
606
  infos_count = self[:infos_count]
574
- if infos_count == 0 then
575
- return []
576
- else
577
- inf_array = infos_count.times.collect { |i|
578
- o = ObjInfo::new(self[:infos] + i*ObjInfo.size)
579
- }
580
- inf_h = {}
581
- inf_array.each { |e| inf_h[e[:name].to_sym] = e[:value] }
582
- return inf_h
583
- end
607
+ return {} if infos_count == 0
608
+ inf_array = infos_count.times.collect { |i|
609
+ o = ObjInfo::new(self[:infos] + i*ObjInfo.size)
610
+ }
611
+ inf_h = {}
612
+ inf_array.each { |e| inf_h[e[:name].to_sym] = e[:value] if e[:name] }
613
+ return inf_h
584
614
  end
585
615
 
586
616
  def each_info(*args, &block)
587
617
  return infos.each(*args, &block)
588
618
  end
589
619
 
620
+ def add_infos(**dict)
621
+ dict.each { |k, v|
622
+ err = Hwloc.hwloc_obj_add_info(self, k.to_s, v.to_s)
623
+ raise EditionError if err == -1
624
+ }
625
+ self
626
+ end
627
+
590
628
  def attr
591
629
  at = self[:attr]
592
630
  return nil if at.to_ptr.null?
@@ -601,6 +639,9 @@ module Hwloc
601
639
  when :OBJ_OS_DEVICE
602
640
  return at[:osdev]
603
641
  else
642
+ if API_VERSION >= API_VERSION_2_0 then
643
+ return at[:numanode] if t == :OBJ_NUMANODE
644
+ end
604
645
  return at[:cache] if self.is_a_cache?
605
646
  end
606
647
  return nil
@@ -618,6 +659,34 @@ module Hwloc
618
659
  def is_a_cache?
619
660
  (Hwloc::OBJ_L1CACHE..Hwloc::OBJ_L3ICACHE).include?(ObjType[type])
620
661
  end
662
+
663
+ def is_normal?
664
+ Hwloc::hwloc_obj_type_is_normal(ObjType[type]) == 1
665
+ end
666
+
667
+ def is_io?
668
+ Hwloc::hwloc_obj_type_is_io(ObjType[type]) == 1
669
+ end
670
+
671
+ def is_memory?
672
+ Hwloc::hwloc_obj_type_is_memory(ObjType[type]) == 1
673
+ end
674
+
675
+ def is_cache?
676
+ Hwloc::hwloc_obj_type_is_cache(ObjType[type]) == 1
677
+ end
678
+
679
+ def is_icache?
680
+ Hwloc::hwloc_obj_type_is_icache(ObjType[type]) == 1
681
+ end
682
+
683
+ def is_dcache?
684
+ Hwloc::hwloc_obj_type_is_dcache(ObjType[type]) == 1
685
+ end
686
+
687
+ def is_misc?
688
+ ObjType[type] == Hwloc::OBJ_MISC
689
+ end
621
690
  end
622
691
 
623
692
  end
@@ -101,10 +101,10 @@ module Hwloc
101
101
  attach_function :hwloc_topology_set_custom, [:topology], :int
102
102
  attach_function :hwloc_topology_set_distance_matrix, [:topology, :obj_type, :uint, :pointer, :pointer], :int
103
103
  else
104
- attach_function :hwloc_distances_get, [:topology, :pointer, :pointer, :ulong, :ulong], :int
105
- attach_function :hwloc_distances_get_by_depth, [:topology, :uint, :pointer, :pointer, :ulong, :ulong], :int
104
+ attach_function :hwloc_distances_get, [:topology, :pointer, :pointer, :distances_kind, :ulong], :int
105
+ attach_function :hwloc_distances_get_by_depth, [:topology, :uint, :pointer, :pointer, :distances_kind, :ulong], :int
106
106
  attach_function :hwloc_distances_release, [:topology, Distances.ptr], :void
107
- attach_function :hwloc_distances_add, [:topology, :uint, :pointer, :pointer, :ulong, :ulong], :int
107
+ attach_function :hwloc_distances_add, [:topology, :uint, :pointer, :pointer, :distances_kind, :distances_add_flag], :int
108
108
  attach_function :hwloc_distances_remove, [:topology], :int
109
109
  attach_function :hwloc_distances_remove_by_depth, [:topology, :uint], :int
110
110
  end
@@ -182,6 +182,13 @@ module Hwloc
182
182
  err = Hwloc.hwloc_topology_dup(ptr, arg.ptr)
183
183
  raise TopologyError if err == -1
184
184
  @ptr = FFI::AutoPointer::new( ptr.read_pointer, Hwloc.method(:hwloc_topology_destroy) )
185
+ elsif arg.kind_of?( String ) then
186
+ ptr = FFI::MemoryPointer::new( :pointer )
187
+ err = Hwloc.hwloc_topology_init(ptr)
188
+ raise TopologyError if err == -1
189
+ @ptr = FFI::AutoPointer::new( ptr.read_pointer, Hwloc.method(:hwloc_topology_destroy) )
190
+ @xml_buffer = FFI::MemoryPointer::from_string(arg)
191
+ set_xmlbuffer(@xml_buffer)
185
192
  else
186
193
  raise TopologyError, "Invalid argument"
187
194
  end
@@ -193,6 +200,7 @@ module Hwloc
193
200
  def load
194
201
  err = Hwloc.hwloc_topology_load(@ptr)
195
202
  raise TopologyError if err == -1
203
+ @xml_buffer = nil if @xml_buffer
196
204
  return self
197
205
  end
198
206
 
@@ -446,20 +454,22 @@ module Hwloc
446
454
  end
447
455
  return self
448
456
  else
449
- return Enumerator::new do |yielder|
450
- idx = 0
451
- while o = get_obj_by_depth(depth, idx) do
452
- yielder << o
453
- idx += 1
454
- end
455
- end
457
+ to_enum(:each_by_depth, depth)
456
458
  end
457
459
  end
458
460
 
459
461
  def each_by_type(type, &block)
460
- depth = get_type_depth(type)
461
- return each_obj.select{ |e| e.type == type }.each(&block) if depth == Hwloc::TYPE_DEPTH_MULTIPLE
462
- return each_by_depth(depth, &block)
462
+ if block_given? then
463
+ depth = get_type_depth(type)
464
+ if depth == Hwloc::TYPE_DEPTH_MULTIPLE
465
+ each_obj.select{ |e| e.type == type }.each(&block)
466
+ return self
467
+ else
468
+ return each_by_depth(depth, &block)
469
+ end
470
+ else
471
+ to_enum(:each_by_type, type)
472
+ end
463
473
  end
464
474
 
465
475
  ObjType.symbols[0..-1].each { |sym|
@@ -487,6 +497,99 @@ module Hwloc
487
497
  alias traverse each_obj
488
498
  alias each each_obj
489
499
 
500
+ if API_VERSION >= API_VERSION_2_0 then
501
+
502
+ def distances_number(*kind)
503
+ res = nil
504
+ nr = FFI::MemoryPointer::new(:uint)
505
+ nr.write_uint 0
506
+ err = Hwloc.hwloc_distances_get(@ptr, nr, nil, kind, 0);
507
+ raise TopologyError if err == -1
508
+ res = nr.read_uint
509
+ res
510
+ end
511
+
512
+ def distances(*kind)
513
+ num_d = distances_number(*kind)
514
+ return [] if num_d == 0
515
+ nr = FFI::MemoryPointer::new(:uint)
516
+ nr.write_uint num_d
517
+ dis = FFI::MemoryPointer::new(:pointer, num_d)
518
+ err = Hwloc.hwloc_distances_get(@ptr, nr, dis, kind, 0);
519
+ raise TopologyError if err == -1
520
+ return dis.read_array_of_pointer(nr.read_uint).collect { |p|
521
+ d = Distances::new(p)
522
+ d.instance_variable_set(:@topology, self)
523
+ d
524
+ }
525
+ end
526
+
527
+ def distances_by_depth(depth, *kind)
528
+ nr = FFI::MemoryPointer::new(:uint)
529
+ nr.write_uint 0
530
+ err = Hwloc.hwloc_distances_get_by_depth(@ptr, depth, nr, nil, kind, 0);
531
+ raise TopologyError if err == -1
532
+ num_d = nr.read_uint
533
+ return [] if num_d == 0
534
+ dis = FFI::MemoryPointer::new(:pointer, num_d)
535
+ err = Hwloc.hwloc_distances_get_by_depth(@ptr, depth, nr, dis, kind, 0);
536
+ return dis.read_array_of_pointer(nr.read_uint).collect { |p|
537
+ d = Distances::new(p)
538
+ d.instance_variable_set(:@topology, self)
539
+ d
540
+ }
541
+ end
542
+
543
+ def distances_by_type(type, *kind)
544
+ depth = get_type_depth(type)
545
+ return [] if depth == Hwloc::TYPE_DEPTH_UNKNOWN
546
+ if depth == Hwloc::TYPE_DEPTH_MULTIPLE then
547
+ depth_list = each_obj.select{ |e| e.type == type }.collect{ |e| e.depth }.uniq
548
+ res = depth_list.collect { |d| distances_by_depth(d, *kind) }.reduce(:+)
549
+ return [] unless res
550
+ return res
551
+ end
552
+ return distances_by_depth(depth, *kind)
553
+ end
554
+
555
+ def distances_add(objs, values, *kind, flags: [])
556
+ nbobjs = objs.size
557
+ vals = values.flatten
558
+ raise TopologyError if vals.length != nbobjs * nbobjs
559
+ vals_p = FFI::MemoryPointer::new(:uint64, vals.length)
560
+ vals_p.write_array_of_uint64(vals)
561
+ objs_p = FFI::MemoryPointer::new(:pointer, objs.length)
562
+ objs_p.write_array_of_pointer(objs.collect(&:to_ptr))
563
+ err = Hwloc.hwloc_distances_add(@ptr, nbobjs, objs_p, vals_p, kind, flags)
564
+ raise TopologyError if err == -1
565
+ self
566
+ end
567
+
568
+ def distances_remove
569
+ err = Hwloc.hwloc_distances_remove(@ptr)
570
+ raise TopologyError if err == -1
571
+ self
572
+ end
573
+
574
+ def distances_remove_by_depth(depth)
575
+ err = Hwloc.hwloc_distances_remove_by_depth(@ptr, depth)
576
+ raise TopologyError if err == -1
577
+ self
578
+ end
579
+
580
+ def distances_remove_by_type(type)
581
+ depth = get_type_depth(type)
582
+ return self if depth == Hwloc::TYPE_DEPTH_UNKNOWN
583
+ if depth == Hwloc::TYPE_DEPTH_MULTIPLE then
584
+ depth_list = each_obj.select{ |e| e.type == type }.collect{ |e| e.depth }.uniq
585
+ depth_list.each { |d| distances_remove_by_depth(d) }
586
+ return self
587
+ end
588
+ return distances_remove_by_depth(depth)
589
+ end
590
+
591
+ end
592
+
490
593
  end
491
594
 
492
595
  end
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.3.1
4
+ version: 0.3.2
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-05-29 00:00:00.000000000 Z
11
+ date: 2020-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -86,8 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  - !ruby/object:Gem::Version
87
87
  version: '0'
88
88
  requirements: []
89
- rubyforge_project:
90
- rubygems_version: 2.5.2
89
+ rubygems_version: 3.1.2
91
90
  signing_key:
92
91
  specification_version: 4
93
92
  summary: hwloc ruby bindings