babeltrace2 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: b661027d46180b1a162ce91aad9ad783e5700abc1182199408d19c61410f2df6
4
- data.tar.gz: 9f207749e36ecf12c8e0aae0b54749f967e1aa9830b4bf38b72eac47d1443017
3
+ metadata.gz: 30c884954dad0ab10697ad6131778122c6b91e54334993c10f6ac8d62e99b46b
4
+ data.tar.gz: a0badd8fced31e5be2a69ad1dded4196964a52ab1a2865895001ea37011d6ebc
5
5
  SHA512:
6
- metadata.gz: b5b73639f60a15169307c2c52708478211e445298a294d98bc745ee364c2a009e4a320008c58fac46b3408483ef487869b8a77d88f45e91f8d77d3cd140c960e
7
- data.tar.gz: feb554583fb6ad8e3ac8c80f148a44fe497295167891f0bac620933848b4f8b36c5d57d5751dca613fcabc427c012913c7699f856d3f46c0467a9eaac2ad4bde
6
+ metadata.gz: 44edd1b1a0bca7b23e701748474289f3e7db73b8291b88324a650e41780b62dd1b1320330028f5b1c4f31f66ca05d590fb7a879f705b84a597178b60495cabe2
7
+ data.tar.gz: c5cd7d590bf6d81d0672c27901fc46ef6802cb004d7936e73c36afe6ca13b99e92cb84d43889d2a7ee87a77e01f0a5cea7f70e4cab68d0566a82d5920fa0ab61
data/babeltrace2.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'babeltrace2'
3
- s.version = "0.1.0"
3
+ s.version = "0.1.1"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "bvideau@anl.gov"
6
6
  s.homepage = "https://github.com/alcf-perfengr/babeltrace2-ruby"
@@ -6,6 +6,16 @@ module Babeltrace2
6
6
  :BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS, 1 << 2,
7
7
  :BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR, 1 << 3]
8
8
 
9
+ def self.verbose?
10
+ !!@verbose
11
+ end
12
+
13
+ def self.verbose=(val)
14
+ @verbose = !!val
15
+ end
16
+
17
+ @verbose = ENV["VERBOSE"]
18
+
9
19
  class BTError < BTObject
10
20
  end
11
21
 
@@ -347,14 +357,14 @@ module Babeltrace2
347
357
  item = ""
348
358
  item << c.file_name << ":"
349
359
  item << c.line_number.to_s
350
- item << (mess.match(/:in /) ? mess : ".")
360
+ item << (mess.match(/:in /) ? mess : Babeltrace2.verbose? ? " :: " << mess : ".")
351
361
  backtrace.push(item)
352
362
  cs[1..-1].each { |c|
353
363
  item = ""
354
364
  item << c.file_name << ":"
355
365
  item << c.line_number.to_s
356
366
  mess = c.message
357
- item << (mess.match(/:in /) ? mess : ".")
367
+ item << (mess.match(/:in /) ? mess : Babeltrace2.verbose? ? " :: " << mess : ".")
358
368
  backtrace.push(item)
359
369
  }
360
370
  [klass, message, backtrace]
@@ -424,7 +434,7 @@ module Babeltrace2
424
434
  e = klass.new(message)
425
435
  else
426
436
  message = "#{code}" unless message
427
- e = Error.new
437
+ e = Error.new(message)
428
438
  end
429
439
  e.set_backtrace(backtrace+caller_locations.collect(&:to_s))
430
440
  e
@@ -159,7 +159,7 @@ module Babeltrace2
159
159
  mess = method.call(BTSelfMessageIterator.new(self_message_iterator,
160
160
  retain: false, auto_release: false),
161
161
  capacity)
162
- if mess.size < capacity
162
+ if mess.size <= capacity
163
163
  mess.each { |m| bt_message_get_ref(m.handle) }
164
164
  messages.write_array_of_pointer(mess.collect(&:handle))
165
165
  count.write_uint64(mess.size)
@@ -254,5 +254,33 @@ module Babeltrace2
254
254
  raise Babeltrace2.process_error(res) if res != :BT_CLOCK_CLASS_CYCLES_TO_NS_FROM_ORIGIN_STATUS_OK
255
255
  ptr.read_int64
256
256
  end
257
+
258
+ def to_h
259
+ res = {}
260
+ res[:name] = name if name
261
+ res[:description] = description if description
262
+ res[:frequency] = frequency
263
+ res[:precision] = precision
264
+ res[:offset] = offset
265
+ res[:origin_is_unix_epoch] = origin_is_unix_epoch?
266
+ res[:uuid] = uuid.to_s if uuid
267
+ user_attributes_value = user_attributes.value
268
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
269
+ res
270
+ end
271
+
272
+ def self.from_h(self_component, h)
273
+ o = self_component.create_clock_class
274
+ o.name = h[:name] if h[:name]
275
+ o.description = h[:description] if h[:description]
276
+ o.frequency = h[:frequency] if h[:frequency]
277
+ o.precision = h[:precision] if h[:precision]
278
+ o.set_offset(*h[:offset]) if h[:offset]
279
+ o.origin_is_unix_epoch = h[:origin_is_unix_epoch]
280
+ o.uuid = BTUUID.from_string(h[:uuid]) if h[:uuid]
281
+ o.user_attributes = h[:user_attributes] if h[:user_attributes]
282
+ h[:bt_clock_class] = o
283
+ o
284
+ end
257
285
  end
