hwloc 0.3.1 → 0.3.2

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
- 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