Python-bindings: Move the _scopes array out of the Event class
[babeltrace.git] / bindings / python / babeltrace.i.in
1 /*
2 * babeltrace.i.in
3 *
4 * Babeltrace Python Module interface file
5 *
6 * Copyright 2012 EfficiOS Inc.
7 *
8 * Author: Danny Serres <danny.serres@efficios.com>
9 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 */
21
22
23 %define DOCSTRING
24 "BABELTRACE_VERSION_STR
25
26 Babeltrace is a trace viewer and converter reading and writing the
27 Common Trace Format (CTF). Its main use is to pretty-print CTF
28 traces into a human-readable text output.
29
30 To use this module, the first step is to create a TraceCollection and add a
31 trace to it."
32 %enddef
33
34 %module(docstring=DOCSTRING) babeltrace
35
36 %include "typemaps.i"
37 %{
38 #define SWIG_FILE_WITH_INIT
39 #include <babeltrace/babeltrace.h>
40 #include <babeltrace/babeltrace-internal.h>
41 #include <babeltrace/trace-handle.h>
42 #include <babeltrace/trace-handle-internal.h>
43 #include <babeltrace/context.h>
44 #include <babeltrace/context-internal.h>
45 #include <babeltrace/iterator.h>
46 #include <babeltrace/iterator-internal.h>
47 #include <babeltrace/format.h>
48 #include <babeltrace/list.h>
49 #include <babeltrace/types.h>
50 #include <babeltrace/ctf/iterator.h>
51 #include "python-complements.h"
52 #include <babeltrace/ctf-writer/clock.h>
53 #include <babeltrace/ctf-writer/event-fields.h>
54 #include <babeltrace/ctf-writer/event-types.h>
55 #include <babeltrace/ctf-writer/event.h>
56 #include <babeltrace/ctf-writer/stream.h>
57 #include <babeltrace/ctf-writer/writer.h>
58 %}
59
60 typedef unsigned long long uint64_t;
61 typedef long long int64_t;
62 typedef int bt_intern_str;
63
64 /* =================================================================
65 PYTHON-COMPLEMENTS.H
66 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
67 */
68
69 FILE *_bt_file_open(char *file_path, char *mode);
70 void _bt_file_close(FILE *fp);
71 struct bt_definition **_bt_python_field_listcaller(
72 const struct bt_ctf_event *ctf_event,
73 const struct bt_definition *scope,
74 unsigned int *OUTPUT);
75 struct bt_definition *_bt_python_field_one_from_list(
76 struct bt_definition **list, int index);
77 struct bt_ctf_event_decl **_bt_python_event_decl_listcaller(
78 int handle_id,
79 struct bt_context *ctx,
80 unsigned int *OUTPUT);
81 struct bt_ctf_event_decl *_bt_python_decl_one_from_list(
82 struct bt_ctf_event_decl **list, int index);
83 struct bt_ctf_field_decl **_by_python_field_decl_listcaller(
84 struct bt_ctf_event_decl *event_decl,
85 enum bt_ctf_scope scope,
86 unsigned int *OUTPUT);
87 struct bt_ctf_field_decl *_bt_python_field_decl_one_from_list(
88 struct bt_ctf_field_decl **list, int index);
89 struct definition_array *_bt_python_get_array_from_def(
90 struct bt_definition *field);
91 struct definition_sequence *_bt_python_get_sequence_from_def(
92 struct bt_definition *field);
93 int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field);
94 enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field);
95
96 /* =================================================================
97 CONTEXT.H, CONTEXT-INTERNAL.H
98 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
99 */
100
101 %rename("_bt_context_create") bt_context_create(void);
102 %rename("_bt_context_add_trace") bt_context_add_trace(
103 struct bt_context *ctx, const char *path, const char *format,
104 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
105 struct bt_mmap_stream_list *stream_list, FILE *metadata);
106 %rename("_bt_context_remove_trace") bt_context_remove_trace(
107 struct bt_context *ctx, int trace_id);
108 %rename("_bt_context_get") bt_context_get(struct bt_context *ctx);
109 %rename("_bt_context_put") bt_context_put(struct bt_context *ctx);
110 %rename("_bt_ctf_event_get_context") bt_ctf_event_get_context(
111 const struct bt_ctf_event *event);
112
113 struct bt_context *bt_context_create(void);
114 int bt_context_add_trace(struct bt_context *ctx, const char *path, const char *format,
115 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
116 struct bt_mmap_stream_list *stream_list, FILE *metadata);
117 void bt_context_remove_trace(struct bt_context *ctx, int trace_id);
118 void bt_context_get(struct bt_context *ctx);
119 void bt_context_put(struct bt_context *ctx);
120 struct bt_context *bt_ctf_event_get_context(const struct bt_ctf_event *event);
121
122 // class TraceCollection to prevent direct access to struct bt_context
123 %pythoncode%{
124 class TraceCollection:
125 """
126 The TraceCollection is the object that contains all currently opened traces.
127 """
128
129 def __init__(self):
130 self._tc = _bt_context_create()
131
132 def __del__(self):
133 _bt_context_put(self._tc)
134
135 def add_trace(self, path, format_str):
136 """
137 Add a trace by path to the TraceCollection.
138
139 Open a trace.
140
141 path is the path to the trace, it is not recursive.
142 If "path" is None, stream_list is used instead as a list
143 of mmap streams to open for the trace.
144
145 format is a string containing the format name in which the trace was
146 produced.
147
148 Return: the corresponding TraceHandle on success or None on error.
149 """
150 ret = _bt_context_add_trace(self._tc, path, format_str, None, None, None)
151 if ret < 0:
152 return None
153
154 th = TraceHandle.__new__(TraceHandle)
155 th._id = ret
156 th._trace_collection = self
157 return th
158
159 def add_traces_recursive(self, path, format_str):
160 """
161 Open a trace recursively.
162
163 Find each trace present in the subdirectory starting from the given
164 path, and add them to the TraceCollection.
165
166 Return a dict of TraceHandle instances (the full path is the key).
167 Return None on error.
168 """
169
170 import os
171
172 trace_handles = {}
173
174 noTrace = True
175 error = False
176
177 for fullpath, dirs, files in os.walk(path):
178 if "metadata" in files:
179 trace_handle = self.add_trace(fullpath, format_str)
180 if trace_handle is None:
181 error = True
182 continue
183
184 trace_handles[fullpath] = trace_handle
185 noTrace = False
186
187 if noTrace and error:
188 return None
189 return trace_handles
190
191 def remove_trace(self, trace_handle):
192 """
193 Remove a trace from the TraceCollection.
194 Effectively closing the trace.
195 """
196 try:
197 _bt_context_remove_trace(self._tc, trace_handle._id)
198 except AttributeError:
199 raise TypeError("in remove_trace, "
200 "argument 2 must be a TraceHandle instance")
201
202 @property
203 def events(self):
204 """
205 Generator function to iterate over the events of open in the current
206 TraceCollection.
207 """
208 begin_pos_ptr = _bt_iter_pos()
209 end_pos_ptr = _bt_iter_pos()
210 begin_pos_ptr.type = SEEK_BEGIN
211 end_pos_ptr.type = SEEK_LAST
212
213 for event in self._events(begin_pos_ptr, end_pos_ptr):
214 yield event
215
216 def events_timestamps(self, timestamp_begin, timestamp_end):
217 """
218 Generator function to iterate over the events of open in the current
219 TraceCollection from timestamp_begin to timestamp_end.
220 """
221 begin_pos_ptr = _bt_iter_pos()
222 end_pos_ptr = _bt_iter_pos()
223 begin_pos_ptr.type = end_pos_ptr.type = SEEK_TIME
224 begin_pos_ptr.u.seek_time = timestamp_begin
225 end_pos_ptr.u.seek_time = timestamp_end
226
227 for event in self._events(begin_pos_ptr, end_pos_ptr):
228 yield event
229
230 @property
231 def timestamp_begin(self):
232 pos_ptr = _bt_iter_pos()
233 pos_ptr.type = SEEK_BEGIN
234 return self._timestamp_at_pos(pos_ptr)
235
236 @property
237 def timestamp_end(self):
238 pos_ptr = _bt_iter_pos()
239 pos_ptr.type = SEEK_LAST
240 return self._timestamp_at_pos(pos_ptr)
241
242 def _timestamp_at_pos(self, pos_ptr):
243 ctf_it_ptr = _bt_ctf_iter_create(self._tc, pos_ptr, pos_ptr)
244 if ctf_it_ptr is None:
245 raise NotImplementedError("Creation of multiple iterators is unsupported.")
246 ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
247 _bt_ctf_iter_destroy(ctf_it_ptr)
248 if ev_ptr is None:
249 return None;
250
251 def _events(self, begin_pos_ptr, end_pos_ptr):
252 ctf_it_ptr = _bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr)
253 if ctf_it_ptr is None:
254 raise NotImplementedError(
255 "Creation of multiple iterators is unsupported.")
256
257 while True:
258 ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
259 if ev_ptr is None:
260 break
261
262 ev = Event.__new__(Event)
263 ev._e = ev_ptr
264 try:
265 yield ev
266 except GeneratorExit:
267 break
268
269 ret = _bt_iter_next(_bt_ctf_get_iter(ctf_it_ptr))
270 if ret != 0:
271 break
272
273 _bt_ctf_iter_destroy(ctf_it_ptr)
274
275 %}
276
277
278
279 /* =================================================================
280 FORMAT.H, REGISTRY
281 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
282 */
283
284 %rename("lookup_format") bt_lookup_format(bt_intern_str qname);
285 %rename("_bt_print_format_list") bt_fprintf_format_list(FILE *fp);
286 %rename("register_format") bt_register_format(struct format *format);
287 %rename("unregister_format") bt_unregister_format(struct bt_format *format);
288
289 extern struct format *bt_lookup_format(bt_intern_str qname);
290 extern void bt_fprintf_format_list(FILE *fp);
291 extern int bt_register_format(struct bt_format *format);
292 extern void bt_unregister_format(struct bt_format *format);
293
294 %pythoncode %{
295
296 def print_format_list(babeltrace_file):
297 """
298 Print a list of available formats to file.
299
300 babeltrace_file must be a File instance opened in write mode.
301 """
302 try:
303 if babeltrace_file._file is not None:
304 _bt_print_format_list(babeltrace_file._file)
305 except AttributeError:
306 raise TypeError("in print_format_list, "
307 "argument 1 must be a File instance")
308
309 %}
310
311
312 /* =================================================================
313 ITERATOR.H, ITERATOR-INTERNAL.H
314 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
315 */
316
317 %rename("_bt_iter_create") bt_iter_create(struct bt_context *ctx,
318 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
319 %rename("_bt_iter_destroy") bt_iter_destroy(struct bt_iter *iter);
320 %rename("_bt_iter_next") bt_iter_next(struct bt_iter *iter);
321 %rename("_bt_iter_get_pos") bt_iter_get_pos(struct bt_iter *iter);
322 %rename("_bt_iter_free_pos") bt_iter_free_pos(struct bt_iter_pos *pos);
323 %rename("_bt_iter_set_pos") bt_iter_set_pos(struct bt_iter *iter,
324 const struct bt_iter_pos *pos);
325 %rename("_bt_iter_create_time_pos") bt_iter_create_time_pos(struct bt_iter *iter,
326 uint64_t timestamp);
327
328 struct bt_iter *bt_iter_create(struct bt_context *ctx,
329 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
330 void bt_iter_destroy(struct bt_iter *iter);
331 int bt_iter_next(struct bt_iter *iter);
332 struct bt_iter_pos *bt_iter_get_pos(struct bt_iter *iter);
333 void bt_iter_free_pos(struct bt_iter_pos *pos);
334 int bt_iter_set_pos(struct bt_iter *iter, const struct bt_iter_pos *pos);
335 struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter, uint64_t timestamp);
336
337 %rename("_bt_iter_pos") bt_iter_pos;
338 %rename("SEEK_TIME") BT_SEEK_TIME;
339 %rename("SEEK_RESTORE") BT_SEEK_RESTORE;
340 %rename("SEEK_CUR") BT_SEEK_CUR;
341 %rename("SEEK_BEGIN") BT_SEEK_BEGIN;
342 %rename("SEEK_LAST") BT_SEEK_LAST;
343
344 // This struct is taken from iterator.h
345 // All changes to the struct must also be made here
346 struct bt_iter_pos {
347 enum {
348 BT_SEEK_TIME, /* uses u.seek_time */
349 BT_SEEK_RESTORE, /* uses u.restore */
350 BT_SEEK_CUR,
351 BT_SEEK_BEGIN,
352 BT_SEEK_LAST
353 } type;
354 union {
355 uint64_t seek_time;
356 struct bt_saved_pos *restore;
357 } u;
358 };
359
360 /* =================================================================
361 TRACE-HANDLE.H, TRACE-HANDLE-INTERNAL.H
362 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
363 */
364
365 %rename("_bt_trace_handle_create") bt_trace_handle_create(struct bt_context *ctx);
366 %rename("_bt_trace_handle_destroy") bt_trace_handle_destroy(struct bt_trace_handle *bt);
367 struct bt_trace_handle *bt_trace_handle_create(struct bt_context *ctx);
368 void bt_trace_handle_destroy(struct bt_trace_handle *bt);
369
370 %rename("_bt_trace_handle_get_path") bt_trace_handle_get_path(struct bt_context *ctx,
371 int handle_id);
372 %rename("_bt_trace_handle_get_timestamp_begin") bt_trace_handle_get_timestamp_begin(
373 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
374 %rename("_bt_trace_handle_get_timestamp_end") bt_trace_handle_get_timestamp_end(
375 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
376 const char *bt_trace_handle_get_path(struct bt_context *ctx, int handle_id);
377 uint64_t bt_trace_handle_get_timestamp_begin(struct bt_context *ctx, int handle_id,
378 enum bt_clock_type type);
379 uint64_t bt_trace_handle_get_timestamp_end(struct bt_context *ctx, int handle_id,
380 enum bt_clock_type type);
381
382 %rename("_bt_ctf_event_get_handle_id") bt_ctf_event_get_handle_id(
383 const struct bt_ctf_event *event);
384 int bt_ctf_event_get_handle_id(const struct bt_ctf_event *event);
385
386
387 %pythoncode%{
388
389 # Based on enum bt_clock_type in clock-type.h­
390 class ClockType:
391 CLOCK_CYCLES = 0
392 CLOCK_REAL = 1
393
394 class TraceHandle(object):
395 """
396 The TraceHandle allows the user to manipulate a trace file directly.
397 It is a unique identifier representing a trace file.
398 Do not instantiate.
399 """
400
401 def __init__(self):
402 raise NotImplementedError("TraceHandle cannot be instantiated")
403
404 def __repr__(self):
405 return "Babeltrace TraceHandle: trace_id('{0}')".format(self._id)
406
407 @property
408 def id(self):
409 """Return the TraceHandle id."""
410 return self._id
411
412 @property
413 def path(self):
414 """Return the path of a TraceHandle."""
415 return _bt_trace_handle_get_path(self._trace_collection._tc, self._id)
416
417 @property
418 def timestamp_begin(self):
419 """Return the creation time of the buffers of a trace."""
420 return _bt_trace_handle_get_timestamp_begin(
421 self._trace_collection._tc, self._id, ClockType.CLOCK_REAL)
422
423 @property
424 def timestamp_end(self):
425 """Return the destruction timestamp of the buffers of a trace."""
426 return _bt_trace_handle_get_timestamp_end(
427 self._trace_collection._tc, self._id, ClockType.CLOCK_REAL)
428
429 %}
430
431
432
433 // =================================================================
434 // CTF
435 // =================================================================
436
437 /* =================================================================
438 ITERATOR.H, EVENTS.H
439 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
440 */
441
442 //Iterator
443 %rename("_bt_ctf_iter_create") bt_ctf_iter_create(struct bt_context *ctx,
444 const struct bt_iter_pos *begin_pos,
445 const struct bt_iter_pos *end_pos);
446 %rename("_bt_ctf_get_iter") bt_ctf_get_iter(struct bt_ctf_iter *iter);
447 %rename("_bt_ctf_iter_destroy") bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
448 %rename("_bt_ctf_iter_read_event") bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
449
450 struct bt_ctf_iter *bt_ctf_iter_create(struct bt_context *ctx,
451 const struct bt_iter_pos *begin_pos,
452 const struct bt_iter_pos *end_pos);
453 struct bt_iter *bt_ctf_get_iter(struct bt_ctf_iter *iter);
454 void bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
455 struct bt_ctf_event *bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
456
457
458 //Events
459 %rename("_bt_ctf_get_top_level_scope") bt_ctf_get_top_level_scope(const struct
460 bt_ctf_event *event, enum bt_ctf_scope scope);
461 %rename("_bt_ctf_event_name") bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
462 %rename("_bt_ctf_get_timestamp") bt_ctf_get_timestamp(
463 const struct bt_ctf_event *ctf_event);
464 %rename("_bt_ctf_get_cycles") bt_ctf_get_cycles(
465 const struct bt_ctf_event *ctf_event);
466
467 %rename("_bt_ctf_get_field") bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
468 const struct bt_definition *scope, const char *field);
469 %rename("_bt_ctf_get_index") bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
470 const struct bt_definition *field, unsigned int index);
471 %rename("_bt_ctf_field_name") bt_ctf_field_name(const struct bt_definition *field);
472 %rename("_bt_ctf_field_type") bt_ctf_field_type(const struct bt_declaration *field);
473 %rename("_bt_ctf_get_int_signedness") bt_ctf_get_int_signedness(
474 const struct bt_declaration *field);
475 %rename("_bt_ctf_get_int_base") bt_ctf_get_int_base(const struct bt_declaration *field);
476 %rename("_bt_ctf_get_int_byte_order") bt_ctf_get_int_byte_order(
477 const struct bt_declaration *field);
478 %rename("_bt_ctf_get_int_len") bt_ctf_get_int_len(const struct bt_declaration *field);
479 %rename("_bt_ctf_get_enum_int") bt_ctf_get_enum_int(const struct bt_definition *field);
480 %rename("_bt_ctf_get_enum_str") bt_ctf_get_enum_str(const struct bt_definition *field);
481 %rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct bt_declaration *field);
482 %rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct bt_declaration *field);
483 %rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct bt_definition *field);
484 %rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct bt_definition *field);
485 %rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field);
486 %rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field);
487 %rename("_bt_ctf_get_float") bt_ctf_get_float(const struct bt_definition *field);
488 %rename("_bt_ctf_get_variant") bt_ctf_get_variant(const struct bt_definition *field);
489 %rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void);
490 %rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct
491 bt_ctf_event_decl *event);
492 %rename("_bt_ctf_get_decl_field_name") bt_ctf_get_decl_field_name(
493 const struct bt_ctf_field_decl *field);
494 %rename("_bt_ctf_get_decl_from_def") bt_ctf_get_decl_from_def(
495 const struct bt_definition *field);
496 %rename("_bt_array_index") bt_array_index(struct definition_array *array, uint64_t i);
497 %rename("_bt_sequence_len") bt_sequence_len(struct definition_sequence *sequence);
498 %rename("_bt_sequence_index") bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
499 %rename("_bt_ctf_get_struct_field_count") bt_ctf_get_struct_field_count(const struct bt_definition *structure);
500 %rename("_bt_ctf_get_struct_field_index") bt_ctf_get_struct_field_index(const struct bt_definition *structure, uint64_t i);
501
502 const struct bt_definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event,
503 enum bt_ctf_scope scope);
504 const char *bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
505 uint64_t bt_ctf_get_timestamp(const struct bt_ctf_event *ctf_event);
506 uint64_t bt_ctf_get_cycles(const struct bt_ctf_event *ctf_event);
507 const struct bt_definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
508 const struct bt_definition *scope,
509 const char *field);
510 const struct bt_definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
511 const struct bt_definition *field,
512 unsigned int index);
513 const char *bt_ctf_field_name(const struct bt_definition *field);
514 enum ctf_type_id bt_ctf_field_type(const struct bt_declaration *field);
515 int bt_ctf_get_int_signedness(const struct bt_declaration *field);
516 int bt_ctf_get_int_base(const struct bt_declaration *field);
517 int bt_ctf_get_int_byte_order(const struct bt_declaration *field);
518 ssize_t bt_ctf_get_int_len(const struct bt_declaration *field);
519 const struct bt_definition *bt_ctf_get_enum_int(const struct bt_definition *field);
520 const char *bt_ctf_get_enum_str(const struct bt_definition *field);
521 enum ctf_string_encoding bt_ctf_get_encoding(const struct bt_declaration *field);
522 int bt_ctf_get_array_len(const struct bt_declaration *field);
523 struct bt_definition *bt_array_index(struct definition_array *array, uint64_t i);
524 uint64_t bt_ctf_get_uint64(const struct bt_definition *field);
525 int64_t bt_ctf_get_int64(const struct bt_definition *field);
526 char *bt_ctf_get_char_array(const struct bt_definition *field);
527 char *bt_ctf_get_string(const struct bt_definition *field);
528 double bt_ctf_get_float(const struct bt_definition *field);
529 const struct bt_definition *bt_ctf_get_variant(const struct bt_definition *field);
530 int bt_ctf_field_get_error(void);
531 const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event);
532 const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field);
533 const struct bt_declaration *bt_ctf_get_decl_from_def(const struct bt_definition *field);
534 uint64_t bt_sequence_len(struct definition_sequence *sequence);
535 struct bt_definition *bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
536 uint64_t bt_ctf_get_struct_field_count(const struct bt_definition *structure);
537 const struct bt_definition *bt_ctf_get_struct_field_index(const struct bt_definition *structure, uint64_t i);
538
539 %pythoncode%{
540
541 class CTFStringEncoding:
542 NONE = 0
543 UTF8 = 1
544 ASCII = 2
545 UNKNOWN = 3
546
547 #enum equivalent, accessible constants
548 #These are taken directly from ctf/events.h
549 #All changes to enums must also be made here
550 class CTFTypeId:
551 UNKNOWN = 0
552 INTEGER = 1
553 FLOAT = 2
554 ENUM = 3
555 STRING = 4
556 STRUCT = 5
557 UNTAGGED_VARIANT = 6
558 VARIANT = 7
559 ARRAY = 8
560 SEQUENCE = 9
561 NR_CTF_TYPES = 10
562
563 def get_type_name(id):
564 name = "UNKNOWN"
565 constants = [attr for attr in dir(CTFTypeId) if not callable(getattr(CTFTypeId, attr)) and not attr.startswith("__")]
566 for attr in constants:
567 if getattr(CTFTypeId, attr) == id:
568 name = attr
569 break
570 return name
571
572 class scope:
573 TRACE_PACKET_HEADER = 0
574 STREAM_PACKET_CONTEXT = 1
575 STREAM_EVENT_HEADER = 2
576 STREAM_EVENT_CONTEXT = 3
577 EVENT_CONTEXT = 4
578 EVENT_FIELDS = 5
579
580 # Priority of the scopes when searching for event fields
581 _scopes = [scope.EVENT_FIELDS, scope.EVENT_CONTEXT, scope.STREAM_EVENT_CONTEXT,
582 scope.STREAM_EVENT_HEADER, scope.STREAM_PACKET_CONTEXT, scope.TRACE_PACKET_HEADER]
583
584 import collections
585 class Event(collections.Mapping):
586 """
587 This class represents an event from the trace.
588 It is obtained using the TraceCollection generator functions.
589 Do not instantiate.
590 """
591 def __init__(self):
592 raise NotImplementedError("Event cannot be instantiated")
593
594 @property
595 def name(self):
596 """Return the name of the event or None on error."""
597 return _bt_ctf_event_name(self._e)
598
599 @property
600 def cycles(self):
601 """
602 Return the timestamp of the event as written in
603 the packet (in cycles) or -1ULL on error.
604 """
605 return _bt_ctf_get_cycles(self._e)
606
607 @property
608 def timestamp(self):
609 """
610 Return the timestamp of the event offset with the
611 system clock source or -1ULL on error.
612 """
613 return _bt_ctf_get_timestamp(self._e)
614
615 def field_with_scope(self, field_name, scope):
616 """
617 Get field_name's value in scope.
618 None is returned if no field matches field_name.
619 """
620 if not scope in _scopes:
621 raise ValueError("Invalid scope provided")
622 field = self._field_with_scope(field_name, scope)
623 if field is not None:
624 return field.value
625 return None
626
627 def field_list_with_scope(self, scope):
628 """Return a list of field names in scope."""
629 if not scope in _scopes:
630 raise ValueError("Invalid scope provided")
631 field_names = []
632 for field in self._field_list_with_scope(scope):
633 field_names.append(field.name)
634 return field_names
635
636 @property
637 def handle(self):
638 """
639 Get the TraceHandle associated with this event
640 Return None on error
641 """
642 ret = _bt_ctf_event_get_handle_id(self._e)
643 if ret < 0:
644 return None
645
646 th = TraceHandle.__new__(TraceHandle)
647 th._id = ret
648 th._trace_collection = self.get_trace_collection()
649 return th
650
651 @property
652 def trace_collection(self):
653 """
654 Get the TraceCollection associated with this event.
655 Return None on error.
656 """
657 trace_collection = TraceCollection()
658 trace_collection._tc = _bt_ctf_event_get_context(self._e);
659 if trace_collection._tc is None:
660 return None
661 else:
662 return trace_collection
663
664 def __getitem__(self, field_name):
665 """
666 Get field_name's value. If the field_name exists in multiple
667 scopes, the first field found is returned. The scopes are searched
668 in the following order:
669 1) EVENT_FIELDS
670 2) EVENT_CONTEXT
671 3) STREAM_EVENT_CONTEXT
672 4) STREAM_EVENT_HEADER
673 5) STREAM_PACKET_CONTEXT
674 6) TRACE_PACKET_HEADER
675 None is returned if no field matches field_name.
676
677 Use field_with_scope() to explicitly access fields in a given
678 scope.
679 """
680 field = self._field(field_name)
681 if field is not None:
682 return field.value
683 raise KeyError(field_name)
684
685 def __iter__(self):
686 for key in self.keys():
687 yield key
688
689 def __len__(self):
690 count = 0
691 for scope in _scopes:
692 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
693 ret = _bt_python_field_listcaller(self._e, scope_ptr)
694 if isinstance(ret, list):
695 count += ret[1]
696 return count
697
698 def __contains__(self, field_name):
699 return self._field(field_name) is not None
700
701 def keys(self):
702 """Return a list of field names."""
703 field_names = set()
704 for scope in _scopes:
705 for name in self.field_list_with_scope(scope):
706 field_names.add(name)
707 return list(field_names)
708
709 def get(self, field_name, default = None):
710 field = self._field(field_name)
711 if field is None:
712 return default
713 return field.value
714
715 def items(self):
716 for field in self.keys():
717 yield (field, self[field])
718
719 def _field_with_scope(self, field_name, scope):
720 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
721 if scope_ptr is None:
722 return None
723
724 definition_ptr = _bt_ctf_get_field(self._e, scope_ptr, field_name)
725 if definition_ptr is None:
726 return None
727
728 field = _Definition(definition_ptr, scope)
729 return field
730
731 def _field(self, field_name):
732 field = None
733 for scope in _scopes:
734 field = self._field_with_scope(field_name, scope)
735 if field is not None:
736 break
737 return field
738
739 def _field_list_with_scope(self, scope):
740 fields = []
741 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
742
743 # Returns a list [list_ptr, count]. If list_ptr is NULL, SWIG will only
744 # provide the "count" return value
745 count = 0
746 list_ptr = None
747 ret = _bt_python_field_listcaller(self._e, scope_ptr)
748 if isinstance(ret, list):
749 list_ptr, count = ret
750
751 for i in range(count):
752 definition_ptr = _bt_python_field_one_from_list(list_ptr, i)
753 if definition_ptr is not None:
754 definition = _Definition(definition_ptr, scope)
755 fields.append(definition)
756 return fields
757
758 class FieldError(Exception):
759 def __init__(self, value):
760 self.value = value
761
762 def __str__(self):
763 return repr(self.value)
764
765 class EventDecl(object):
766 """Event declaration class. Do not instantiate."""
767
768 def __init__(self):
769 raise NotImplementedError("EventDecl cannot be instantiated")
770
771 def get_name(self):
772 """Return the name of the event or None on error"""
773 return _bt_ctf_get_decl_event_name(self._d)
774
775 def fields(self, scope):
776 """
777 Return a list of FieldDecl
778 Return None on error.
779 """
780 ptr_list = _by_python_field_decl_listcaller(self._d, scope)
781
782 if ptr_list is None:
783 return None
784
785 decl_list = []
786 i = 0
787 while True:
788 tmp = FieldDecl.__new__(FieldDecl)
789 tmp._d = _bt_python_field_decl_one_from_list(
790 ptr_list, i)
791
792 if tmp._d is None:
793 #Last item of list is None
794 break
795
796 decl_list.append(tmp)
797 i += 1
798 return decl_list
799
800
801 class FieldDecl(object):
802 """Field declaration class. Do not instantiate."""
803
804 def __init__(self):
805 raise NotImplementedError("FieldDecl cannot be instantiated")
806
807 def __repr__(self):
808 return "Babeltrace FieldDecl: name {0}".format(self.get_name())
809
810 def get_name(self):
811 """Return the name of a FieldDecl or None on error"""
812 return _bt_ctf_get_decl_field_name(self._d)
813
814
815 def field_error():
816 """
817 Return the last error code encountered while
818 accessing a field and reset the error flag.
819 Return 0 if no error, a negative value otherwise.
820 """
821 return _bt_ctf_field_get_error()
822
823 def get_event_decl_list(trace_handle, trace_collection):
824 """
825 Return a list of EventDecl
826 Return None on error.
827 """
828 try:
829 handle_id = trace_handle._id
830 except AttributeError:
831 raise TypeError("in get_event_decl_list, "
832 "argument 1 must be a TraceHandle instance")
833 try:
834 ptr_list, count = _bt_python_event_decl_listcaller(handle_id, trace_collection._tc)
835 except AttributeError:
836 raise TypeError("in get_event_decl_list, "
837 "argument 2 must be a TraceCollection instance")
838
839 if ptr_list is None:
840 return None
841
842 decl_list = []
843 for i in range(count):
844 tmp = EventDecl.__new__(EventDecl)
845 tmp._d = _bt_python_decl_one_from_list(ptr_list, i)
846 decl_list.append(tmp)
847
848 return decl_list
849
850 class _Definition(object):
851 def __init__(self, definition_ptr, scope):
852 self._d = definition_ptr
853 self._s = scope
854 if not scope in _scopes:
855 ValueError("Invalid scope provided")
856
857 def __repr__(self):
858 return "Babeltrace Definition: name('{0}'), type({1})".format(self.name, self.type)
859
860 @property
861 def name(self):
862 """Return the name of a field or None on error."""
863 return _bt_ctf_field_name(self._d)
864
865 @property
866 def type(self):
867 """Return the type of a field or -1 if unknown."""
868 return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d))
869
870 def get_int_signedness(self):
871 """
872 Return the signedness of an integer:
873 0 if unsigned; 1 if signed; -1 on error.
874 """
875 return _bt_ctf_get_int_signedness(_bt_ctf_get_decl_from_def(self._d))
876
877 def get_int_base(self):
878 """Return the base of an int or a negative value on error."""
879 return _bt_ctf_get_int_base(_bt_ctf_get_decl_from_def(self._d))
880
881 def get_int_byte_order(self):
882 """
883 Return the byte order of an int or a negative
884 value on error.
885 """
886 return _bt_ctf_get_int_byte_order(_bt_ctf_get_decl_from_def(self._d))
887
888 def get_int_len(self):
889 """
890 Return the size, in bits, of an int or a negative
891 value on error.
892 """
893 return _bt_ctf_get_int_len(_bt_ctf_get_decl_from_def(self._d))
894
895 def get_enum_str(self):
896 """
897 Return the string matching the current enumeration.
898 Return None on error.
899 """
900 return _bt_ctf_get_enum_str(self._d)
901
902 def get_encoding(self):
903 """
904 Return the encoding of an int or a string.
905 Return a negative value on error.
906 """
907 return _bt_ctf_get_encoding(_bt_ctf_get_decl_from_def(self._d))
908
909 def get_array_len(self):
910 """
911 Return the len of an array or a negative
912 value on error.
913 """
914 return _bt_ctf_get_array_len(_bt_ctf_get_decl_from_def(self._d))
915
916 def get_array_element_at(self, index):
917 """
918 Return the array's element at position index.
919 Return None on error
920 """
921 array_ptr = _bt_python_get_array_from_def(self._d)
922 if array_ptr is None:
923 return None
924
925 definition_ptr = _bt_array_index(array_ptr, index)
926 if definition_ptr is None:
927 return None
928 return _Definition(definition_ptr, self.scope)
929
930 def get_sequence_len(self):
931 """
932 Return the len of a sequence or a negative
933 value on error.
934 """
935 seq = _bt_python_get_sequence_from_def(self._d)
936 return _bt_sequence_len(seq)
937
938 def get_sequence_element_at(self, index):
939 """
940 Return the sequence's element at position index,
941 otherwise return None
942 """
943 seq = _bt_python_get_sequence_from_def(self._d)
944 if seq is not None:
945 definition_ptr = _bt_sequence_index(seq, index)
946 if definition_ptr is not None:
947 return _Definition(definition_ptr, self.scope)
948 return None
949
950 def get_uint64(self):
951 """
952 Return the value associated with the field.
953 If the field does not exist or is not of the type requested,
954 the value returned is undefined. To check if an error occured,
955 use the field_error() function after accessing a field.
956 """
957 return _bt_ctf_get_uint64(self._d)
958
959 def get_int64(self):
960 """
961 Return the value associated with the field.
962 If the field does not exist or is not of the type requested,
963 the value returned is undefined. To check if an error occured,
964 use the field_error() function after accessing a field.
965 """
966 return _bt_ctf_get_int64(self._d)
967
968 def get_char_array(self):
969 """
970 Return the value associated with the field.
971 If the field does not exist or is not of the type requested,
972 the value returned is undefined. To check if an error occurred,
973 use the field_error() function after accessing a field.
974 """
975 return _bt_ctf_get_char_array(self._d)
976
977 def get_str(self):
978 """
979 Return the value associated with the field.
980 If the field does not exist or is not of the type requested,
981 the value returned is undefined. To check if an error occurred,
982 use the field_error() function after accessing a field.
983 """
984 return _bt_ctf_get_string(self._d)
985
986 def get_float(self):
987 """
988 Return the value associated with the field.
989 If the field does not exist or is not of the type requested,
990 the value returned is undefined. To check if an error occurred,
991 use the field_error() function after accessing a field.
992 """
993 return _bt_ctf_get_float(self._d)
994
995 def get_variant(self):
996 """
997 Return the variant's selected field.
998 If the field does not exist or is not of the type requested,
999 the value returned is undefined. To check if an error occurred,
1000 use the field_error() function after accessing a field.
1001 """
1002 return _bt_ctf_get_variant(self._d)
1003
1004 def get_struct_field_count(self):
1005 """
1006 Return the number of fields contained in the structure.
1007 If the field does not exist or is not of the type requested,
1008 the value returned is undefined.
1009 """
1010 return _bt_ctf_get_struct_field_count(self._d)
1011
1012 def get_struct_field_at(self, i):
1013 """
1014 Return the structure's field at position i.
1015 If the field does not exist or is not of the type requested,
1016 the value returned is undefined. To check if an error occurred,
1017 use the field_error() function after accessing a field.
1018 """
1019 return _bt_ctf_get_struct_field_index(self._d, i)
1020
1021 @property
1022 def value(self):
1023 """
1024 Return the value associated with the field according to its type.
1025 Return None on error.
1026 """
1027 id = self.type
1028 value = None
1029 if id == CTFTypeId.STRING:
1030 value = self.get_str()
1031 elif id == CTFTypeId.ARRAY:
1032 value = []
1033 for i in range(self.get_array_len()):
1034 element = self.get_array_element_at(i)
1035 value.append(element.value)
1036 elif id == CTFTypeId.INTEGER:
1037 if self.get_int_signedness() == 0:
1038 value = self.get_uint64()
1039 else:
1040 value = self.get_int64()
1041 elif id == CTFTypeId.ENUM:
1042 value = self.get_enum_str()
1043 elif id == CTFTypeId.SEQUENCE:
1044 seq_len = self.get_sequence_len()
1045 value = []
1046 for i in range(seq_len):
1047 evDef = self.get_sequence_element_at(i)
1048 value.append(evDef.value)
1049 elif id == CTFTypeId.FLOAT:
1050 value = self.get_float()
1051 elif id == CTFTypeId.VARIANT:
1052 variant = Definition.__new__(Definition)
1053 variant._d = self.get_variant();
1054 value = variant.value
1055 elif id == CTFTypeId.STRUCT:
1056 value = {}
1057 for i in range(self.get_struct_field_count()):
1058 member = _Definition(self.get_struct_field_at(i), self.scope)
1059 value[member.name] = member.value
1060
1061 if field_error():
1062 raise FieldError("Error occurred while accessing field {} of type {}".format(self.field_name(), CTFTypeId.get_type_name(self.field_type())))
1063 return value
1064
1065 @property
1066 def scope(self):
1067 """Return the scope of a field or None on error."""
1068 return self._s
1069
1070 %}
1071
1072
1073 // =================================================================
1074 // CTF Writer
1075 // =================================================================
1076
1077 /* =================================================================
1078 CLOCK.H
1079 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1080 */
1081 %rename("_bt_ctf_clock_create") bt_ctf_clock_create(const char *name);
1082 %rename("_bt_ctf_clock_set_description") bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc);
1083 %rename("_bt_ctf_clock_set_frequency") bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq);
1084 %rename("_bt_ctf_clock_set_precision") bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision);
1085 %rename("_bt_ctf_clock_set_offset_s") bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, uint64_t offset_s);
1086 %rename("_bt_ctf_clock_set_offset") bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, uint64_t offset);
1087 %rename("_bt_ctf_clock_set_is_absolute") bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute);
1088 %rename("_bt_ctf_clock_set_time") bt_ctf_clock_set_time(struct bt_ctf_clock *clock, uint64_t time);
1089 %rename("_bt_ctf_clock_get") bt_ctf_clock_get(struct bt_ctf_clock *clock);
1090 %rename("_bt_ctf_clock_put") bt_ctf_clock_put(struct bt_ctf_clock *clock);
1091
1092 struct bt_ctf_clock *bt_ctf_clock_create(const char *name);
1093 int bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc);
1094 int bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq);
1095 int bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision);
1096 int bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, uint64_t offset_s);
1097 int bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, uint64_t offset);
1098 int bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute);
1099 int bt_ctf_clock_set_time(struct bt_ctf_clock *clock, uint64_t time);
1100 void bt_ctf_clock_get(struct bt_ctf_clock *clock);
1101 void bt_ctf_clock_put(struct bt_ctf_clock *clock);
1102
1103 /* =================================================================
1104 EVENT-TYPES.H
1105 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1106 */
1107 %rename("_bt_ctf_field_type_integer_create") bt_ctf_field_type_integer_create(unsigned int size);
1108 %rename("_bt_ctf_field_type_integer_set_signed") bt_ctf_field_type_integer_set_signed(struct bt_ctf_field_type *integer, int is_signed);
1109 %rename("_bt_ctf_field_type_integer_set_base") bt_ctf_field_type_integer_set_base(struct bt_ctf_field_type *integer, enum bt_ctf_integer_base base);
1110 %rename("_bt_ctf_field_type_integer_set_encoding") bt_ctf_field_type_integer_set_encoding(struct bt_ctf_field_type *integer, enum ctf_string_encoding encoding);
1111 %rename("_bt_ctf_field_type_enumeration_create") bt_ctf_field_type_enumeration_create(struct bt_ctf_field_type *integer_container_type);
1112 %rename("_bt_ctf_field_type_enumeration_add_mapping") bt_ctf_field_type_enumeration_add_mapping(struct bt_ctf_field_type *enumeration, const char *string, int64_t range_start, int64_t range_end);
1113 %rename("_bt_ctf_field_type_floating_point_create") bt_ctf_field_type_floating_point_create(void);
1114 %rename("_bt_ctf_field_type_floating_point_set_exponent_digits") bt_ctf_field_type_floating_point_set_exponent_digits(struct bt_ctf_field_type *floating_point, unsigned int exponent_digits);
1115 %rename("_bt_ctf_field_type_floating_point_set_mantissa_digits") bt_ctf_field_type_floating_point_set_mantissa_digits(struct bt_ctf_field_type *floating_point, unsigned int mantissa_digits);
1116 %rename("_bt_ctf_field_type_structure_create") bt_ctf_field_type_structure_create(void);
1117 %rename("_bt_ctf_field_type_structure_add_field") bt_ctf_field_type_structure_add_field(struct bt_ctf_field_type *structure, struct bt_ctf_field_type *field_type, const char *field_name);
1118 %rename("_bt_ctf_field_type_variant_create") bt_ctf_field_type_variant_create(struct bt_ctf_field_type *enum_tag, const char *tag_name);
1119 %rename("_bt_ctf_field_type_variant_add_field") bt_ctf_field_type_variant_add_field(struct bt_ctf_field_type *variant, struct bt_ctf_field_type *field_type, const char *field_name);
1120 %rename("_bt_ctf_field_type_array_create") bt_ctf_field_type_array_create(struct bt_ctf_field_type *element_type, unsigned int length);
1121 %rename("_bt_ctf_field_type_sequence_create") bt_ctf_field_type_sequence_create(struct bt_ctf_field_type *element_type, const char *length_field_name);
1122 %rename("_bt_ctf_field_type_string_create") bt_ctf_field_type_string_create(void);
1123 %rename("_bt_ctf_field_type_string_set_encoding") bt_ctf_field_type_string_set_encoding(struct bt_ctf_field_type *string, enum ctf_string_encoding encoding);
1124 %rename("_bt_ctf_field_type_set_alignment") bt_ctf_field_type_set_alignment(struct bt_ctf_field_type *type, unsigned int alignment);
1125 %rename("_bt_ctf_field_type_set_byte_order") bt_ctf_field_type_set_byte_order(struct bt_ctf_field_type *type, enum bt_ctf_byte_order byte_order);
1126 %rename("_bt_ctf_field_type_get") bt_ctf_field_type_get(struct bt_ctf_field_type *type);
1127 %rename("_bt_ctf_field_type_put") bt_ctf_field_type_put(struct bt_ctf_field_type *type);
1128
1129 struct bt_ctf_field_type *bt_ctf_field_type_integer_create(unsigned int size);
1130 int bt_ctf_field_type_integer_set_signed(struct bt_ctf_field_type *integer, int is_signed);
1131 int bt_ctf_field_type_integer_set_base(struct bt_ctf_field_type *integer, enum bt_ctf_integer_base base);
1132 int bt_ctf_field_type_integer_set_encoding(struct bt_ctf_field_type *integer, enum ctf_string_encoding encoding);
1133 struct bt_ctf_field_type *bt_ctf_field_type_enumeration_create(struct bt_ctf_field_type *integer_container_type);
1134 int bt_ctf_field_type_enumeration_add_mapping(struct bt_ctf_field_type *enumeration, const char *string, int64_t range_start, int64_t range_end);
1135 struct bt_ctf_field_type *bt_ctf_field_type_floating_point_create(void);
1136 int bt_ctf_field_type_floating_point_set_exponent_digits(struct bt_ctf_field_type *floating_point, unsigned int exponent_digits);
1137 int bt_ctf_field_type_floating_point_set_mantissa_digits(struct bt_ctf_field_type *floating_point, unsigned int mantissa_digits);
1138 struct bt_ctf_field_type *bt_ctf_field_type_structure_create(void);
1139 int bt_ctf_field_type_structure_add_field(struct bt_ctf_field_type *structure, struct bt_ctf_field_type *field_type, const char *field_name);
1140 struct bt_ctf_field_type *bt_ctf_field_type_variant_create(struct bt_ctf_field_type *enum_tag, const char *tag_name);
1141 int bt_ctf_field_type_variant_add_field(struct bt_ctf_field_type *variant, struct bt_ctf_field_type *field_type, const char *field_name);
1142 struct bt_ctf_field_type *bt_ctf_field_type_array_create(struct bt_ctf_field_type *element_type, unsigned int length);
1143 struct bt_ctf_field_type *bt_ctf_field_type_sequence_create(struct bt_ctf_field_type *element_type, const char *length_field_name);
1144 struct bt_ctf_field_type *bt_ctf_field_type_string_create(void);
1145 int bt_ctf_field_type_string_set_encoding(struct bt_ctf_field_type *string, enum ctf_string_encoding encoding);
1146 int bt_ctf_field_type_set_alignment(struct bt_ctf_field_type *type, unsigned int alignment);
1147 int bt_ctf_field_type_set_byte_order(struct bt_ctf_field_type *type, enum bt_ctf_byte_order byte_order);
1148 void bt_ctf_field_type_get(struct bt_ctf_field_type *type);
1149 void bt_ctf_field_type_put(struct bt_ctf_field_type *type);
1150
1151 /* =================================================================
1152 EVENT-FIELDS.H
1153 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1154 */
1155 %rename("_bt_ctf_field_create") bt_ctf_field_create(struct bt_ctf_field_type *type);
1156 %rename("_bt_ctf_field_structure_get_field") bt_ctf_field_structure_get_field(struct bt_ctf_field *structure, const char *name);
1157 %rename("_bt_ctf_field_array_get_field") bt_ctf_field_array_get_field(struct bt_ctf_field *array, uint64_t index);
1158 %rename("_bt_ctf_field_sequence_set_length") bt_ctf_field_sequence_set_length(struct bt_ctf_field *sequence, struct bt_ctf_field *length_field);
1159 %rename("_bt_ctf_field_sequence_get_field") bt_ctf_field_sequence_get_field(struct bt_ctf_field *sequence, uint64_t index);
1160 %rename("_bt_ctf_field_variant_get_field") bt_ctf_field_variant_get_field(struct bt_ctf_field *variant, struct bt_ctf_field *tag);
1161 %rename("_bt_ctf_field_enumeration_get_container") bt_ctf_field_enumeration_get_container(struct bt_ctf_field *enumeration);
1162 %rename("_bt_ctf_field_signed_integer_set_value") bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *integer, int64_t value);
1163 %rename("_bt_ctf_field_unsigned_integer_set_value") bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *integer, uint64_t value);
1164 %rename("_bt_ctf_field_floating_point_set_value") bt_ctf_field_floating_point_set_value(struct bt_ctf_field *floating_point, double value);
1165 %rename("_bt_ctf_field_string_set_value") bt_ctf_field_string_set_value(struct bt_ctf_field *string, const char *value);
1166 %rename("_bt_ctf_field_get") bt_ctf_field_get(struct bt_ctf_field *field);
1167 %rename("_bt_ctf_field_put") bt_ctf_field_put(struct bt_ctf_field *field);
1168
1169 struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type);
1170 struct bt_ctf_field *bt_ctf_field_structure_get_field(struct bt_ctf_field *structure, const char *name);
1171 struct bt_ctf_field *bt_ctf_field_array_get_field(struct bt_ctf_field *array, uint64_t index);
1172 int bt_ctf_field_sequence_set_length(struct bt_ctf_field *sequence, struct bt_ctf_field *length_field);
1173 struct bt_ctf_field *bt_ctf_field_sequence_get_field(struct bt_ctf_field *sequence, uint64_t index);
1174 struct bt_ctf_field *bt_ctf_field_variant_get_field(struct bt_ctf_field *variant, struct bt_ctf_field *tag);
1175 struct bt_ctf_field *bt_ctf_field_enumeration_get_container(struct bt_ctf_field *enumeration);
1176 int bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *integer, int64_t value);
1177 int bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *integer, uint64_t value);
1178 int bt_ctf_field_floating_point_set_value(struct bt_ctf_field *floating_point, double value);
1179 int bt_ctf_field_string_set_value(struct bt_ctf_field *string, const char *value);
1180 void bt_ctf_field_get(struct bt_ctf_field *field);
1181 void bt_ctf_field_put(struct bt_ctf_field *field);
1182
1183 /* =================================================================
1184 EVENT.H
1185 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1186 */
1187 %rename("_bt_ctf_event_class_create") bt_ctf_event_class_create(const char *name);
1188 %rename("_bt_ctf_event_class_add_field") bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, struct bt_ctf_field_type *type, const char *name);
1189 %rename("_bt_ctf_event_class_get") bt_ctf_event_class_get(struct bt_ctf_event_class *event_class);
1190 %rename("_bt_ctf_event_class_put") bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
1191 %rename("_bt_ctf_event_create") bt_ctf_event_create(struct bt_ctf_event_class *event_class);
1192 %rename("_bt_ctf_event_set_payload") bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struct bt_ctf_field *value);
1193 %rename("_bt_ctf_event_get_payload") bt_ctf_event_get_payload(struct bt_ctf_event *event, const char *name);
1194 %rename("_bt_ctf_event_get") bt_ctf_event_get(struct bt_ctf_event *event);
1195 %rename("_bt_ctf_event_put") bt_ctf_event_put(struct bt_ctf_event *event);
1196
1197 struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name);
1198 int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, struct bt_ctf_field_type *type, const char *name);
1199 void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class);
1200 void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
1201 struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class);
1202 int bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struct bt_ctf_field *value);
1203 struct bt_ctf_field *bt_ctf_event_get_payload(struct bt_ctf_event *event, const char *name);
1204 void bt_ctf_event_get(struct bt_ctf_event *event);
1205 void bt_ctf_event_put(struct bt_ctf_event *event);
1206
1207 /* =================================================================
1208 STREAM.H
1209 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1210 */
1211 %rename("_bt_ctf_stream_class_create") bt_ctf_stream_class_create(const char *name);
1212 %rename("_bt_ctf_stream_class_set_clock") bt_ctf_stream_class_set_clock(struct bt_ctf_stream_class *stream_class, struct bt_ctf_clock *clock);
1213 %rename("_bt_ctf_stream_class_add_event_class") bt_ctf_stream_class_add_event_class(struct bt_ctf_stream_class *stream_class, struct bt_ctf_event_class *event_class);
1214 %rename("_bt_ctf_stream_class_get") bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
1215 %rename("_bt_ctf_stream_class_put") bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
1216 %rename("_bt_ctf_stream_append_discarded_events") bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count);
1217 %rename("_bt_ctf_stream_append_event") bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event);
1218 %rename("_bt_ctf_stream_flush") bt_ctf_stream_flush(struct bt_ctf_stream *stream);
1219 %rename("_bt_ctf_stream_get") bt_ctf_stream_get(struct bt_ctf_stream *stream);
1220 %rename("_bt_ctf_stream_put") bt_ctf_stream_put(struct bt_ctf_stream *stream);
1221
1222 struct bt_ctf_stream_class *bt_ctf_stream_class_create(const char *name);
1223 int bt_ctf_stream_class_set_clock(struct bt_ctf_stream_class *stream_class, struct bt_ctf_clock *clock);
1224 int bt_ctf_stream_class_add_event_class(struct bt_ctf_stream_class *stream_class, struct bt_ctf_event_class *event_class);
1225 void bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
1226 void bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
1227 void bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count);
1228 int bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event);
1229 int bt_ctf_stream_flush(struct bt_ctf_stream *stream);
1230 void bt_ctf_stream_get(struct bt_ctf_stream *stream);
1231 void bt_ctf_stream_put(struct bt_ctf_stream *stream);
1232
1233 /* =================================================================
1234 WRITER.H
1235 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1236 */
1237 %rename("_bt_ctf_writer_create") bt_ctf_writer_create(const char *path);
1238 %rename("_bt_ctf_writer_create_stream") bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class);
1239 %rename("_bt_ctf_writer_add_environment_field") bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value);
1240 %rename("_bt_ctf_writer_add_clock") bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock);
1241 %newobject bt_ctf_writer_get_metadata_string;
1242 %rename("_bt_ctf_writer_get_metadata_string") bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer);
1243 %rename("_bt_ctf_writer_flush_metadata") bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer);
1244 %rename("_bt_ctf_writer_set_byte_order") bt_ctf_writer_set_byte_order(struct bt_ctf_writer *writer, enum bt_ctf_byte_order byte_order);
1245 %rename("_bt_ctf_writer_get") bt_ctf_writer_get(struct bt_ctf_writer *writer);
1246 %rename("_bt_ctf_writer_put") bt_ctf_writer_put(struct bt_ctf_writer *writer);
1247
1248 struct bt_ctf_writer *bt_ctf_writer_create(const char *path);
1249 struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class);
1250 int bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value);
1251 int bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock);
1252 char *bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer);
1253 void bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer);
1254 int bt_ctf_writer_set_byte_order(struct bt_ctf_writer *writer, enum bt_ctf_byte_order byte_order);
1255 void bt_ctf_writer_get(struct bt_ctf_writer *writer);
1256 void bt_ctf_writer_put(struct bt_ctf_writer *writer);
1257
1258 %pythoncode %{
1259
1260 class CTFWriter:
1261 class ByteOrder:
1262 BYTE_ORDER_NATIVE = 0
1263 BYTE_ORDER_LITTLE_ENDIAN = 1
1264 BYTE_ORDER_BIG_ENDIAN = 2
1265 BYTE_ORDER_NETWORK = 3
1266
1267 class Clock:
1268 def __init__(self, name):
1269 self._c = _bt_ctf_clock_create(name)
1270 if self._c is None:
1271 raise ValueError("Invalid clock name.")
1272
1273 def __del__(self):
1274 _bt_ctf_clock_put(self._c)
1275
1276 """
1277 Set the clock's description. The description appears in the clock's TSDL
1278 meta-data.
1279 """
1280 def set_description(self, desc):
1281 ret = _bt_ctf_clock_set_description(self._c, desc)
1282 if ret < 0:
1283 raise ValueError("Invalid clock description.")
1284
1285 """
1286 Set the clock's frequency (Hz).
1287 """
1288 def set_frequency(self, freq):
1289 ret = _bt_ctf_clock_set_frequency(self._c, freq)
1290 if ret < 0:
1291 raise ValueError("Invalid frequency value.")
1292
1293 """
1294 Set the clock's precision (in clock ticks).
1295 """
1296 def set_precision(self, precision):
1297 ret = _bt_ctf_clock_set_precision(self._c, precision)
1298
1299 """
1300 Set the clock's offset in seconds from POSIX.1 Epoch.
1301 """
1302 def set_offset_seconds(self, offset_s):
1303 ret = _bt_ctf_clock_set_offset_s(self._c, offset_s)
1304 if ret < 0:
1305 raise ValueError("Invalid offset value.")
1306
1307 """
1308 Set the clock's offset in ticks from POSIX.1 Epoch + offset in seconds.
1309 """
1310 def set_offset_seconds(self, offset):
1311 ret = _bt_ctf_clock_set_offset(self._c, offset)
1312 if ret < 0:
1313 raise ValueError("Invalid offset value.")
1314
1315 """
1316 Set a clock's absolute attribute. A clock is absolute if the clock
1317 is a global reference across the trace's other clocks.
1318 """
1319 def set_is_absolute(self, is_absolute):
1320 ret = _bt_ctf_clock_set_is_absolute(self._c, is_absolute)
1321 if ret < 0:
1322 raise ValueError("Could not set the clock's absolute attribute.")
1323
1324 """
1325 Set the current time in nanoseconds since the clock's origin (offset and
1326 offset_s attributes). The clock's value will be sampled as events are
1327 appended to a stream.
1328 """
1329 def set_time(self, time):
1330 ret = _bt_ctf_clock_set_time(self._c, time)
1331 if ret < 0:
1332 raise ValueError("Invalid time value.")
1333
1334 class FieldType:
1335 """
1336 FieldType should not be instantiated directly. Please instantiate
1337 one of the concrete FieldType classes.
1338 """
1339 class IntegerBase:
1340 # These values are based on the bt_ctf_integer_base enum
1341 # declared in event-types.h.
1342 INTEGER_BASE_UNKNOWN = -1
1343 INTEGER_BASE_BINARY = 2
1344 INTEGER_BASE_OCTAL = 8
1345 INTEGER_BASE_DECIMAL = 10
1346 INTEGER_BASE_HEXADECIMAL = 16
1347
1348 def __init__(self):
1349 if self._ft is None:
1350 raise ValueError("FieldType creation failed.")
1351
1352 def __del__(self):
1353 _bt_ctf_field_type_put(self._ft)
1354
1355 """
1356 Set the field type's alignment. Defaults to 1 (bit-aligned). However,
1357 some types, such as structures and string, may impose other alignment
1358 constraints.
1359 """
1360 def set_alignment(self, alignment):
1361 ret = _bt_ctf_field_type_set_alignment(self._ft, alignment)
1362 if ret < 0:
1363 raise ValueError("Invalid alignment value.")
1364
1365 """
1366 Set the field type's byte order. Use constants defined in the ByteOrder
1367 class.
1368 """
1369 def set_byte_order(self, byte_order):
1370 ret = _bt_ctf_field_type_set_byte_order(self._ft, byte_order)
1371 if ret < 0:
1372 raise ValueError("Could not set byte order value.")
1373
1374 class FieldTypeInteger(FieldType):
1375 """
1376 Create a new integer field type of the given size.
1377 """
1378 def __init__(self, size):
1379 self._ft = _bt_ctf_field_type_integer_create(size)
1380 super().__init__()
1381
1382 """
1383 Set an integer type's signedness attribute.
1384 """
1385 def set_signed(self, signed):
1386 ret = _bt_ctf_field_type_integer_set_signed(self._ft, signed)
1387 if ret < 0:
1388 raise ValueError("Could not set signed attribute.")
1389
1390 """
1391 Set the integer type's base used to pretty-print the resulting trace.
1392 The base must be a constant of the IntegerBase class.
1393 """
1394 def set_base(self, base):
1395 ret = _bt_ctf_field_type_integer_set_base(self._ft, base)
1396 if ret < 0:
1397 raise ValueError("Could not set base value.")
1398
1399 """
1400 An integer encoding may be set to signal that the integer must be printed
1401 as a text character. Must be a constant from the CTFStringEncoding class.
1402 """
1403 def set_encoding(self, encoding):
1404 ret = _bt_ctf_field_type_integer_set_encoding(self._ft, encoding)
1405 if ret < 0:
1406 raise ValueError("Could not set integer encoding.")
1407
1408 class FieldTypeEnumeration(FieldType):
1409 """
1410 Create a new enumeration field type with the given underlying type.
1411 """
1412 def __init__(self, integer_type):
1413 if integer_type is None or not isinstance(integer_type, CTFWriter.FieldTypeInteger):
1414 raise TypeError("Invalid integer container.")
1415
1416 self._ft = _bt_ctf_field_type_enumeration_create(integer_type._ft)
1417 super().__init__()
1418
1419 """
1420 Add a mapping to the enumeration. The range's values are inclusive.
1421 """
1422 def add_mapping(self, name, range_start, range_end):
1423 ret = _bt_ctf_field_type_enumeration_add_mapping(self._ft, name, range_start, range_end)
1424 if ret < 0:
1425 raise ValueError("Could not add mapping to enumeration type.")
1426
1427 class FieldTypeFloatingPoint(FieldType):
1428 FLT_EXP_DIG = 8
1429 DBL_EXP_DIG = 11
1430 FLT_MANT_DIG = 24
1431 DBL_MANT_DIG = 53
1432
1433 """
1434 Create a new floating point field type.
1435 """
1436 def __init__(self):
1437 self._ft = _bt_ctf_field_type_floating_point_create()
1438 super().__init__()
1439
1440 """
1441 Set the number of exponent digits to use to store the floatingpoint field.
1442 The only values currently supported are FLT_EXP_DIG and DBL_EXP_DIG which
1443 are defined as constants of this class.
1444 """
1445 def set_exponent_digits(self, exponent_digits):
1446 ret = _bt_ctf_field_type_floating_point_set_exponent_digits(self._ft, exponent_digits)
1447 if ret < 0:
1448 raise ValueError("Could not set exponent digit count.")
1449
1450 """
1451 Set the numberof mantissa digits to use to store the floatingpoint field.
1452 The only values currently supported are FLT_MANT_DIG and DBL_MANT_DIG which
1453 are defined as constants of this class.
1454 """
1455 def set_mantissa_digits(self, mantissa_digits):
1456 ret = _bt_ctf_field_type_floating_point_set_mantissa_digits(self._ft, mantissa_digits)
1457 if ret < 0:
1458 raise ValueError("Could not set mantissa digit count.")
1459
1460 class FieldTypeStructure(FieldType):
1461 """
1462 Create a new structure field type.
1463 """
1464 def __init__(self):
1465 self._ft = _bt_ctf_field_type_structure_create()
1466 super().__init__()
1467
1468 """
1469 Add a field of type "field_type" to the structure.
1470 """
1471 def add_field(self, field_type, field_name):
1472 ret = _bt_ctf_field_type_structure_add_field(self._ft, field_type._ft, field_name)
1473 if ret < 0:
1474 raise ValueError("Could not add field to structure.")
1475
1476 class FieldTypeVariant(FieldType):
1477 """
1478 Create a new variant field type.
1479 """
1480 def __init__(self, enum_tag, tag_name):
1481 if enum_tag is None or not isinstance(enum_tag, CTFWriter.FieldTypeEnumeration):
1482 raise TypeError("Invalid tag type; must be of type FieldTypeEnumeration.")
1483
1484 self._ft = _bt_ctf_field_type_variant_create(enum_tag._ft, tag_name)
1485 super().__init__()
1486
1487 """
1488 Add a field of type "field_type" to the variant.
1489 """
1490 def add_field(self, field_type, field_name):
1491 ret = _bt_ctf_field_type_variant_add_field(self._ft, field_type._ft, field_name)
1492 if ret < 0:
1493 raise ValueError("Could not add field to variant.")
1494
1495 class FieldTypeArray(FieldType):
1496 """
1497 Create a new array field type.
1498 """
1499 def __init__(self, element_type, length):
1500 self._ft = _bt_ctf_field_type_array_create(element_type._ft, length)
1501 super().__init__()
1502
1503 class FieldTypeSequence(FieldType):
1504 """
1505 Create a new sequence field type.
1506 """
1507 def __init__(self, element_type, length_field_name):
1508 self._ft = _bt_ctf_field_type_sequence_create(element_type._ft, length_field_name)
1509 super().__init__()
1510
1511 class FieldTypeString(FieldType):
1512 """
1513 Create a new string field type.
1514 """
1515 def __init__(self):
1516 self._ft = _bt_ctf_field_type_string_create()
1517 super().__init__()
1518
1519 """
1520 Set a string type's encoding. Must be a constant from the CTFStringEncoding class.
1521 """
1522 def set_encoding(self, encoding):
1523 ret = _bt_ctf_field_type_string_set_encoding(self._ft, encoding)
1524 if ret < 0:
1525 raise ValueError("Could not set string encoding.")
1526
1527 """
1528 Create an instance of a field.
1529 """
1530 @staticmethod
1531 def create_field(self, field_type):
1532 if field_type is None or not isinstance(field_type, CTFWriter.FieldType):
1533 raise TypeError("Invalid field_type. Type must be a FieldType-derived class.")
1534
1535 if isinstance(field_type, CTFWriter.FieldTypeInteger):
1536 return CTFWriter.FieldInteger(field_type)
1537 elif isinstance(field_type, CTFWriter.FieldTypeEnumeration):
1538 return CTFWriter.FieldEnumeration(field_type)
1539 elif isinstance(field_type, CTFWriter.FieldTypeFloatingPoint):
1540 return CTFWriter.FieldFloatingPoint(field_type)
1541 elif isinstance(field_type, CTFWriter.FieldTypeStructure):
1542 return CTFWriter.FieldStructure(field_type)
1543 elif isinstance(field_type, CTFWriter.FieldTypeVariant):
1544 return CTFWriter.FieldVariant(field_type)
1545 elif isinstance(field_type, CTFWriter.FieldTypeArray):
1546 return CTFWriter.FieldArray(field_type)
1547 elif isinstance(field_type, CTFWriter.FieldTypeSequence):
1548 return CTFWriter.FieldSequence(field_type)
1549 elif isinstance(field_type, CTFWriter.FieldTypeString):
1550 return CTFWriter.FieldString(field_type)
1551
1552 class Field:
1553 """
1554 Base class, do not instantiate.
1555 """
1556 def __init__(self, field_type):
1557 if not isinstance(field_type, CTFWriter.FieldType):
1558 raise TypeError("Invalid field_type argument.")
1559
1560 self._f = _bt_ctf_field_create(field_type._ft)
1561 if self._f is None:
1562 raise ValueError("Field creation failed.")
1563
1564 def __del__(self):
1565 _bt_ctf_field_put(self._f)
1566
1567 @staticmethod
1568 def _create_field_from_native_instance(native_field_instance):
1569 type_dict = {
1570 CTFTypeId.INTEGER : CTFWriter.FieldInteger,
1571 CTFTypeId.FLOAT : CTFWriter.FieldFloatingPoint,
1572 CTFTypeId.ENUM : CTFWriter.FieldEnumeration,
1573 CTFTypeId.STRING : CTFWriter.FieldString,
1574 CTFTypeId.STRUCT : CTFWriter.FieldStructure,
1575 CTFTypeId.VARIANT : CTFWriter.FieldVariant,
1576 CTFTypeId.ARRAY : CTFWriter.FieldArray,
1577 CTFTypeId.SEQUENCE : CTFWriter.FieldSequence
1578 }
1579
1580 field_type = _bt_python_get_field_type(native_field_instance)
1581 if field_type == CTFTypeId.UNKNOWN:
1582 raise TypeError("Invalid field instance")
1583
1584 field = CTFWriter.Field.__new__(CTFWriter.Field)
1585 field._f = native_field_instance
1586 field.__class__ = type_dict[field_type]
1587 return field
1588
1589 class FieldInteger(Field):
1590 """
1591 Set an integer field's value.
1592 """
1593 def set_value(self, value):
1594 signedness = _bt_python_field_integer_get_signedness(self._f)
1595 if signedness < 0:
1596 raise TypeError("Invalid integer instance.")
1597
1598 if signedness == 0:
1599 ret = _bt_ctf_field_unsigned_integer_set_value(self._f, value)
1600 else:
1601 ret = _bt_ctf_field_signed_integer_set_value(self._f, value)
1602
1603 if ret < 0:
1604 raise ValueError("Could not set integer field value.")
1605
1606 class FieldEnumeration(Field):
1607 """
1608 Return the enumeration's underlying container field (an integer field).
1609 """
1610 def get_container(self):
1611 container = CTFWriter.FieldInteger.__new__(CTFWriter.FieldInteger)
1612 container._f = _bt_ctf_field_enumeration_get_container(self._f)
1613 if container._f is None:
1614 raise TypeError("Invalid enumeration field type.")
1615 return container
1616
1617 class FieldFloatingPoint(Field):
1618 """
1619 Set a floating point field's value.
1620 """
1621 def set_value(self, value):
1622 ret = _bt_ctf_field_floating_point_set_value(self._f, value)
1623 if ret < 0:
1624 raise ValueError("Could not set floating point field value.")
1625
1626 class FieldStructure(Field):
1627 """
1628 Get the structure's field corresponding to the provided field name.
1629 """
1630 def get_field(self, field_name):
1631 native_instance = _bt_ctf_field_structure_get_field(self._f, field_name)
1632 if native_instance is None:
1633 raise ValueError("Invalid field_name provided.")
1634 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1635
1636 class FieldVariant(Field):
1637 """
1638 Return the variant's selected field. The "tag" field is the selector enum field.
1639 """
1640 def get_field(self, tag):
1641 native_instance = _bt_ctf_field_variant_get_field(self._f, tag._f)
1642 if native_instance is None:
1643 raise ValueError("Invalid tag provided.")
1644 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1645
1646 class FieldArray(Field):
1647 """
1648 Return the array's field at position "index".
1649 """
1650 def get_field(self, index):
1651 native_instance = _bt_ctf_field_array_get_field(self._f, index)
1652 if native_instance is None:
1653 raise IndexError("Invalid index provided.")
1654 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1655
1656 class FieldSequence(Field):
1657 """
1658 Set the sequence's length field (IntegerField).
1659 """
1660 def set_length(self, length):
1661 if not isinstance(length, CTFWriter.FieldInteger):
1662 raise TypeError("Invalid length field.")
1663 ret = _bt_ctf_field_sequence_set_length(self._f, length._f)
1664 if ret < 0:
1665 raise ValueError("Could not set sequence length.")
1666
1667 """
1668 Return the sequence's field at position "index".
1669 """
1670 def get_field(self, index):
1671 native_instance = _bt_ctf_field_sequence_get_field(self._f, index)
1672 if native_instance is None:
1673 raise ValueError("Could not get sequence element at index.")
1674 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1675
1676 class FieldString(Field):
1677 """
1678 Set a string field's value.
1679 """
1680 def set_value(self, value):
1681 ret = _bt_ctf_field_string_set_value(self._f, value)
1682 if ret < 0:
1683 raise ValueError("Could not set string field value.")
1684
1685 class EventClass:
1686 """
1687 Create a new event class of the given name.
1688 """
1689 def __init__(self, name):
1690 self._ec = _bt_ctf_event_class_create(name)
1691 if self._ec is None:
1692 raise ValueError("Event class creation failed.")
1693
1694 def __del__(self):
1695 _bt_ctf_event_class_put(self._ec)
1696
1697 """
1698 Add a field of type "field_type" to the event class.
1699 """
1700 def add_field(self, field_type, field_name):
1701 ret = _bt_ctf_event_class_add_field(self._ec, field_type._ft, field_name)
1702 if ret < 0:
1703 raise ValueError("Could not add field to event class.")
1704
1705 class Event:
1706 """
1707 Create a new event of the given event class.
1708 """
1709 def __init__(self, event_class):
1710 if not isinstance(event_class, CTFWriter.EventClass):
1711 raise TypeError("Invalid event_class argument.")
1712
1713 self._e = _bt_ctf_event_create(event_class._ec)
1714 if self._e is None:
1715 raise ValueError("Event creation failed.")
1716
1717 def __del__(self):
1718 _bt_ctf_event_put(self._e)
1719
1720 """
1721 Set a manually created field as an event's payload.
1722 """
1723 def set_payload(self, field_name, value):
1724 if not isinstance(value, CTFWriter.Field):
1725 raise TypeError("Invalid value type.")
1726 ret = _bt_ctf_event_set_payload(self._e, field_name, value._f)
1727 if ret < 0:
1728 raise ValueError("Could not set event field payload.")
1729
1730 """
1731 Set a manually created field as an event's payload.
1732 """
1733 def get_payload(self, field_name):
1734 native_instance = _bt_ctf_event_get_payload(self._e, field_name)
1735 if native_instance is None:
1736 raise ValueError("Could not get event payload.")
1737 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1738
1739 class StreamClass:
1740 """
1741 Create a new stream class of the given name.
1742 """
1743 def __init__(self, name):
1744 self._sc = _bt_ctf_stream_class_create(name)
1745 if self._sc is None:
1746 raise ValueError("Stream class creation failed.")
1747
1748 def __del__(self):
1749 _bt_ctf_stream_class_put(self._sc)
1750
1751 """
1752 Assign a clock to a stream class.
1753 """
1754 def set_clock(self, clock):
1755 if not isinstance(clock, CTFWriter.Clock):
1756 raise TypeError("Invalid clock type.")
1757
1758 ret = _bt_ctf_stream_class_set_clock(self._sc, clock._c)
1759 if ret < 0:
1760 raise ValueError("Could not set stream class clock.")
1761
1762 """
1763 Add an event class to a stream class. New events can be added even after a
1764 stream has beem instanciated and events have been appended. However, a stream
1765 will not accept events of a class that has not been registered beforehand.
1766 """
1767 def add_event_class(self, event_class):
1768 if not isinstance(event_class, CTFWriter.EventClass):
1769 raise TypeError("Invalid event_class type.")
1770
1771 ret = _bt_ctf_stream_class_add_event_class(self._sc, event_class._ec)
1772 if ret < 0:
1773 raise ValueError("Could not add event class.")
1774
1775 class Stream:
1776 """
1777 Create a stream of the given class.
1778 """
1779 def __init__(self, stream_class):
1780 if not isinstance(stream_class, CTFWriter.StreamClass):
1781 raise TypeError("Invalid stream_class type.")
1782
1783 self._s = _bt_ctf_stream_create(stream_class._sc)
1784 if self._s is None:
1785 raise ValueError("Stream creation failed.")
1786
1787 def __del__(self):
1788 _bt_ctf_stream_put(self._s)
1789
1790 """
1791 Increase the current packet's discarded event count.
1792 """
1793 def append_discarded_events(self, event_count):
1794 ret = _bt_ctf_stream_append_discarded_events(self._s, event_count)
1795 if ret < 0:
1796 raise ValueError("Could not append discarded events.")
1797
1798 """
1799 Append "event" to the stream's current packet. The stream's associated clock
1800 will be sampled during this call. The event shall not be modified after
1801 being appended to a stream.
1802 """
1803 def append_event(self, event):
1804 ret = _bt_ctf_stream_append_event(self._s, event._e)
1805 if ret < 0:
1806 raise ValueError("Could not append event to stream.")
1807
1808 """
1809 The stream's current packet's events will be flushed to disk. Events
1810 subsequently appended to the stream will be added to a new packet.
1811 """
1812 def flush(self):
1813 ret = _bt_ctf_stream_flush(self._s)
1814 if ret < 0:
1815 raise ValueError("Could not flush stream.")
1816
1817 class Writer:
1818 """
1819 Create a new writer that will produce a trace in the given path.
1820 """
1821 def __init__(self, path):
1822 self._w = _bt_ctf_writer_create(path)
1823 if self._w is None:
1824 raise ValueError("Writer creation failed.")
1825
1826 def __del__(self):
1827 _bt_ctf_writer_put(self._w)
1828
1829 """
1830 Create a new stream instance and register it to the writer.
1831 """
1832 def create_stream(self, stream_class):
1833 if not isinstance(stream_class, CTFWriter.StreamClass):
1834 raise TypeError("Invalid stream_class type.")
1835
1836 stream = CTFWriter.Stream.__new__(CTFWriter.Stream)
1837 stream._s = _bt_ctf_writer_create_stream(self._w, stream_class._sc)
1838 return stream
1839
1840 """
1841 Add an environment field to the trace.
1842 """
1843 def add_environment_field(self, name, value):
1844 ret = _bt_ctf_writer_add_environment_field(self._w, name, value)
1845 if ret < 0:
1846 raise ValueError("Could not add environment field to trace.")
1847
1848 """
1849 Add a clock to the trace. Clocks assigned to stream classes must be
1850 registered to the writer.
1851 """
1852 def add_clock(self, clock):
1853 ret = _bt_ctf_writer_add_clock(self._w, clock._c)
1854 if ret < 0:
1855 raise ValueError("Could not add clock to Writer.")
1856
1857 """
1858 Get the trace's TSDL meta-data.
1859 """
1860 def get_metadata(self):
1861 return _bt_ctf_writer_get_metadata_string(self._w)
1862
1863 """
1864 Flush the trace's metadata to the metadata file.
1865 """
1866 def flush_metadata(self):
1867 _bt_ctf_writer_flush_metadata(self._w)
1868
1869 """
1870 Set the trace's byte order. Must be a constant from the ByteOrder
1871 class. Defaults to BYTE_ORDER_NATIVE, the host machine's endianness.
1872 """
1873 def set_byte_order(self, byte_order):
1874 ret = _bt_ctf_writer_set_byte_order(self._w, byte_order)
1875 if ret < 0:
1876 raise ValueError("Could not set trace's byte order.")
1877
1878 %}
This page took 0.066186 seconds and 5 git commands to generate.