258
286
  end
@@ -288,5 +288,32 @@ module Babeltrace2
288
288
  BTValueMap.new(Babeltrace2.bt_event_class_borrow_user_attributes(@handle), retain: true)
289
289
  end
290
290
  alias user_attributes get_user_attributes
291
+
292
+ def to_h
293
+ res = { id: id }
294
+ res[:name] = name if name
295
+ res[:log_level] = log_level if log_level
296
+ res[:emf_uri] = emf_uri if emf_uri
297
+ res[:specific_context_field_class] = specific_context_field_class.to_h if specific_context_field_class
298
+ res[:payload_field_class] = payload_field_class.to_h if payload_field_class
299
+ user_attributes_value = user_attributes.value
300
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
301
+ res
302
+ end
303
+
304
+ def self.from_h(trace_class, stream_class, h, stream_class_h)
305
+ id = stream_class.assigns_automatic_event_class_id? ? nil : h[:id]
306
+ o = self.new(stream_class: stream_class, id: id)
307
+ o.name = h[:name] if h[:name]
308
+ o.log_level = h[:log_level] if h[:log_level]
309
+ o.emf_uri = h[:emf_uri] if h[:emf_uri]
310
+ o.specific_context_field_class = BTFieldClass.from_h(trace_class,
311
+ h[:specific_context_field_class], stream_class_h) if h[:specific_context_field_class]
312
+ o.payload_field_class = BTFieldClass.from_h(trace_class,
313
+ h[:payload_field_class], stream_class_h) if h[:payload_field_class]
314
+ o.user_attributes = h[:user_attributes] if h[:user_attributes]
315
+ h[:bt_event_class] = o
316
+ o
317
+ end
291
318
  end
292
319
  end
@@ -86,6 +86,10 @@ module Babeltrace2
86
86
  BTField.from_handle(handle)
87
87
  end
88
88
  alias common_context_field get_common_context_field
89
+
90
+ def name
91
+ get_class.name
92
+ end
89
93
  end
90
94
 
91
95
  end
@@ -172,6 +172,36 @@ module Babeltrace2
172
172
  BTValueMap.new(Babeltrace2.bt_field_class_borrow_user_attributes(@handle), retain: true)
173
173
  end
174
174
  alias user_attributes get_user_attributes
175
+
176
+ def to_h
177
+ res = { type: class_snake_case_name }
178
+ user_attributes_value = user_attributes.value
179
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
180
+ res
181
+ end
182
+
183
+ def self.from_h(trace_class, h, stream_class_h = nil)
184
+ Babeltrace2.const_get(snake_case_to_class(h[:type])).from_h(
185
+ trace_class, h, stream_class_h)
186
+ end
187
+
188
+ def from_h(h)
189
+ self.user_attributes = h[:user_attributes] if h[:user_attributes]
190
+ self
191
+ end
192
+
193
+ private
194
+
195
+ def class_snake_case_name
196
+ str = self.class.name.gsub(/::/, '')
197
+ str.match(/BTFieldClass(.*)/)[1].
198
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
199
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').downcase
200
+ end
201
+
202
+ def self.snake_case_to_class(str)
203
+ "BTFieldClass" << str.split("_").collect(&:capitalize).join
204
+ end
175
205
  end
176
206
 
177
207
  attach_function :bt_field_class_bool_create,
@@ -189,6 +219,12 @@ module Babeltrace2
189
219
  super(handle, retain: false)
190
220
  end
191
221
  end
222
+
223
+ def self.from_h(trace_class, h, stream_class_h = nil)
224
+ o = self.new(trace_class: trace_class).from_h(h)
225
+ h[:bt_field_class] = o
226
+ o
227
+ end
192
228
  end
193
229
  BTFieldClassBool = BTFieldClass::Bool
