babeltrace 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ require 'mkmf'
2
+
3
+ pkg_config("babeltrace")
4
+ pkg_config("babeltrace-ctf")
5
+ pkg_config("glib-2.0")
6
+
7
+ dir_config("babeltrace")
8
+ create_makefile("babeltrace_c")
@@ -0,0 +1,15 @@
1
+ require 'ffi'
2
+ require 'babeltrace_c'
3
+
4
+ module Babeltrace
5
+ extend FFI::Library
6
+ ffi_lib "babeltrace"
7
+ end
8
+
9
+ require_relative 'babeltrace/types'
10
+ require_relative 'babeltrace/list'
11
+ require_relative 'babeltrace/clock_type'
12
+ require_relative 'babeltrace/format'
13
+ require_relative 'babeltrace/context'
14
+ require_relative 'babeltrace/iterator'
15
+ require_relative 'babeltrace/trace_handle'
@@ -0,0 +1,3 @@
1
+ module Babeltrace
2
+ ClockType = enum :CYCLES, :REAL
3
+ end
@@ -0,0 +1,33 @@
1
+ module Babeltrace
2
+
3
+ class Context # < ManagedStruct
4
+ def initialize(ptr = Babeltrace.bt_context_create)
5
+ super(ptr)
6
+ end
7
+
8
+ def self.release(ptr)
9
+ Babeltrace.bt_context_put(ptr)
10
+ end
11
+
12
+ def add_trace(path:, format: "ctf")
13
+ handle_id = Babeltrace.bt_context_add_trace(self, path, format, nil, nil, nil)
14
+ case format
15
+ when "ctf"
16
+ return CTF::Trace::new(self, handle_id)
17
+ else
18
+ return Trace::new(self, handle_id)
19
+ end
20
+ end
21
+
22
+ def remove_trace(trace_id)
23
+ Babeltrace.bt_context_remove_trace(self, trace_id)
24
+ end
25
+ end
26
+
27
+ attach_function :bt_context_create, [], Context
28
+ attach_function :bt_context_add_trace, [Context, :string, :string, :packet_seek_callback, :pointer, :pointer], :int
29
+ attach_function :bt_context_remove_trace, [Context, :int], :int
30
+ attach_function :bt_context_get, [Context], :void
31
+ attach_function :bt_context_put, [Context], :void
32
+
33
+ end
@@ -0,0 +1,10 @@
1
+ module Babeltrace
2
+ module CTF
3
+ extend FFI::Library
4
+ ffi_lib "babeltrace-ctf", "babeltrace-ctf-metadata"
5
+ end
6
+ require_relative 'ctf/callbacks'
7
+ require_relative 'ctf/events'
8
+ require_relative 'ctf/iterator'
9
+ end
10
+
@@ -0,0 +1,27 @@
1
+ module Babeltrace
2
+ module CTF
3
+
4
+ CBRet = enum :OK, :OK_STOP, :ERROR_STOP, :ERROR_CONTINUE
5
+ class Iter < FFI::ManagedStruct
6
+ layout :dummy, :pointer
7
+ end
8
+
9
+ class Dependencies < FFI::Struct
10
+ layout :dummy, :pointer
11
+
12
+ def initialize(*args)
13
+ super(CTF.bt_dependencies_create(*args, nil))
14
+ end
15
+ end
16
+
17
+ class Event < FFI::Struct
18
+ layout :dummy, :pointer
19
+ end
20
+
21
+ attach_function :bt_dependencies_create, [:string, :varargs], Dependencies.by_ref
22
+ # attach_function :bt_dependencies_destroy, [Dependencies], nil
23
+
24
+ callback :iter_callback, [Event, :pointer], CBRet
25
+ attach_function :bt_ctf_iter_add_callback, [Iter, Babeltrace.find_type(:intern_str), :pointer, :int, :iter_callback, Dependencies, Dependencies, Dependencies], :int
26
+ end
27
+ end
@@ -0,0 +1,558 @@
1
+ module Babeltrace
2
+ module CTF
3
+ Scope = enum :TRACE_PACKET_HEADER,
4
+ :STREAM_PACKET_CONTEXT,
5
+ :STREAM_EVENT_HEADER,
6
+ :STREAM_EVENT_CONTEXT,
7
+ :EVENT_CONTEXT,
8
+ :EVENT_FIELDS
9
+ TypeID = enum :UNKNOWN,
10
+ :INTEGER,
11
+ :FLOAT,
12
+ :ENUM,
13
+ :STRING,
14
+ :STRUCT,
15
+ :UNTAGGED_VARIANT,
16
+ :VARIANT,
17
+ :ARRAY,
18
+ :SEQUENCE,
19
+ :NR
20
+
21
+ StringEncoding = enum :NONE,
22
+ :UTF8,
23
+ :ASCII,
24
+ :UNKNOWN
25
+
26
+ module Internal
27
+ class Declaration # < FFI::Struct
28
+ layout :dummy, :pointer
29
+
30
+ def field_type
31
+ CTF.bt_ctf_field_type(self)
32
+ end
33
+
34
+ def get_int_signedness
35
+ CTF.bt_ctf_get_int_signedness(self)
36
+ end
37
+
38
+ def int_signed?
39
+ get_int_signedness == 1
40
+ end
41
+
42
+ def get_int_base
43
+ CTF.bt_ctf_get_int_base(self)
44
+ end
45
+
46
+ def get_int_byte_order
47
+ CTF.bt_ctf_get_int_byte_order(self)
48
+ end
49
+
50
+ def get_int_len
51
+ CTF.bt_ctf_get_int_len(self)
52
+ end
53
+
54
+ def get_encoding
55
+ CTF.bt_ctf_get_encoding(self)
56
+ end
57
+
58
+ def get_array_len
59
+ CTF.bt_ctf_get_array_len(self)
60
+ end
61
+ end
62
+ end
63
+ attach_function :bt_ctf_field_type, [Internal::Declaration], TypeID
64
+ attach_function :bt_ctf_get_int_signedness, [Internal::Declaration], :int
65
+ attach_function :bt_ctf_get_int_base, [Internal::Declaration], :int
66
+ attach_function :bt_ctf_get_int_byte_order, [Internal::Declaration], :int
67
+ attach_function :bt_ctf_get_int_len, [Internal::Declaration], :ssize_t
68
+ attach_function :bt_ctf_get_encoding, [Internal::Declaration], StringEncoding
69
+ attach_function :bt_ctf_get_array_len, [Internal::Declaration], :int
70
+
71
+ module Internal
72
+ class FieldDecl < FFI::Struct
73
+ layout :dummy, :pointer
74
+
75
+ def get_decl
76
+ decl = CTF.bt_ctf_get_decl_from_field_decl(self)
77
+ CTF::Declaration::create(decl)
78
+ end
79
+ alias decl get_decl
80
+
81
+ def get_name
82
+ CTF.bt_ctf_get_decl_field_name(self)
83
+ end
84
+ alias name get_name
85
+ end
86
+ end
87
+
88
+ attach_function :bt_ctf_get_decl_from_field_decl, [Internal::FieldDecl], Internal::Declaration.by_ref
89
+ attach_function :bt_ctf_get_decl_field_name, [Internal::FieldDecl], :string
90
+
91
+ module Internal
92
+ class Definition # < FFI::Struct
93
+ layout :dummy, :pointer
94
+
95
+ def field_name
96
+ CTF.bt_ctf_field_name(self)
97
+ end
98
+ alias name field_name
99
+
100
+ def get_decl
101
+ decl = CTF.bt_ctf_get_decl_from_def(self)
102
+ CTF::Declaration.create(decl)
103
+ end
104
+ alias decl get_decl
105
+
106
+ def get_struct_field_count
107
+ CTF.bt_ctf_get_struct_field_count(self)
108
+ end
109
+ alias struct_field_count get_struct_field_count
110
+
111
+ def get_uint64
112
+ CTF.bt_ctf_get_uint64(self)
113
+ end
114
+
115
+ def get_int64
116
+ CTF.bt_ctf_get_int64(self)
117
+ end
118
+
119
+ def get_enum_int
120
+ d = CTF.bt_ctf_get_enum_int(self)
121
+ CTF::Definition.create(d)
122
+ end
123
+
124
+ def get_enum_str
125
+ CTF.bt_ctf_get_enum_str(self)
126
+ end
127
+
128
+ def get_char_array
129
+ CTF.bt_ctf_get_char_array(self)
130
+ end
131
+
132
+ def get_string
133
+ CTF.bt_ctf_get_string(self)
134
+ end
135
+
136
+ def get_float
137
+ CTF.bt_ctf_get_float(self)
138
+ end
139
+
140
+ def get_variant
141
+ d = CTF.bt_ctf_get_variant(self)
142
+ CTF::Definition.create(d)
143
+ end
144
+
145
+ def get_struct_field_index(i)
146
+ d = CTF.bt_ctf_get_struct_field_index(self, i)
147
+ CTF::Definition.create(d)
148
+ end
149
+ end
150
+ end
151
+
152
+ attach_function :bt_ctf_field_name, [Internal::Definition], :string
153
+ attach_function :bt_ctf_get_decl_from_def, [Internal::Definition], Internal::Declaration.by_ref
154
+ attach_function :bt_ctf_get_struct_field_count, [Internal::Definition], :uint64
155
+ attach_function :bt_ctf_get_uint64, [Internal::Definition], :uint64
156
+ attach_function :bt_ctf_get_int64, [Internal::Definition], :int64
157
+ attach_function :bt_ctf_get_enum_int, [Internal::Definition], Internal::Definition.by_ref
158
+ attach_function :bt_ctf_get_enum_str, [Internal::Definition], :string
159
+ attach_function :bt_ctf_get_char_array, [Internal::Definition], :pointer
160
+ attach_function :bt_ctf_get_string, [Internal::Definition], :string
161
+ attach_function :bt_ctf_get_float, [Internal::Definition], :double
162
+ attach_function :bt_ctf_get_variant, [Internal::Definition], Internal::Definition.by_ref
163
+ attach_function :bt_ctf_get_struct_field_index, [Internal::Definition, :uint64], Internal::Definition.by_ref
164
+
165
+ module Internal
166
+ class EventDecl < FFI::Struct
167
+ layout :dummy, :pointer
168
+
169
+ def get_name
170
+ CTF.bt_ctf_get_decl_event_name(self)
171
+ end
172
+ alias name get_name
173
+
174
+ def get_decl_fields(scope)
175
+ count = FFI::MemoryPointer::new(:uint)
176
+ list = FFI::MemoryPointer::new(:pointer)
177
+ res = CTF.bt_ctf_get_decl_fields(self, scope, list, count)
178
+ count = count.read(:uint)
179
+ list = list.read_pointer.read_array_of_pointer(count)
180
+ list.collect { |p| FieldDecl::new(p) }
181
+ end
182
+ end
183
+ end
184
+
185
+ attach_function :bt_ctf_get_decl_event_name, [Internal::EventDecl], :string
186
+ attach_function :bt_ctf_get_decl_fields, [Internal::EventDecl, Scope, :pointer, :pointer], :int
187
+
188
+ class Trace < Babeltrace::Trace
189
+ def get_event_decl_list
190
+ count = FFI::MemoryPointer::new(:uint)
191
+ list = FFI::MemoryPointer::new(:pointer)
192
+ res = CTF.bt_ctf_get_event_decl_list(@handle_id, @context, list, count)
193
+ count = count.read(:uint)
194
+ list = list.read_pointer.read_array_of_pointer(count)
195
+ list.collect { |p| Internal::EventDecl::new(p) }
196
+ end
197
+ end
198
+
199
+ attach_function :bt_ctf_get_event_decl_list, [:int, Context, :pointer, :pointer], :int
200
+
201
+ class Event
202
+ def get_context
203
+ c = CTF.bt_ctf_event_get_context(self)
204
+ Babeltrace.bt_context_get(c)
205
+ c
206
+ end
207
+ alias context get_context
208
+
209
+ def get_handle_id
210
+ CTF.bt_ctf_event_get_handle_id(self)
211
+ end
212
+ alias handle_id get_handle_id
213
+
214
+ def get_top_level_scope(scope)
215
+ d = CTF.bt_ctf_get_top_level_scope(self, scope)
216
+ Definition.create(d)
217
+ end
218
+ alias top_level_scope get_top_level_scope
219
+
220
+ def event_name
221
+ CTF.bt_ctf_event_name(self)
222
+ end
223
+ alias name event_name
224
+
225
+ def get_cycles
226
+ CTF.bt_ctf_get_cycles(self)
227
+ end
228
+ alias cycles get_cycles
229
+
230
+ def get_timestamp
231
+ Time.at(0, CTF.bt_ctf_get_timestamp(self), :nsec)
232
+ end
233
+ alias timestamp get_timestamp
234
+
235
+ def get_field_list(scope)
236
+ count = FFI::MemoryPointer::new(:uint)
237
+ list = FFI::MemoryPointer::new(:pointer)
238
+ res = CTF.bt_ctf_get_field_list(self, scope.definition, list, count)
239
+ count = count.read(:uint)
240
+ return [] if count == 0
241
+ list = list.read_pointer.read_array_of_pointer(count)
242
+ list.collect { |p| Internal::Definition::new(p) }.collect { |d| Definition.create(d) }
243
+ end
244
+ alias field_list get_field_list
245
+
246
+ def get_field(scope, field)
247
+ d = CTF.bt_ctf_get_field(self, scope.definition, field)
248
+ Definition.create(d)
249
+ end
250
+
251
+ def each_field(scope = :EVENT_FIELDS)
252
+ if block_given?
253
+ sc = self.top_level_scope(scope)
254
+ self.field_list(sc).each { |f| yield f }
255
+ else
256
+ return to_enum(:each_field, scope)
257
+ end
258
+ end
259
+
260
+ def find_field(field, scope = :EVENT_FIELDS)
261
+ sc = self.top_level_scope(scope)
262
+ d = get_field(sc, field)
263
+ Definition.create(d)
264
+ end
265
+
266
+ def get_index(field, index)
267
+ d = CTF.bt_ctf_get_index(self, field.definition, index)
268
+ Definition.create(d)
269
+ end
270
+
271
+ end
272
+
273
+ attach_function :bt_ctf_event_get_context, [Event], Context.by_ref
274
+ attach_function :bt_ctf_event_get_handle_id, [Event], :int
275
+ attach_function :bt_ctf_get_top_level_scope, [Event, Scope], Internal::Definition.by_ref
276
+ attach_function :bt_ctf_event_name, [Event], :string
277
+ attach_function :bt_ctf_get_cycles, [Event], :uint64
278
+ attach_function :bt_ctf_get_timestamp, [Event], :uint64
279
+ attach_function :bt_ctf_get_field_list, [Event, Internal::Definition, :pointer, :pointer], :int
280
+ attach_function :bt_ctf_get_field, [Event, Internal::Definition, :string], Internal::Definition.by_ref
281
+ attach_function :bt_ctf_get_index, [Event, Internal::Definition, :uint], Internal::Definition.by_ref
282
+ # Hack
283
+ attach_function :bt_array_index, [Internal::Definition, :uint64], Internal::Definition.by_ref
284
+ attach_function :bt_sequence_len, [Internal::Definition], :uint64
285
+ attach_function :bt_sequence_index, [Internal::Definition, :uint64], Internal::Definition.by_ref
286
+
287
+ class Definition
288
+ attr_reader :definition
289
+
290
+ def self.create(d)
291
+ return nil if d.pointer.null?
292
+ d.decl.def_class.new(d)
293
+ end
294
+
295
+ def initialize(definition)
296
+ @definition = definition
297
+ end
298
+
299
+ def name
300
+ @definition.name
301
+ end
302
+
303
+ def decl
304
+ @definition.decl
305
+ end
306
+ end
307
+
308
+ class StructDef < Definition
309
+ def field_count
310
+ @definition.get_struct_field_count
311
+ end
312
+
313
+ def field(i)
314
+ @definition.get_struct_field_index(i)
315
+ end
316
+
317
+ def value
318
+ field_count.times.collect { |i|
319
+ f = field(i)
320
+ [f.name, f.value]
321
+ }.to_h
322
+ end
323
+ end
324
+
325
+ class IntegerDef < Definition
326
+ def int
327
+ @definition.decl.signed? ? @definition.get_int64 : @definition.get_uint64
328
+ end
329
+ alias value int
330
+ end
331
+
332
+ class FloatDef < Definition
333
+ def float
334
+ @definition.get_float
335
+ end
336
+ alias value float
337
+ end
338
+
339
+ class EnumDef < Definition
340
+ def int
341
+ IntegerDef::new(@definition.get_enum_int)
342
+ end
343
+
344
+ def string
345
+ @definition.get_enum_str
346
+ end
347
+ alias value string
348
+ end
349
+
350
+ class StringDef < Definition
351
+ def string
352
+ @definition.get_string
353
+ end
354
+ alias value string
355
+ end
356
+
357
+ class UntaggedVariantDef < Definition
358
+ def variant
359
+ @definition.get_variant
360
+ end
361
+
362
+ def value
363
+ variant.value
364
+ end
365
+ end
366
+
367
+ class VariantDef < Definition
368
+ def variant
369
+ @definition.get_variant
370
+ end
371
+
372
+ def value
373
+ variant.value
374
+ end
375
+ end
376
+
377
+ class ArrayDef < Definition
378
+ def len
379
+ @definition.decl.len
380
+ end
381
+
382
+ def index(i)
383
+ d = CTF.bt_array_index(@definition, i)
384
+ return Definition.create(d)
385
+ end
386
+
387
+ def value
388
+ len.times.collect { |i| index(i).value }
389
+ end
390
+ end
391
+
392
+ class ArrayTextDef < Definition
393
+ def len
394
+ @definition.decl.array_len
395
+ end
396
+
397
+ def value
398
+ @definition.get_char_array.read_bytes(len)
399
+ end
400
+ end
401
+
402
+ class SequenceDef < Definition
403
+ def len
404
+ CTF.bt_sequence_len(@definition)
405
+ end
406
+
407
+ def index(i)
408
+ d = CTF.bt_sequence_index(@definition, i)
409
+ return Definition.create(d)
410
+ end
411
+
412
+ def value
413
+ len.times.collect { |i| index(i).value }
414
+ end
415
+ end
416
+
417
+ class SequenceTextDef < Definition
418
+ def len
419
+ CTF.bt_sequence_len(@definition)
420
+ end
421
+
422
+ def value
423
+ return [] if len == 0
424
+ @definition.get_char_sequence.read_bytes(len)
425
+ end
426
+ end
427
+
428
+ class Declaration
429
+ attr_reader :declaration
430
+
431
+ def self.create(decl)
432
+ return nil if decl.pointer.null?
433
+ case decl.field_type
434
+ when :INTEGER
435
+ IntegerDecl::new(decl)
436
+ when :FLOAT
437
+ FloatDecl::new(decl)
438
+ when :ENUM
439
+ EnumDecl::new(decl)
440
+ when :STRING
441
+ StringDecl::new(decl)
442
+ when :STRUCT
443
+ StructDecl::new(decl)
444
+ when :UNTAGGED_VARIANT
445
+ UntaggedVariantDecl::new(decl)
446
+ when :VARIANT
447
+ VariantDecl::new(decl)
448
+ when :ARRAY
449
+ ArrayDecl::new(decl)
450
+ when :SEQUENCE
451
+ SequenceDecl::new(decl)
452
+ else
453
+ raise "Unknow declaration type #{d.decl.field_type}!"
454
+ end
455
+ end
456
+
457
+ def initialize(declaration)
458
+ @declaration = declaration
459
+ end
460
+
461
+ def field_type
462
+ @declaration.field_type
463
+ end
464
+ end
465
+
466
+ class StructDecl < Declaration
467
+ def def_class
468
+ StructDef
469
+ end
470
+ end
471
+
472
+ class IntegerDecl < Declaration
473
+ def def_class
474
+ IntegerDef
475
+ end
476
+
477
+ def signed?
478
+ @declaration.int_signed?
479
+ end
480
+
481
+ def base
482
+ @declaration.get_int_base
483
+ end
484
+
485
+ def byte_order
486
+ @declaration.get_int_byte_order
487
+ end
488
+
489
+ def len
490
+ @declaration.get_int_len
491
+ end
492
+
493
+ def encoding
494
+ @declaration.get_encoding
495
+ end
496
+
497
+ end
498
+
499
+ class FloatDecl < Declaration
500
+ def def_class
501
+ FloatDef
502
+ end
503
+ end
504
+
505
+ class EnumDecl < Declaration
506
+ def def_class
507
+ EnumDef
508
+ end
509
+ end
510
+
511
+ class StringDecl < Declaration
512
+ def def_class
513
+ StringDef
514
+ end
515
+ end
516
+
517
+ class UntaggedVariantDecl < Declaration
518
+ def def_class
519
+ UntaggedVariantDef
520
+ end
521
+ end
522
+
523
+ class VariantDecl < Declaration
524
+ def def_class
525
+ VariantDef
526
+ end
527
+ end
528
+
529
+ class ArrayDecl # < Declaration
530
+ def def_class
531
+ e = elem
532
+ if e.kind_of?(IntegerDecl) && e.len == 8 &&
533
+ ( e.encoding == :ASCII || e.encoding == :UTF8 )
534
+ ArrayTextDef
535
+ else
536
+ ArrayDef
537
+ end
538
+ end
539
+
540
+ def len
541
+ @declaration.get_array_len
542
+ end
543
+ end
544
+
545
+ class SequenceDecl # < Declaration
546
+ def def_class
547
+ e = elem
548
+ if e.kind_of?(IntegerDecl) && e.len == 8 &&
549
+ ( e.encoding == :ASCII || e.encoding == :UTF8 )
550
+ SequenceTextDef
551
+ else
552
+ SequenceDef
553
+ end
554
+ end
555
+ end
556
+
557
+ end
558
+ end