babeltrace2 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/babeltrace2.gemspec +13 -0
  4. data/lib/babeltrace2.rb +49 -0
  5. data/lib/babeltrace2/error-reporting.rb +432 -0
  6. data/lib/babeltrace2/func-status.rb +26 -0
  7. data/lib/babeltrace2/graph/component-class-dev.rb +801 -0
  8. data/lib/babeltrace2/graph/component-class.rb +134 -0
  9. data/lib/babeltrace2/graph/component-descriptor-set.rb +78 -0
  10. data/lib/babeltrace2/graph/component.rb +362 -0
  11. data/lib/babeltrace2/graph/connection.rb +35 -0
  12. data/lib/babeltrace2/graph/graph.rb +523 -0
  13. data/lib/babeltrace2/graph/interrupter.rb +57 -0
  14. data/lib/babeltrace2/graph/message-iterator-class.rb +374 -0
  15. data/lib/babeltrace2/graph/message-iterator.rb +253 -0
  16. data/lib/babeltrace2/graph/message.rb +721 -0
  17. data/lib/babeltrace2/graph/port.rb +124 -0
  18. data/lib/babeltrace2/graph/private-query-executor.rb +4 -0
  19. data/lib/babeltrace2/graph/query-executor.rb +142 -0
  20. data/lib/babeltrace2/graph/self-component-class.rb +37 -0
  21. data/lib/babeltrace2/graph/self-component-port.rb +35 -0
  22. data/lib/babeltrace2/graph/self-component.rb +264 -0
  23. data/lib/babeltrace2/graph/self-message-iterator.rb +147 -0
  24. data/lib/babeltrace2/integer-range-set.rb +275 -0
  25. data/lib/babeltrace2/logging-defs.rb +19 -0
  26. data/lib/babeltrace2/logging.rb +77 -0
  27. data/lib/babeltrace2/plugin/plugin-dev.rb +335 -0
  28. data/lib/babeltrace2/plugin/plugin-loading.rb +459 -0
  29. data/lib/babeltrace2/trace-ir/clock-class.rb +258 -0
  30. data/lib/babeltrace2/trace-ir/clock-snapshot.rb +45 -0
  31. data/lib/babeltrace2/trace-ir/event-class.rb +292 -0
  32. data/lib/babeltrace2/trace-ir/event.rb +91 -0
  33. data/lib/babeltrace2/trace-ir/field-class.rb +1416 -0
  34. data/lib/babeltrace2/trace-ir/field-path.rb +123 -0
  35. data/lib/babeltrace2/trace-ir/field.rb +871 -0
  36. data/lib/babeltrace2/trace-ir/packet.rb +57 -0
  37. data/lib/babeltrace2/trace-ir/stream-class.rb +425 -0
  38. data/lib/babeltrace2/trace-ir/stream.rb +137 -0
  39. data/lib/babeltrace2/trace-ir/trace-class.rb +343 -0
  40. data/lib/babeltrace2/trace-ir/trace.rb +321 -0
  41. data/lib/babeltrace2/types.rb +667 -0
  42. data/lib/babeltrace2/util.rb +23 -0
  43. data/lib/babeltrace2/value.rb +869 -0
  44. data/lib/babeltrace2/version.rb +126 -0
  45. metadata +105 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b661027d46180b1a162ce91aad9ad783e5700abc1182199408d19c61410f2df6