194
230
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_BOOL] = [
@@ -219,6 +255,18 @@ module Babeltrace2
219
255
  Babeltrace2.bt_field_class_bit_array_get_length(@handle)
220
256
  end
221
257
  alias length get_length
258
+
259
+ def to_h
260
+ res = super
261
+ res[:length] = length
262
+ res
263
+ end
264
+
265
+ def self.from_h(trace_class, h, stream_class_h = nil)
266
+ o = self.new(trace_class: trace_class, length: h[:length]).from_h(h)
267
+ h[:bt_field_class] = o
268
+ o
269
+ end
222
270
  end
223
271
  BTFieldClassBitArray = BTFieldClass::BitArray
224
272
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_BIT_ARRAY] = [
@@ -260,7 +308,7 @@ module Babeltrace2
260
308
  class BTFieldClass::Integer < BTFieldClass
261
309
 
262
310
  def set_field_value_range(n)
263
- raise "invalid range" if n < 0 || n > 63
311
+ raise "invalid range" if n < 0 || n > 64
264
312
  Babeltrace2.bt_field_class_integer_set_field_value_range(@handle, n)
265
313
  self
266
314
  end
@@ -305,6 +353,20 @@ module Babeltrace2
305
353
  preferred_display_base
306
354
  end
307
355
  end
356
+
357
+ def to_h
358
+ res = super
359
+ res[:field_value_range] = field_value_range
360
+ res[:preferred_display_base] = preferred_display_base_integer
361
+ res
362
+ end
363
+
364
+ def from_h(h)
365
+ super
366
+ self.field_value_range = h[:field_value_range] if h[:field_value_range]
367
+ self.preferred_display_base = h[:preferred_display_base] if h[:preferred_display_base]
368
+ self
369
+ end
308
370
  end
309
371
  BTFieldClassInteger = BTFieldClass::Integer
310
372
 
@@ -323,6 +385,12 @@ module Babeltrace2
323
385
  super(handle, retain: false)
324
386
  end
325
387
  end
388
+
389
+ def self.from_h(trace_class, h, stream_class_h = nil)
390
+ o = self.new(trace_class: trace_class).from_h(h)
391
+ h[:bt_field_class] = o
392
+ o
393
+ end
326
394
  end
327
395
  BTFieldClass::IntegerUnsigned = BTFieldClass::Integer::Unsigned
328
396
  BTFieldClassIntegerUnsigned = BTFieldClass::Integer::Unsigned
@@ -345,6 +413,12 @@ module Babeltrace2
345
413
  super(handle, retain: false)
346
414
  end
347
415
  end
416
+
417
+ def self.from_h(trace_class, h, stream_class_h = nil)
418
+ o = self.new(trace_class: trace_class).from_h(h)
419
+ h[:bt_field_class] = o
420
+ o
421
+ end
348
422
  end
349
423
  BTFieldClass::IntegerSigned = BTFieldClass::Integer::Signed
350
424
  BTFieldClassIntegerSigned = BTFieldClass::Integer::Signed
@@ -371,6 +445,12 @@ module Babeltrace2
371
445
  super(handle, retain: false)
372
446
  end
373
447
  end
448
+
449
+ def self.from_h(trace_class, h, stream_class_h = nil)
450
+ o = self.new(trace_class: trace_class).from_h(h)
451
+ h[:bt_field_class] = o
452
+ o
453
+ end
374
454
  end
375
455
  BTFieldClass::RealSinglePrecision = BTFieldClass::Real::SinglePrecision
376
456
  BTFieldClassRealSinglePrecision = BTFieldClass::Real::SinglePrecision
@@ -393,6 +473,12 @@ module Babeltrace2
393
473
  super(handle, retain: false)
394
474
  end
395
475
  end
476
+
477
+ def self.from_h(trace_class, h, stream_class_h = nil)
478
+ o = self.new(trace_class: trace_class).from_h(h)
479
+ h[:bt_field_class] = o
480
+ o
481
+ end
396
482
  end
397
483
  BTFieldClass::RealDoublePrecision = BTFieldClass::Real::DoublePrecision
398
484
  BTFieldClassRealDoublePrecision = BTFieldClass::Real::DoublePrecision
@@ -448,6 +534,25 @@ module Babeltrace2
448
534
  end
449
535
  alias mapping get_mapping
450
536
 
537
+ def to_h
538
+ res = super
539
+ res[:mappings] = get_mapping_count.times.collect { |i|
540
+ mapping = get_mapping_by_index(i)
541
+ [mapping.label, mapping.ranges.each.collect { |r| [r.lower, r.upper] }]
542
+ }.to_h
543
+ res
544
+ end
545
+
546
+ def from_h(h)
547
+ super
548
+ if h[:mappings]
549
+ h[:mappings].each { |name, ranges|
550
+ add_mapping(name, ranges)
551
+ }
552
+ end
553
+ self
554
+ end
555
+
451
556
  class Mapping < BTObject
452
557
  def get_label
453
558
  label = Babeltrace2.bt_field_class_enumeration_mapping_get_label(@handle)
@@ -511,6 +616,12 @@ module Babeltrace2
511
616
  end
512
617
  end
513
618
 
619
+ def self.from_h(trace_class, h, stream_class_h = nil)
620
+ o = self.new(trace_class: trace_class).from_h(h)
621
+ h[:bt_field_class] = o
622
+ o
623
+ end
624
+
514
625
  def add_mapping(label, ranges)
515
626
  label = label.inspect if label.kind_of?(Symbol)
516
627
  ranges = BTIntegerRangeSetUnsigned.from_value(ranges)
@@ -608,6 +719,12 @@ module Babeltrace2
608
719
  end
609
720
  end
610
721
 
722
+ def self.from_h(trace_class, h, stream_class_h = nil)
723
+ o = self.new(trace_class: trace_class).from_h(h)
724
+ h[:bt_field_class] = o
725
+ o
726
+ end
727
+
611
728
  def add_mapping(label, ranges)
612
729
  label = label.inspect if label.kind_of?(Symbol)
613
730
  ranges = BTIntegerRangeSetSigned.from_value(ranges)
@@ -672,6 +789,12 @@ module Babeltrace2
672
789
  super(handle, retain: false)
673
790
  end
674
791
  end
792
+
793
+ def self.from_h(trace_class, h, stream_class_h = nil)
794
+ o = self.new(trace_class: trace_class).from_h(h)
795
+ h[:bt_field_class] = o
796
+ o
797
+ end
675
798
  end
676
799
  BTFieldClassString = BTFieldClass::String
677
800
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_STRING] = [
@@ -692,6 +815,12 @@ module Babeltrace2
692
815
  Babeltrace2.bt_field_class_array_borrow_element_field_class(@handle))
693
816
  end
694
817
  alias element_field_class get_element_field_class
818
+
819
+ def to_h
820
+ res = super
821
+ res[:element_field_class] = element_field_class.to_h
822
+ res
823
+ end
695
824
  end
696
825
  BTFieldClassArray = BTFieldClass::Array
697
826
 
@@ -721,6 +850,22 @@ module Babeltrace2
721
850
  end
722
851
  alias length get_length
723
852
  alias size get_length
853
+
854
+ def to_h
855
+ res = super
856
+ res[:length] = length
857
+ res
858
+ end
859
+
860
+ def self.from_h(trace_class, h, stream_class_h = nil)
861
+ o = self.new(trace_class: trace_class,
862
+ element_field_class: BTFieldClass.from_h(trace_class,
863
+ h[:element_field_class],
864
+ stream_class_h),
865
+ length: h[:length]).from_h(h)
866
+ h[:bt_field_class] = o
867
+ o
868
+ end
724
869
  end
725
870
  BTFieldClassArrayStatic = BTFieldClass::Array::Static
726
871
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_STATIC_ARRAY] = [
@@ -744,6 +889,12 @@ module Babeltrace2
744
889
  BTFieldPath.new(handle, retain: true)
745
890
  end
746
891
  alias length_field_path get_length_field_path
892
+
893
+ def to_h
894
+ res = super
895
+ res[:length_field_path] = length_field_path.to_s
896
+ res
897
+ end
747
898
  end
748
899
  def initialize(handle = nil, retain: true, auto_release: true,
749
900
  trace_class: nil, element_field_class: nil, length_field_class: nil)
@@ -759,6 +910,22 @@ module Babeltrace2
759
910
  super(handle, retain: false)
760
911
  end
761
912
  end
913
+
914
+ def self.from_h(trace_class, h, stream_class_h = nil)
915
+ if (stream_class_h && h[:length_field_path])
916
+ length_field_class = BTStreamClass.locate_field_class(
917
+ BTFieldPath.path_from_s_to_h(h[:length_field_path]), stream_class_h)
918
+ else
919
+ length_field_class = nil
920
+ end
921
+ o = self.new(trace_class: trace_class,
922
+ element_field_class: BTFieldClass.from_h(trace_class,
923
+ h[:element_field_class],
924
+ stream_class_h),
925
+ length_field_class: length_field_class).from_h(h)
926
+ h[:bt_field_class] = o
927
+ o
928
+ end
762
929
  end
763
930
  BTFieldClassArrayDynamic = BTFieldClass::Array::Dynamic
764
931
  BTFieldClassArrayDynamicWithLengthField = BTFieldClass::Array::Dynamic::WithLengthField
@@ -858,6 +1025,18 @@ module Babeltrace2
858
1025
  BTValueMap.new(Babeltrace2.bt_field_class_structure_member_borrow_user_attributes(@handle), retain: true)
859
1026
  end
860
1027
  alias user_attributes get_user_attributes
1028
+
1029
+ def to_h
1030
+ res = { name: name, field_class: field_class.to_h }
1031
+ user_attributes_value = user_attributes.value
1032
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
1033
+ res
1034
+ end
1035
+
1036
+ def from_h(h)
1037
+ self.user_attributes = h[:user_attributes] if h[:user_attributes]
1038
+ self
1039
+ end
861
1040
  end
862
1041
 
863
1042
  def initialize(handle = nil, retain: true, auto_release: true,
@@ -911,6 +1090,23 @@ module Babeltrace2
911
1090
  end
912
1091
  end
913
1092
  alias [] get_member
1093
+
1094
+ def to_h
1095
+ res = super
1096
+ res[:members] = member_count.times.collect { |i| get_member_by_index(i).to_h }
1097
+ res
1098
+ end
1099
+
1100
+ def self.from_h(trace_class, h, stream_class_h = nil)
1101
+ o = self.new(trace_class: trace_class).from_h(h)
1102
+ h[:members].each_with_index { |v, i|
1103
+ o.append_member(v[:name],
1104
+ BTFieldClass.from_h(trace_class, v[:field_class], stream_class_h))
1105
+ o.get_member_by_index(i).from_h(v)
1106
+ }
1107
+ h[:bt_field_class] = o
1108
+ o
1109
+ end
914
1110
  end
915
1111
  BTFieldClassStructure = BTFieldClass::Structure
916
1112
  BTFieldClassStructureMember = BTFieldClass::Structure::Member
@@ -932,6 +1128,12 @@ module Babeltrace2
932
1128
  Babeltrace2.bt_field_class_option_borrow_field_class(@handle))
933
1129
  end
934
1130
  alias field_class get_field_class
1131
+
1132
+ def to_h
1133
+ res = super
1134
+ res[:field_class] = field_class.to_h
1135
+ res
1136
+ end
935
1137
  end
936
1138
  BTFieldClassOption = BTFieldClass::Option
937
1139
 
@@ -951,6 +1153,15 @@ module Babeltrace2
951
1153
  super(handle, retain: false)
952
1154
  end
953
1155
  end
1156
+
1157
+ def self.from_h(trace_class, h, stream_class_h = nil)
1158
+ o = self.new(trace_class: trace_class,
1159
+ optional_field_class: BTFieldClass.from_h(trace_class,
1160
+ h[:field_class],
1161
+ stream_class_h)).from_h(h)
1162
+ h[:bt_field_class] = o
1163
+ o
1164
+ end
954
1165
  end
955
1166
  BTFieldClassOptionWithoutSelectorField = BTFieldClass::Option::WithoutSelectorField
956
1167
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD] = [
@@ -968,6 +1179,12 @@ module Babeltrace2
968
1179
  BTFieldPath.new(handle, retain: true)
969
1180
  end
970
1181
  alias selector_field_path get_selector_field_path
1182
+
1183
+ def to_h
1184
+ res = super
1185
+ res[:selector_field_path] = selector_field_path.to_s if selector_field_path
1186
+ res
1187
+ end
971
1188
  end
972
1189
  BTFieldClassOptionWithSelectorField = BTFieldClass::Option::WithSelectorField
973
1190
 
@@ -1014,6 +1231,29 @@ module Babeltrace2
1014
1231
  @handle) != BT_FALSE