4
+ data.tar.gz: 9f207749e36ecf12c8e0aae0b54749f967e1aa9830b4bf38b72eac47d1443017
5
+ SHA512:
6
+ metadata.gz: b5b73639f60a15169307c2c52708478211e445298a294d98bc745ee364c2a009e4a320008c58fac46b3408483ef487869b8a77d88f45e91f8d77d3cd140c960e
7
+ data.tar.gz: feb554583fb6ad8e3ac8c80f148a44fe497295167891f0bac620933848b4f8b36c5d57d5751dca613fcabc427c012913c7699f856d3f46c0467a9eaac2ad4bde
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 alcf-perfengr
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,13 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'babeltrace2'
3
+ s.version = "0.1.0"
4
+ s.author = "Brice Videau"
5
+ s.email = "bvideau@anl.gov"
6
+ s.homepage = "https://github.com/alcf-perfengr/babeltrace2-ruby"
7
+ s.summary = "Ruby Babeltrace 2 bindings"
8
+ s.description = "Ruby Babeltrace 2 ffi bindings"
9
+ s.files = Dir[ 'babeltrace2.gemspec', 'LICENSE', 'lib/**/**/*.rb', 'ext/**/*.rb' ]
10
+ s.license = 'MIT'
11
+ s.required_ruby_version = '>= 2.3.0'
12
+ s.add_dependency 'ffi', '~> 1.9', '>=1.9.3'
13
+ end
@@ -0,0 +1,49 @@
1
+ require 'ffi'
2
+
3
+ module Babeltrace2
4
+ extend FFI::Library
5
+ ffi_lib "babeltrace2"
6
+ end
7
+
8
+ require_relative 'babeltrace2/func-status'
9
+ require_relative 'babeltrace2/logging-defs'
10
+ require_relative 'babeltrace2/logging'
11
+ require_relative 'babeltrace2/types'
12
+ require_relative 'babeltrace2/integer-range-set'
13
+ require_relative 'babeltrace2/value'
14
+ require_relative 'babeltrace2/version'
15
+ require_relative 'babeltrace2/util'
16
+ require_relative 'babeltrace2/graph/port'
17
+ require_relative 'babeltrace2/graph/connection'
18
+ require_relative 'babeltrace2/graph/component-class'
19
+ require_relative 'babeltrace2/graph/component-class-dev'
20
+ require_relative 'babeltrace2/graph/component'
21
+ require_relative 'babeltrace2/graph/self-component-class'
22
+ require_relative 'babeltrace2/graph/self-component'
23
+ require_relative 'babeltrace2/graph/self-component-port'
24
+ require_relative 'babeltrace2/graph/graph'
25
+ require_relative 'babeltrace2/graph/message-iterator-class'
26
+ require_relative 'babeltrace2/graph/message-iterator'
27
+ require_relative 'babeltrace2/graph/self-message-iterator'
28
+ require_relative 'babeltrace2/graph/message'
29
+ require_relative 'babeltrace2/graph/component-descriptor-set'
30
+ require_relative 'babeltrace2/graph/interrupter'
31
+ require_relative 'babeltrace2/graph/query-executor'
32
+ require_relative 'babeltrace2/graph/private-query-executor'
33
+ require_relative 'babeltrace2/error-reporting'
34
+ require_relative 'babeltrace2/plugin/plugin-loading'
35
+ require_relative 'babeltrace2/plugin/plugin-dev'
36
+ require_relative 'babeltrace2/trace-ir/clock-class'
37
+ require_relative 'babeltrace2/trace-ir/clock-snapshot'
38
+ require_relative 'babeltrace2/trace-ir/event'
39
+ require_relative 'babeltrace2/trace-ir/event-class'
40
+ require_relative 'babeltrace2/trace-ir/field-class'
41
+ require_relative 'babeltrace2/trace-ir/field'
42
+ require_relative 'babeltrace2/trace-ir/field-path'
43
+ require_relative 'babeltrace2/trace-ir/packet'
44
+ require_relative 'babeltrace2/trace-ir/stream-class'
45
+ require_relative 'babeltrace2/trace-ir/stream'
46
+ require_relative 'babeltrace2/trace-ir/trace-class'
47
+ require_relative 'babeltrace2/trace-ir/trace'
48
+
49
+ BT2 = Babeltrace2
@@ -0,0 +1,432 @@
1
+ module Babeltrace2
2
+
3
+ BTErrorCauseActorType = enum :bt_error_cause_actor_type,
4
+ [ :BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN, 1 << 0,
5
+ :BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT, 1 << 1,
6
+ :BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS, 1 << 2,
7
+ :BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR, 1 << 3]
8
+
9
+ class BTError < BTObject
10
+ end
11
+
12
+ attach_function :bt_error_cause_get_actor_type,
13
+ [:bt_error_cause_handle],
14
+ :bt_error_cause_actor_type
15
+ attach_function :bt_error_cause_get_message,
16
+ [:bt_error_cause_handle],
17
+ :string
18
+ attach_function :bt_error_cause_get_module_name,
19
+ [:bt_error_cause_handle],
20
+ :string
21
+ attach_function :bt_error_cause_get_file_name,
22
+ [:bt_error_cause_handle],
23
+ :string
24
+ attach_function :bt_error_cause_get_line_number,
25
+ [:bt_error_cause_handle],
26
+ :uint64_t
27
+
28
+ class BTError
29
+ class Cause < BTObject
30
+ ActorType = BTErrorCauseActorType
31
+
32
+ def self.from_handle(handle)
33
+ case Babeltrace2.bt_error_cause_get_actor_type(handle)
34
+ when :BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN
35
+ Cause
36
+ when :BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT
37
+ ComponentActor
38
+ when :BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS
39
+ ComponentClassActor
40
+ when :BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR
41
+ MessageIteratorActor
42
+ else
43
+ raise Error.new("Unknown error cause actor type")
44
+ end.new(handle)
45
+ end
46
+
47
+ def get_actor_type
48
+ Babeltrace2.bt_error_cause_get_actor_type(@handle)
49
+ end
50
+ alias actor_type get_actor_type
51
+
52
+ def get_message
53
+ Babeltrace2.bt_error_cause_get_message(@handle)
54
+ end
55
+ alias message get_message
56
+
57
+ def get_module_name
58
+ Babeltrace2.bt_error_cause_get_module_name(@handle)
59
+ end
60
+ alias module_name get_module_name
61
+
62
+ def get_file_name
63
+ Babeltrace2.bt_error_cause_get_file_name(@handle)
64
+ end
65
+ alias file_name get_file_name
66
+
67
+ def get_line_number
68
+ Babeltrace2.bt_error_cause_get_line_number(@handle)
69
+ end
70
+ alias line_number get_line_number
71
+ end
72
+ end
73
+ BTErrorCause = BTError::Cause
74
+
75
+ attach_function :bt_error_cause_component_actor_get_component_name,
76
+ [:bt_error_cause_handle],
77
+ :string
78
+ attach_function :bt_error_cause_component_actor_get_component_class_type,
79
+ [:bt_error_cause_handle],
80
+ :bt_component_class_type
81
+ attach_function :bt_error_cause_component_actor_get_component_class_name,
82
+ [:bt_error_cause_handle],
83
+ :string
84
+ attach_function :bt_error_cause_component_actor_get_plugin_name,
85
+ [:bt_error_cause_handle],
86
+ :string
87
+
88
+ class BTError::Cause
89
+ class ComponentActor < BTError::Cause
90
+ def get_component_name
91
+ Babeltrace2.bt_error_cause_component_actor_get_component_name(@handle)
92
+ end
93
+ alias component_name get_component_name
94
+
95
+ def get_component_class_type
96
+ Babeltrace2.bt_error_cause_component_actor_get_component_class_type(@handle)
97
+ end
98
+ alias component_class_type get_component_class_type
99
+
100
+ def get_component_class_name
101
+ Babeltrace2.bt_error_cause_component_actor_get_component_class_name(@handle)
102
+ end
103
+ alias component_class_name get_component_class_name
104
+
105
+ def get_component_plugin_name
106
+ Babeltrace2.bt_error_cause_component_actor_get_component_plugin_name(@handle)
107
+ end
108
+ alias component_plugin_name get_component_plugin_name
109
+ end
110
+ end
111
+ BTErrorCauseComponentActor = BTError::Cause::ComponentActor
112
+
113
+ attach_function :bt_error_cause_message_iterator_actor_get_component_output_port_name,
114
+ [:bt_error_cause_handle],
115
+ :string
116
+ attach_function :bt_error_cause_message_iterator_actor_get_component_name,
117
+ [:bt_error_cause_handle],
118
+ :string
119
+ attach_function :bt_error_cause_message_iterator_actor_get_component_class_type,
120
+ [:bt_error_cause_handle],
121
+ :bt_component_class_type
122
+ attach_function :bt_error_cause_message_iterator_actor_get_component_class_name,
123
+ [:bt_error_cause_handle],
124
+ :string
125
+ attach_function :bt_error_cause_message_iterator_actor_get_plugin_name,
126
+ [:bt_error_cause_handle],
127
+ :string
128
+
129
+ class BTError::Cause
130
+ class MessageIteratorActor < BTError::Cause
131
+ def get_component_output_port_name
132
+ Babeltrace2.bt_error_cause_message_iterator_actor_get_component_output_port_name(@handle)
133
+ end
134
+ alias component_output_port_name get_component_output_port_name
135
+
136
+ def get_component_name
137
+ Babeltrace2.bt_error_cause_message_iterator_actor_get_component_name(@handle)
138
+ end
139
+ alias component_name get_component_name
140
+
141
+ def get_component_class_type
142
+ Babeltrace2.bt_error_cause_message_iterator_actor_get_component_class_type(@handle)
143
+ end
144
+ alias component_class_type get_component_class_type
145
+
146
+ def get_component_class_name
147
+ Babeltrace2.bt_error_cause_message_iterator_actor_get_component_class_name(@handle)
148
+ end
149
+ alias component_class_name get_component_class_name
150
+
151
+ def get_plugin_name
152
+ Babeltrace2.bt_error_cause_message_iterator_actor_get_plugin_name(@handle)
153
+ end
154
+ alias plugin_name get_plugin_name
155
+ end
156
+ end
157
+ BTErrorCauseMessageIteratorActor = BTError::Cause::MessageIteratorActor
158
+
159
+ attach_function :bt_error_cause_component_class_actor_get_component_class_type,
160
+ [:bt_error_cause_handle],
161
+ :bt_component_class_type
162
+ attach_function :bt_error_cause_component_class_actor_get_component_class_name,
163
+ [:bt_error_cause_handle],
164
+ :string
165
+ attach_function :bt_error_cause_component_class_actor_get_plugin_name,
166
+ [:bt_error_cause_handle],
167
+ :string
168
+
169
+ class BTError::Cause
170
+ class ComponentClassActor < BTError::Cause
171
+ def get_component_class_type
172
+ Babeltrace2.bt_error_cause_component_class_actor_get_component_class_type(@hanlde)
173
+ end
174
+ alias component_class_type get_component_class_type
175
+
176
+ def get_component_class_name
177
+ Babeltrace2.bt_error_cause_component_class_actor_get_component_class_name(@handle)
178
+ end
179
+ alias get_component_class_name get_component_class_name
180
+
181
+ def get_plugin_name
182
+ Babeltrace2.bt_error_cause_component_class_actor_get_plugin_name(@handle)
183
+ end
184
+ alias plugin_name get_plugin_name
185
+ end
186
+ end
187
+ BTErrorCauseComponentClassActor = BTError::Cause::ComponentClassActor
188
+
189
+ BTCurrentThreadErrorAppendCauseStatus = enum :bt_current_thread_error_append_cause_status,
190
+ [ :BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK, BT_FUNC_STATUS_OK,
191
+ :BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_MEMORY_ERROR, BT_FUNC_STATUS_MEMORY_ERROR ]
192
+
193
+ attach_function :bt_current_thread_take_error,
194
+ [],
195
+ :bt_error_handle
196
+ attach_function :bt_current_thread_move_error,
197
+ [:bt_error_handle],
198
+ :void
199
+ attach_function :bt_current_thread_clear_error,
200
+ [],
201
+ :void
202
+ attach_function :bt_current_thread_error_append_cause_from_component,
203
+ [:bt_self_component_handle, :string, :uint64, :string, :varargs],
204
+ :bt_current_thread_error_append_cause_status
205
+ attach_function :bt_current_thread_error_append_cause_from_message_iterator,
206
+ [:bt_self_message_iterator_handle, :string, :uint64, :string, :varargs],
207
+ :bt_current_thread_error_append_cause_status
208
+ attach_function :bt_current_thread_error_append_cause_from_component_class,
209
+ [:bt_self_component_class_handle, :string, :uint64, :string, :varargs],
210
+ :bt_current_thread_error_append_cause_status
211
+ attach_function :bt_current_thread_error_append_cause_from_unknown,
212
+ [:string, :string, :uint64, :string, :varargs],
213
+ :bt_current_thread_error_append_cause_status
214
+
215
+ module BTCurrentThread
216
+ ErrorAppendCauseStatus = BTCurrentThreadErrorAppendCauseStatus
217
+ def self.take_error
218
+ handle = Babeltrace2.bt_current_thread_take_error
219
+ return nil if handle.null?
220
+ BTError.new(handle)
221
+ end
222
+
223
+ def self.clear_error
224
+ Babeltrace2.bt_current_thread_clear_error
225
+ self
226
+ end
227
+
228
+ def self.move_error(error)
229
+ raise Error.new("Error already released") unless error.handle
230
+ Babeltrace2.bt_current_thread_move_error(error.handle)
231
+ error.instance_variable_set(:@handle, nil)
232
+ self
233
+ end
234
+
235
+ module Error
236
+ AppendCauseStatus = BTCurrentThreadErrorAppendCauseStatus
237
+ def self.append_cause_from_component(self_component, message_format, *args,
238
+ file_name: nil, line_number: nil)
239
+ loc = caller_locations.first
240
+ file_name = loc.path unless file_name
241
+ line_number = loc.lineno unless line_number
242
+ res = Babeltrace2.bt_current_thread_error_append_cause_from_component(
243
+ self_component, file_name, line_number, message_format, *args)
244
+ raise res.to_s if res != :BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK
245
+ self
246
+ end
247
+
248
+ def self.append_cause_from_message_iterator(self_message_iterator, message_format,
249
+ *args, file_name: nil, line_number: nil)
250
+ loc = caller_locations.first
251
+ file_name = loc.path unless file_name
252
+ line_number = loc.lineno unless line_number
253
+ res = Babeltrace2.bt_current_thread_error_append_cause_from_message_iterator(
254
+ self_message_iterator, file_name, line_number, message_format, *args)
255
+ raise res.to_s if res != :BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK
256
+ self
257
+ end
258
+
259
+ def self.append_cause_from_component_class(self_component_class, message_format,
260
+ *args, file_name: nil, line_number: nil)
261
+ loc = caller_locations.first
262
+ file_name = loc.path unless file_name
263
+ line_number = loc.lineno unless line_number
264
+ res = Babeltrace2.bt_current_thread_error_append_cause_from_component_class(
265
+ self_component_class, file_name, line_number, message_format, *args)
266
+ raise res.to_s if res != :BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK
267
+ self
268
+ end
269
+
270
+ def self.append_cause_from_unknown(module_name, message_format, *args,
271
+ file_name: nil, line_number: nil)
272
+ loc = caller_locations.first
273
+ file_name = loc.path unless file_name
274
+ line_number = loc.lineno unless line_number
275
+ res = Babeltrace2.bt_current_thread_error_append_cause_from_unknown(
276
+ module_name, file_name, line_number, message_format, *args)
277
+ raise res.to_s if res != :BT_CURRENT_THREAD_ERROR_APPEND_CAUSE_STATUS_OK
278
+ self
279
+ end
280
+ end
281
+ end
282
+
283
+ attach_function :bt_error_get_cause_count,
284
+ [:bt_error_handle],
285
+ :uint64
286
+ attach_function :bt_error_borrow_cause_by_index,
287
+ [:bt_error_handle, :uint64],
288
+ :bt_error_cause_handle
289
+ attach_function :bt_error_release,
290
+ [:bt_error_handle],
291
+ :void
292
+
293
+ class BTError
294
+ def get_cause_count
295
+ raise Error.new("Error already released") unless @handle
296
+ Babeltrace2.bt_error_get_cause_count(@handle)
297
+ end
298
+ alias cause_count get_cause_count
299
+
300
+ def get_cause_by_index(indx)
301
+ return nil unless indx < get_cause_count
302
+ ref = Babeltrace2.bt_error_borrow_cause_by_index(@handle, indx)
303
+ Cause.new(ref)
304
+ end
305
+
306
+ def causes
307
+ get_cause_count.times.collect { |i|
308
+ ref = Babeltrace2.bt_error_borrow_cause_by_index(@handle, i)
309
+ Cause.new(ref)
310
+ }
311
+ end
312
+
313
+ def release
314
+ raise Error.new("Error already released") unless @handle
315
+ Babeltrace2.bt_error_release(@handle)
316
+ @handle = nil
317
+ end
318
+
319
+ def to_s
320
+ str = ""
321
+ causes.each { |c|
322
+ file_name = c.file_name
323
+ line_number = c.line_number
324
+ str << file_name << ":" if file_name
325
+ str << line_number.to_s << ":" if line_number
326
+ str << " "
327
+ str << c.message
328
+ str << "\n"
329
+ }
330
+ str
331
+ end
332
+
333
+ def exception_params()
334
+ klass = nil
335
+ message = nil
336
+ backtrace = []
337
+ cs = causes
338
+ return [klass, message, backtrace] if cs.empty?
339
+ c = cs.first
340
+ mess = c.message
341
+ m = mess.match(/ ::(.*?): (.*)/m)
342
+ if m
343
+ klass = m[1]
344
+ message = m[2]
345
+ mess.sub!( m[0], "" )
346
+ end
347
+ item = ""
348
+ item << c.file_name << ":"
349
+ item << c.line_number.to_s
350
+ item << (mess.match(/:in /) ? mess : ".")
351
+ backtrace.push(item)
352
+ cs[1..-1].each { |c|
353
+ item = ""
354
+ item << c.file_name << ":"
355
+ item << c.line_number.to_s
356
+ mess = c.message
357
+ item << (mess.match(/:in /) ? mess : ".")
358
+ backtrace.push(item)
359
+ }
360
+ [klass, message, backtrace]
361
+ end
362
+ end
363
+
364
+ def self.stack_error(source, message, absolute_path, lineno)
365
+ case source
366
+ when BTSelfComponent, BTSelfComponentHandle
367
+ BTCurrentThread::Error.append_cause_from_component(
368
+ source, message, file_name: absolute_path, line_number: lineno)
369
+ when BTSelfComponentClass, BTSelfComponentClassHandle
370
+ BTCurrentThread::Error.append_cause_from_component_class(
371
+ source, message, file_name: absolute_path, line_number: lineno)
372
+ when BTSelfMessageIterator, BTSelfMessageIteratorHandle
373
+ BTCurrentThread::Error.append_cause_from_message_iterator(
374
+ source, message, file_name: absolute_path, line_number: lineno)
375
+ else
376
+ BTCurrentThread::Error.append_cause_from_unknown(
377
+ "babeltrace2-ruby", message, file_name: absolute_path, line_number: lineno)
378
+ end
379
+ end
380
+
381
+ def self.stack_ruby_error(err, source: nil)
382
+ mess = "#{err.class}: #{err.message}"
383
+ backtrace_locations = err.backtrace_locations
384
+ if backtrace_locations
385
+ err.backtrace_locations.each { |loc|
386
+ lineno = loc.lineno
387
+ absolute_path = loc.absolute_path
388
+ label = loc.label
389
+ message = ""
390
+ if label
391
+ message << ":in `" << label << "'"
392
+ else
393
+ message << "."
394
+ end
395
+ message << " :: " << mess if mess
396
+ stack_error(source, message, absolute_path, lineno)
397
+ mess = nil
398
+ }
399
+ else
400
+ err.backtrace.each { |loc|
401
+ m = loc.match(/(.*?):(\d*)([\.:].*)/)
402
+ if m
403
+ absolute_path = m[1]
404
+ lineno = m[2].to_i
405
+ message = m[3]
406
+ message << " :: " << mess if mess
407
+ stack_error(source, message, absolute_path, lineno)
408
+ mess = nil
409
+ end
410
+ }
411
+ end
412
+ end
413
+
414
+ def self.process_error(code = :BT_FUNC_STATUS_MEMORY_ERROR)
415
+ err = BTCurrentThread.take_error
416
+ if err
417
+ klass, message, backtrace = err.exception_params
418
+ err.release
419
+ else
420
+ klass, message, backtrace = nil, nil, []
421
+ end
422
+ if klass
423
+ klass = eval(klass)
424
+ e = klass.new(message)
425
+ else
426
+ message = "#{code}" unless message
427
+ e = Error.new
428
+ end
429
+ e.set_backtrace(backtrace+caller_locations.collect(&:to_s))
430
+ e
431
+ end
432
+ end