1015
1232
  end
1016
1233
  alias selector_is_reversed? selector_is_reversed
1234
+
1235
+ def to_h
1236
+ res = super
1237
+ res[:selector_is_reversed] = selector_is_reversed?
1238
+ res
1239
+ end
1240
+
1241
+ def self.from_h(trace_class, h, stream_class_h = nil)
1242
+ if (stream_class_h && h[:selector_field_path])
1243
+ selector_field_class = BTStreamClass.locate_field_class(
1244
+ BTFieldPath.path_from_s_to_h(h[:selector_field_path]), stream_class_h)
1245
+ else
1246
+ selector_field_class = nil
1247
+ end
1248
+ o = self.new(trace_class: trace_class,
1249
+ optional_field_class: BTFieldClass.from_h(trace_class,
1250
+ h[:field_class],
1251
+ stream_class_h),
1252
+ selector_field_class: selector_field_class).from_h(h)
1253
+ o.selector_is_reversed = h[:selector_is_reversed] if h[:selector_is_reversed]
1254
+ h[:bt_field_class] = o
1255
+ o
1256
+ end
1017
1257
  end
1018
1258
  BTFieldClassOptionWithSelectorFieldBool = BTFieldClass::Option::WithSelectorField::Bool
1019
1259
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD] = [
@@ -1051,6 +1291,29 @@ module Babeltrace2
1051
1291
  @handle), retain: true)
1052
1292
  end
1053
1293
  alias selector_ranges get_selector_ranges
1294
+
1295
+ def to_h
1296
+ res = super
1297
+ res[:selector_ranges] = selector_ranges.each.collect { |r| [r.lower, r.upper] }
1298
+ res
1299
+ end
1300
+
1301
+ def self.from_h(trace_class, h, stream_class_h = nil)
1302
+ if (stream_class_h && h[:selector_field_path])
1303
+ selector_field_class = BTStreamClass.locate_field_class(
1304
+ BTFieldPath.path_from_s_to_h(h[:selector_field_path]), stream_class_h)
1305
+ else
1306
+ selector_field_class = nil
1307
+ end
1308
+ o = self.new(trace_class: trace_class,
1309
+ optional_field_class: BTFieldClass.from_h(trace_class,
1310
+ h[:field_class],
1311
+ stream_class_h),
1312
+ selector_field_class: selector_field_class,
1313
+ ranges: h[:selector_ranges]).from_h(h)
1314
+ h[:bt_field_class] = o
1315
+ o
1316
+ end
1054
1317
  end
1055
1318
  BTFieldClassOptionWithSelectorFieldIntegerUnsigned = BTFieldClass::Option::WithSelectorField::IntegerUnsigned
1056
1319
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD] = [
@@ -1088,6 +1351,29 @@ module Babeltrace2
1088
1351
  @handle), retain: true)
1089
1352
  end
1090
1353
  alias selector_ranges get_selector_ranges
1354
+
1355
+ def to_h
1356
+ res = super
1357
+ res[:selector_ranges] = selector_ranges.each.collect { |r| [r.lower, r.upper] }
1358
+ res
1359
+ end
1360
+
1361
+ def self.from_h(trace_class, h, stream_class_h = nil)
1362
+ if (stream_class_h && h[:selector_field_path])
1363
+ selector_field_class = BTStreamClass.locate_field_class(
1364
+ BTFieldPath.path_from_s_to_h(h[:selector_field_path]), stream_class_h)
1365
+ else
1366
+ selector_field_class = nil
1367
+ end
1368
+ o = self.new(trace_class: trace_class,
1369
+ optional_field_class: BTFieldClass.from_h(trace_class,
1370
+ h[:field_class],
1371
+ stream_class_h),
1372
+ selector_field_class: selector_field_class,
1373
+ ranges: h[:selector_ranges]).from_h(h)
1374
+ h[:bt_field_class] = o
1375
+ o
1376
+ end
1091
1377
  end
1092
1378
  BTFieldClassOptionWithSelectorFieldIntegerSigned = BTFieldClass::Option::WithSelectorField::IntegerSigned
1093
1379
  BTFieldClass::TYPE_MAP[:BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = [
@@ -1174,6 +1460,13 @@ module Babeltrace2
1174
1460
  @handle), retain: true)
1175
1461
  end
1176
1462
  alias user_attributes get_user_attributes
1463
+
1464
+ def to_h
1465
+ res = { name: name, field_class: field_class.to_h }
1466
+ user_attributes_value = user_attributes.value
1467
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
1468
+ res
1469
+ end
1177
1470
  end
1178
1471
  end
1179
1472
  BTFieldClassVariantOption = BTFieldClass::Variant::Option
@@ -1259,6 +1552,13 @@ module Babeltrace2
1259
1552
  BTFieldPath.new(handle, retain: true)
1260
1553
  end
1261
1554
  alias selector_field_path get_selector_field_path
1555
+
1556
+ def to_h
1557
+ res = super
1558
+ res[:selector_field_path] = selector_field_path.to_s
1559
+ res
1560
+ end
1561
+
1262
1562
  module IntegerUnsigned
1263
1563
  class Option < BTFieldClassVariantOption
1264
1564
  def get_ranges
@@ -1267,6 +1567,12 @@ module Babeltrace2
1267
1567
  @handle), retain: true)
1268
1568
  end
1269
1569
  alias ranges get_ranges
1570
+
1571
+ def to_h
1572
+ res = super
1573
+ res[:ranges] = ranges.each.collect { |r| [r.lower, r.upper] }
1574
+ res
1575
+ end
1270
1576
  end
1271
1577
  include WithSelectorField
1272
1578
  def append_option(name, option_field_class, ranges)
@@ -1303,6 +1609,12 @@ module Babeltrace2
1303
1609
  @handle), retain: true)
1304
1610
  end
1305
1611
  alias ranges get_ranges
1612
+
1613
+ def to_h
1614
+ res = super
1615
+ res[:ranges] = ranges.each.collect { |r| [r.lower, r.upper] }
1616
+ res
1617
+ end
1306
1618
  end
1307
1619
  include WithSelectorField
1308
1620
  def append_option(name, option_field_class, ranges)
@@ -1395,6 +1707,36 @@ module Babeltrace2
1395
1707
  end
1396
1708
  alias [] get_option
1397
1709
 
1710
+ def to_h
1711
+ res = super
1712
+ res[:options] = option_count.times.collect { |i|
1713
+ get_option_by_index(i).to_h
1714
+ }
1715
+ res
1716
+ end
1717
+
1718
+ def self.from_h(trace_class, h, stream_class_h = nil)
1719
+ if (stream_class_h && h[:selector_field_path])
1720
+ selector_field_class = BTStreamClass.locate_field_class(
1721
+ BTFieldPath.path_from_s_to_h(h[:selector_field_path]), stream_class_h)
1722
+ else
1723
+ selector_field_class = nil
1724
+ end
1725
+ o = self.new(trace_class: trace_class,
1726
+ selector_field_class: selector_field_class).from_h(h)
1727
+ if selector_field_class
1728
+ h[:options].each { |v|
1729
+ o.append_option(v[:name],
1730
+ BTFieldClass.from_h(trace_class, v[:field_class], stream_class_h),
1731
+ v[:ranges]) }
1732
+ else
1733
+ h[:options].each { |v|
1734
+ o.append_option(v[:name],
1735
+ BTFieldClass.from_h(trace_class, v[:field_class], stream_class_h)) }
1736
+ end
1737
+ h[:bt_field_class] = o
1738
+ o
1739
+ end
1398
1740
  end
1399
1741
  BTFieldClassVariantWithoutSelectorField =
1400
1742
  BTFieldClass::Variant::WithoutSelectorField
@@ -85,6 +85,30 @@ module Babeltrace2
85
85
  }
86
86
  path
87
87
  end
88
+
89
+ def self.path_from_s_to_h(str)
90
+ str_orig = str
91
+ m = str.match(/\A(PACKET_CONTEXT|EVENT_COMMON_CONTEXT|EVENT_SPECIFIC_CONTEXT|EVENT_PAYLOAD)/)
92
+ raise "invalid path #{str}" if !m
93
+ path = [(m[1].downcase << "_field_class").to_sym]
94
+ str = str.sub(m[1], "")
95
+ while !str.empty?
96
+ case str
97
+ when /\A\[(\d+)\]/
98
+ path.push :members, $1.to_i, :field_class
99
+ str = str.sub("[#{$1}]", "")
100
+ when /\A->/
101
+ path.push :element_field_class
102
+ str = str.sub("->", "")
103
+ when /\A=>/
104
+ path.push :field_class
105
+ str = str.sub("=>", "")
106
+ else
107
+ raise "invalid path #{str_orig}"
108
+ end
109
+ end
110
+ path
111
+ end
88
112
  end
89
113
 
90
114
  BT_FIELD_PATH_ITEM_TYPE_INDEX = 1 << 0
@@ -421,7 +421,7 @@ module Babeltrace2
421
421
  :bt_field_string_append_status
422
422
 
423
423
  attach_function :bt_field_string_append_with_length,
424
- [ :bt_field_string_handle, :string, :uint64 ],
424
+ [ :bt_field_string_handle, :pointer, :uint64 ],
425
425
  :bt_field_string_append_status
426
426
 
427
427
  attach_function :bt_field_string_clear,
@@ -460,7 +460,9 @@ module Babeltrace2
460
460
 
461
461
  def append(value, length: nil)
462
462
  res = if length
463
- Babeltrace2.bt_field_string_append_with_length(@handle, value, length)
463
+ ptr = FFI::MemoryPointer.new(length)
464
+ ptr.write_bytes(value, 0, length)
465
+ Babeltrace2.bt_field_string_append_with_length(@handle, ptr, length)
464
466
  else
465
467
  Babeltrace2.bt_field_string_append(@handle, value)
466
468
  end
@@ -521,12 +523,25 @@ module Babeltrace2
521
523
  end
522
524
 
523
525
  def value
524
- each.collect { |e| e.value }
526
+ each.collect(&:value)
527
+ end
528
+
529
+ def set_value(values)
530
+ raise "invalid value size" if values.size != length
531
+ values.each_with_index { |e, i|
532
+ get_element_field_by_index(i).set_value(e)
533
+ }
534
+ self
535
+ end
536
+
537
+ def value=(values)
538
+ set_value(values)
539
+ values
525
540
  end
526
541
 
527
542
  def to_s
528
543
  s = "["
529
- s << each.collect { |e| e.to_s }.join(", ")
544
+ s << each.collect(&:to_s).join(", ")
530
545
  s << "]"
531
546
  end
532
547
  end
@@ -634,6 +649,11 @@ module Babeltrace2
634
649
  end
635
650
  alias [] get_member_field
636
651
 
652
+ def []=(member_field, value)
653
+ get_member_field(member_field).set_value(value)
654
+ value
655
+ end
656
+
637
657
  def each
638
658
  if block_given?
639
659
  get_member_count.times { |i|
@@ -653,6 +673,11 @@ module Babeltrace2
653
673
  v
654
674
  end
655
675
 
676
+ def field_names
677
+ klass = get_class
678
+ get_member_count.times.collect { |i| klass.get_member_by_index(i).name }
679
+ end
680
+
656
681
  def to_s
657
682
  s = "{"
658
683
  klass = get_class
@@ -414,6 +414,87 @@ module Babeltrace2
414
414
  end
415
415
  alias user_attributes get_user_attributes
416
416
 
417
+ def to_h
418
+ res = {
419
+ id: id,
420
+ supports_packets: supports_packets? }
421
+ if supports_packets?
422
+ res[:packets_have_beginning_default_clock_snapshot] =
423
+ packets_have_beginning_default_clock_snapshot?
424
+ res[:packets_have_end_default_clock_snapshot] =
425
+ packets_have_end_default_clock_snapshot?
426
+ end
427
+ res[:supports_discarded_events] = supports_discarded_events?
428
+ res[:discarded_events_have_default_clock_snapshots] =
429
+ discarded_events_have_default_clock_snapshots? if supports_discarded_events?
430
+ if supports_packets?
431
+ res[:supports_discarded_packets] = supports_discarded_packets?
432
+ if supports_discarded_packets?
433
+ res[:discarded_packets_have_default_clock_snapshots] = discarded_packets_have_default_clock_snapshots?
434
+ end
435
+ end
436
+ if default_clock_class
437
+ res[:default_clock_class] = default_clock_class.to_h
438
+ end
439
+ if supports_packets? && packet_context_field_class
440
+ res[:packet_context_field_class] = packet_context_field_class.to_h
441
+ end
442
+ if event_common_context_field_class
443
+ res[:event_common_context_field_class] = event_common_context_field_class.to_h
444
+ end
445
+ res[:assigns_automatic_event_class_id] = assigns_automatic_event_class_id?
446
+ res[:assigns_automatic_stream_id] = assigns_automatic_stream_id?
447
+ res[:event_classes] = event_class_count.times.collect { |i|
448
+ get_event_class_by_index(i).to_h
449
+ }
450
+ user_attributes_value = user_attributes.value
451
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
452
+ res
453
+ end
454
+
455
+ def self.from_h(self_component, trace_class, h)
456
+ id = trace_class.assigns_automatic_stream_class_id? ? nil : h[:id]
457
+ o = trace_class.create_stream_class(id: id)
458
+ o.default_clock_class = BTClockClass.from_h(self_component,
459
+ h[:default_clock_class]) if h[:default_clock_class]
460
+ o.set_supports_packets( h[:supports_packets],
461
+ with_beginning_default_clock_snapshot:
462
+ h[:packets_have_beginning_default_clock_snapshot],
463
+ with_end_default_clock_snapshot:
464
+ h[:packets_have_end_default_clock_snapshot])
465
+ o.set_supports_discarded_events(h[:supports_discarded_events],
466
+ with_default_clock_snapshots:
467
+ h[:discarded_events_have_default_clock_snapshots])
468
+ o.set_supports_discarded_packets(h[:supports_discarded_packets],
469
+ with_default_clock_snapshots:
470
+ h[:discarded_packets_have_default_clock_snapshots]) if h[:supports_packets]
471
+ o.packet_context_field_class = BTFieldClass.from_h(trace_class,
472
+ h[:packet_context_field_class], h) if h[:packet_context_field_class]
473
+ o.event_common_context_field_class = BTFieldClass.from_h(trace_class,
474
+ h[:event_common_context_field_class], h) if h[:event_common_context_field_class]
475
+ o.assigns_automatic_event_class_id = h[:assigns_automatic_event_class_id] unless h[:assigns_automatic_event_class_id].nil?
476
+ o.assigns_automatic_stream_id = h[:assigns_automatic_stream_id] unless h[:assigns_automatic_stream_id].nil?
477
+ h[:event_classes].each_with_index { |v, i|
478
+ h[:bt_current_event] = i;
479
+ BTEventClass.from_h(trace_class, o, v, h)
480
+ }
481
+ h.delete(:bt_current_event)
482
+ o.user_attributes = h[:user_attributes] if h[:user_attributes]
483
+ h[:bt_stream_class] = o
484
+ o
485
+ end
486
+
487
+ def self.locate_field_class(path, h)
488
+ case path[0]
489
+ when :event_payload_field_class
490
+ h[:event_classes][h[:bt_current_event]][:payload_field_class].dig(*path[1..-1])[:bt_field_class]
491
+ when :event_specific_context_field_class
492
+ h[:event_classes][h[:bt_current_event]][:specific_context_field_class].dig(*path[1..-1])[:bt_field_class]
493
+ else
494
+ h.dig(*path)[:bt_field_class]
495
+ end
496
+ end
497
+
417
498
  def create_stream(trace, id: nil)
418
499
  BTStream.new(stream_class: @handle, trace: trace, id: nil)
419
500
  end
@@ -339,5 +339,24 @@ module Babeltrace2
339
339
  end
340
340
  alias create_variant_class create_field_class_variant
341
341
  alias create_variant create_field_class_variant
342
+
343
+ def to_h
344
+ res = {
345
+ assigns_automatic_stream_class_id: assigns_automatic_stream_class_id?,
346
+ stream_classes: stream_class_count.times.collect { |i| get_stream_class_by_index(i).to_h } }
347
+ user_attributes_value = user_attributes.value
348
+ res[:user_attributes] = user_attributes_value if !user_attributes_value.empty?
349
+ res
350
+ end
351
+
352
+ def self.from_h(self_component, h)
353
+ o = self_component.create_trace_class
354
+ o.assigns_automatic_stream_class_id = h[:assigns_automatic_stream_class_id] unless h[:assigns_automatic_stream_class_id].nil?
355
+ h[:stream_classes].each { |v| BTStreamClass.from_h(self_component, o, v) }
356
+ o.user_attributes = h[:user_attributes] if h[:user_attributes]
357
+ h[:bt_trace_class] = o
358
+ o
359
+ end
360
+
342
361
  end
343
362
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: babeltrace2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brice Videau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-03 00:00:00.000000000 Z
11
+ date: 2021-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi