4 * Babeltrace Python Module interface file
6 * Copyright 2012 EfficiOS Inc.
8 * Author: Danny Serres <danny.serres@efficios.com>
9 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
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:
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
24 "BABELTRACE_VERSION_STR
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.
30 To use this module, the first step is to create a TraceCollection and add a
34 %module(docstring=DOCSTRING) babeltrace
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>
60 typedef unsigned long long uint64_t;
61 typedef long long int64_t;
62 typedef int bt_intern_str;
63 typedef int64_t ssize_t;
65 /* =================================================================
67 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
70 FILE *_bt_file_open(char *file_path, char *mode);
71 void _bt_file_close(FILE *fp);
72 struct bt_definition **_bt_python_field_listcaller(
73 const struct bt_ctf_event *ctf_event,
74 const struct bt_definition *scope,
75 unsigned int *OUTPUT);
76 struct bt_definition *_bt_python_field_one_from_list(
77 struct bt_definition **list, int index);
78 struct bt_ctf_event_decl **_bt_python_event_decl_listcaller(
80 struct bt_context *ctx,
81 unsigned int *OUTPUT);
82 struct bt_ctf_event_decl *_bt_python_decl_one_from_list(
83 struct bt_ctf_event_decl **list, int index);
84 struct bt_ctf_field_decl **_by_python_field_decl_listcaller(
85 struct bt_ctf_event_decl *event_decl,
86 enum bt_ctf_scope scope,
87 unsigned int *OUTPUT);
88 struct bt_ctf_field_decl *_bt_python_field_decl_one_from_list(
89 struct bt_ctf_field_decl **list, int index);
90 struct definition_array *_bt_python_get_array_from_def(
91 struct bt_definition *field);
92 struct definition_sequence *_bt_python_get_sequence_from_def(
93 struct bt_definition *field);
94 struct bt_declaration *_bt_python_get_array_element_declaration(
95 struct bt_declaration *field);
96 const char *_bt_python_get_array_string(struct bt_definition *field);
97 int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field);
98 enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field);
100 /* =================================================================
101 CONTEXT.H, CONTEXT-INTERNAL.H
102 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
105 %rename("_bt_context_create") bt_context_create(void);
106 %rename("_bt_context_add_trace") bt_context_add_trace(
107 struct bt_context *ctx, const char *path, const char *format,
108 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
109 struct bt_mmap_stream_list *stream_list, FILE *metadata);
110 %rename("_bt_context_remove_trace") bt_context_remove_trace(
111 struct bt_context *ctx, int trace_id);
112 %rename("_bt_context_get") bt_context_get(struct bt_context *ctx);
113 %rename("_bt_context_put") bt_context_put(struct bt_context *ctx);
114 %rename("_bt_ctf_event_get_context") bt_ctf_event_get_context(
115 const struct bt_ctf_event *event);
117 struct bt_context *bt_context_create(void);
118 int bt_context_add_trace(struct bt_context *ctx, const char *path, const char *format,
119 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
120 struct bt_mmap_stream_list *stream_list, FILE *metadata);
121 void bt_context_remove_trace(struct bt_context *ctx, int trace_id);
122 void bt_context_get(struct bt_context *ctx);
123 void bt_context_put(struct bt_context *ctx);
124 struct bt_context *bt_ctf_event_get_context(const struct bt_ctf_event *event);
126 // class TraceCollection to prevent direct access to struct bt_context
128 class TraceCollection:
130 The TraceCollection is the object that contains all currently opened traces.
134 self._tc = _bt_context_create()
137 _bt_context_put(self._tc)
139 def add_trace(self, path, format_str):
141 Add a trace by path to the TraceCollection.
145 path is the path to the trace, it is not recursive.
146 If "path" is None, stream_list is used instead as a list
147 of mmap streams to open for the trace.
149 format is a string containing the format name in which the trace was
152 Return: the corresponding TraceHandle on success or None on error.
154 ret = _bt_context_add_trace(self._tc, path, format_str, None, None, None)
158 th = TraceHandle.__new__(TraceHandle)
160 th._trace_collection = self
163 def add_traces_recursive(self, path, format_str):
165 Open a trace recursively.
167 Find each trace present in the subdirectory starting from the given
168 path, and add them to the TraceCollection.
170 Return a dict of TraceHandle instances (the full path is the key).
171 Return None on error.
181 for fullpath, dirs, files in os.walk(path):
182 if "metadata" in files:
183 trace_handle = self.add_trace(fullpath, format_str)
184 if trace_handle is None:
188 trace_handles[fullpath] = trace_handle
191 if noTrace and error:
195 def remove_trace(self, trace_handle):
197 Remove a trace from the TraceCollection.
198 Effectively closing the trace.
201 _bt_context_remove_trace(self._tc, trace_handle._id)
202 except AttributeError:
203 raise TypeError("in remove_trace, "
204 "argument 2 must be a TraceHandle instance")
209 Generator function to iterate over the events of open in the current
212 begin_pos_ptr = _bt_iter_pos()
213 end_pos_ptr = _bt_iter_pos()
214 begin_pos_ptr.type = SEEK_BEGIN
215 end_pos_ptr.type = SEEK_LAST
217 for event in self._events(begin_pos_ptr, end_pos_ptr):
220 def events_timestamps(self, timestamp_begin, timestamp_end):
222 Generator function to iterate over the events of open in the current
223 TraceCollection from timestamp_begin to timestamp_end.
225 begin_pos_ptr = _bt_iter_pos()
226 end_pos_ptr = _bt_iter_pos()
227 begin_pos_ptr.type = end_pos_ptr.type = SEEK_TIME
228 begin_pos_ptr.u.seek_time = timestamp_begin
229 end_pos_ptr.u.seek_time = timestamp_end
231 for event in self._events(begin_pos_ptr, end_pos_ptr):
235 def timestamp_begin(self):
236 pos_ptr = _bt_iter_pos()
237 pos_ptr.type = SEEK_BEGIN
238 return self._timestamp_at_pos(pos_ptr)
241 def timestamp_end(self):
242 pos_ptr = _bt_iter_pos()
243 pos_ptr.type = SEEK_LAST
244 return self._timestamp_at_pos(pos_ptr)
246 def _timestamp_at_pos(self, pos_ptr):
247 ctf_it_ptr = _bt_ctf_iter_create(self._tc, pos_ptr, pos_ptr)
248 if ctf_it_ptr is None:
249 raise NotImplementedError("Creation of multiple iterators is unsupported.")
250 ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
251 _bt_ctf_iter_destroy(ctf_it_ptr)
255 def _events(self, begin_pos_ptr, end_pos_ptr):
256 ctf_it_ptr = _bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr)
257 if ctf_it_ptr is None:
258 raise NotImplementedError(
259 "Creation of multiple iterators is unsupported.")
262 ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
266 ev = Event.__new__(Event)
270 except GeneratorExit:
273 ret = _bt_iter_next(_bt_ctf_get_iter(ctf_it_ptr))
277 _bt_ctf_iter_destroy(ctf_it_ptr)
283 /* =================================================================
288 %rename("lookup_format") bt_lookup_format(bt_intern_str qname);
289 %rename("_bt_print_format_list") bt_fprintf_format_list(FILE *fp);
290 %rename("register_format") bt_register_format(struct format *format);
291 %rename("unregister_format") bt_unregister_format(struct bt_format *format);
293 extern struct format *bt_lookup_format(bt_intern_str qname);
294 extern void bt_fprintf_format_list(FILE *fp);
295 extern int bt_register_format(struct bt_format *format);
296 extern void bt_unregister_format(struct bt_format *format);
300 def print_format_list(babeltrace_file):
302 Print a list of available formats to file.
304 babeltrace_file must be a File instance opened in write mode.
307 if babeltrace_file._file is not None:
308 _bt_print_format_list(babeltrace_file._file)
309 except AttributeError:
310 raise TypeError("in print_format_list, "
311 "argument 1 must be a File instance")
316 /* =================================================================
317 ITERATOR.H, ITERATOR-INTERNAL.H
318 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
321 %rename("_bt_iter_create") bt_iter_create(struct bt_context *ctx,
322 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
323 %rename("_bt_iter_destroy") bt_iter_destroy(struct bt_iter *iter);
324 %rename("_bt_iter_next") bt_iter_next(struct bt_iter *iter);
325 %rename("_bt_iter_get_pos") bt_iter_get_pos(struct bt_iter *iter);
326 %rename("_bt_iter_free_pos") bt_iter_free_pos(struct bt_iter_pos *pos);
327 %rename("_bt_iter_set_pos") bt_iter_set_pos(struct bt_iter *iter,
328 const struct bt_iter_pos *pos);
329 %rename("_bt_iter_create_time_pos") bt_iter_create_time_pos(struct bt_iter *iter,
332 struct bt_iter *bt_iter_create(struct bt_context *ctx,
333 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
334 void bt_iter_destroy(struct bt_iter *iter);
335 int bt_iter_next(struct bt_iter *iter);
336 struct bt_iter_pos *bt_iter_get_pos(struct bt_iter *iter);
337 void bt_iter_free_pos(struct bt_iter_pos *pos);
338 int bt_iter_set_pos(struct bt_iter *iter, const struct bt_iter_pos *pos);
339 struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter, uint64_t timestamp);
341 %rename("_bt_iter_pos") bt_iter_pos;
342 %rename("SEEK_TIME") BT_SEEK_TIME;
343 %rename("SEEK_RESTORE") BT_SEEK_RESTORE;
344 %rename("SEEK_CUR") BT_SEEK_CUR;
345 %rename("SEEK_BEGIN") BT_SEEK_BEGIN;
346 %rename("SEEK_LAST") BT_SEEK_LAST;
348 // This struct is taken from iterator.h
349 // All changes to the struct must also be made here
352 BT_SEEK_TIME, /* uses u.seek_time */
353 BT_SEEK_RESTORE, /* uses u.restore */
360 struct bt_saved_pos *restore;
364 /* =================================================================
365 TRACE-HANDLE.H, TRACE-HANDLE-INTERNAL.H
366 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
369 %rename("_bt_trace_handle_create") bt_trace_handle_create(struct bt_context *ctx);
370 %rename("_bt_trace_handle_destroy") bt_trace_handle_destroy(struct bt_trace_handle *bt);
371 struct bt_trace_handle *bt_trace_handle_create(struct bt_context *ctx);
372 void bt_trace_handle_destroy(struct bt_trace_handle *bt);
374 %rename("_bt_trace_handle_get_path") bt_trace_handle_get_path(struct bt_context *ctx,
376 %rename("_bt_trace_handle_get_timestamp_begin") bt_trace_handle_get_timestamp_begin(
377 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
378 %rename("_bt_trace_handle_get_timestamp_end") bt_trace_handle_get_timestamp_end(
379 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
380 const char *bt_trace_handle_get_path(struct bt_context *ctx, int handle_id);
381 uint64_t bt_trace_handle_get_timestamp_begin(struct bt_context *ctx, int handle_id,
382 enum bt_clock_type type);
383 uint64_t bt_trace_handle_get_timestamp_end(struct bt_context *ctx, int handle_id,
384 enum bt_clock_type type);
386 %rename("_bt_ctf_event_get_handle_id") bt_ctf_event_get_handle_id(
387 const struct bt_ctf_event *event);
388 int bt_ctf_event_get_handle_id(const struct bt_ctf_event *event);
393 # Based on enum bt_clock_type in clock-type.h
398 class TraceHandle(object):
400 The TraceHandle allows the user to manipulate a trace file directly.
401 It is a unique identifier representing a trace file.
406 raise NotImplementedError("TraceHandle cannot be instantiated")
409 return "Babeltrace TraceHandle: trace_id('{0}')".format(self._id)
413 """Return the TraceHandle id."""
418 """Return the path of a TraceHandle."""
419 return _bt_trace_handle_get_path(self._trace_collection._tc, self._id)
422 def timestamp_begin(self):
423 """Return the creation time of the buffers of a trace."""
424 return _bt_trace_handle_get_timestamp_begin(
425 self._trace_collection._tc, self._id, ClockType.CLOCK_REAL)
428 def timestamp_end(self):
429 """Return the destruction timestamp of the buffers of a trace."""
430 return _bt_trace_handle_get_timestamp_end(
431 self._trace_collection._tc, self._id, ClockType.CLOCK_REAL)
436 Generator returning all events (EventDeclaration) in a trace.
438 ret = _bt_python_event_decl_listcaller(self.id, self._trace_collection._tc)
440 if not isinstance(ret, list):
443 ptr_list, count = ret
444 for i in range(count):
445 tmp = EventDeclaration.__new__(EventDeclaration)
446 tmp._ed = _bt_python_decl_one_from_list(ptr_list, i)
453 // =================================================================
455 // =================================================================
457 /* =================================================================
463 %rename("_bt_ctf_iter_create") bt_ctf_iter_create(struct bt_context *ctx,
464 const struct bt_iter_pos *begin_pos,
465 const struct bt_iter_pos *end_pos);
466 %rename("_bt_ctf_get_iter") bt_ctf_get_iter(struct bt_ctf_iter *iter);
467 %rename("_bt_ctf_iter_destroy") bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
468 %rename("_bt_ctf_iter_read_event") bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
470 struct bt_ctf_iter *bt_ctf_iter_create(struct bt_context *ctx,
471 const struct bt_iter_pos *begin_pos,
472 const struct bt_iter_pos *end_pos);
473 struct bt_iter *bt_ctf_get_iter(struct bt_ctf_iter *iter);
474 void bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
475 struct bt_ctf_event *bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
479 %rename("_bt_ctf_get_top_level_scope") bt_ctf_get_top_level_scope(const struct
480 bt_ctf_event *event, enum bt_ctf_scope scope);
481 %rename("_bt_ctf_event_name") bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
482 %rename("_bt_ctf_get_timestamp") bt_ctf_get_timestamp(
483 const struct bt_ctf_event *ctf_event);
484 %rename("_bt_ctf_get_cycles") bt_ctf_get_cycles(
485 const struct bt_ctf_event *ctf_event);
487 %rename("_bt_ctf_get_field") bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
488 const struct bt_definition *scope, const char *field);
489 %rename("_bt_ctf_get_index") bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
490 const struct bt_definition *field, unsigned int index);
491 %rename("_bt_ctf_field_name") bt_ctf_field_name(const struct bt_definition *field);
492 %rename("_bt_ctf_field_type") bt_ctf_field_type(const struct bt_declaration *field);
493 %rename("_bt_ctf_get_int_signedness") bt_ctf_get_int_signedness(
494 const struct bt_declaration *field);
495 %rename("_bt_ctf_get_int_base") bt_ctf_get_int_base(const struct bt_declaration *field);
496 %rename("_bt_ctf_get_int_byte_order") bt_ctf_get_int_byte_order(
497 const struct bt_declaration *field);
498 %rename("_bt_ctf_get_int_len") bt_ctf_get_int_len(const struct bt_declaration *field);
499 %rename("_bt_ctf_get_enum_int") bt_ctf_get_enum_int(const struct bt_definition *field);
500 %rename("_bt_ctf_get_enum_str") bt_ctf_get_enum_str(const struct bt_definition *field);
501 %rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct bt_declaration *field);
502 %rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct bt_declaration *field);
503 %rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct bt_definition *field);
504 %rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct bt_definition *field);
505 %rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field);
506 %rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field);
507 %rename("_bt_ctf_get_float") bt_ctf_get_float(const struct bt_definition *field);
508 %rename("_bt_ctf_get_variant") bt_ctf_get_variant(const struct bt_definition *field);
509 %rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void);
510 %rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct
511 bt_ctf_event_decl *event);
512 %rename("_bt_ctf_get_decl_event_id") bt_ctf_get_decl_event_id(const struct
513 bt_ctf_event_decl *event);
514 %rename("_bt_ctf_get_decl_field_name") bt_ctf_get_decl_field_name(
515 const struct bt_ctf_field_decl *field);
516 %rename("_bt_ctf_get_decl_from_def") bt_ctf_get_decl_from_def(
517 const struct bt_definition *field);
518 %rename("_bt_ctf_get_decl_from_field_decl") bt_ctf_get_decl_from_field_decl(
519 const struct bt_ctf_field_decl *field);
520 %rename("_bt_array_index") bt_array_index(struct definition_array *array, uint64_t i);
521 %rename("_bt_sequence_len") bt_sequence_len(struct definition_sequence *sequence);
522 %rename("_bt_sequence_index") bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
523 %rename("_bt_ctf_get_struct_field_count") bt_ctf_get_struct_field_count(const struct bt_definition *structure);
524 %rename("_bt_ctf_get_struct_field_index") bt_ctf_get_struct_field_index(const struct bt_definition *structure, uint64_t i);
526 const struct bt_definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event,
527 enum bt_ctf_scope scope);
528 const char *bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
529 uint64_t bt_ctf_get_timestamp(const struct bt_ctf_event *ctf_event);
530 uint64_t bt_ctf_get_cycles(const struct bt_ctf_event *ctf_event);
531 const struct bt_definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
532 const struct bt_definition *scope,
534 const struct bt_definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
535 const struct bt_definition *field,
537 const char *bt_ctf_field_name(const struct bt_definition *field);
538 enum ctf_type_id bt_ctf_field_type(const struct bt_declaration *field);
539 int bt_ctf_get_int_signedness(const struct bt_declaration *field);
540 int bt_ctf_get_int_base(const struct bt_declaration *field);
541 int bt_ctf_get_int_byte_order(const struct bt_declaration *field);
542 ssize_t bt_ctf_get_int_len(const struct bt_declaration *field);
543 const struct bt_definition *bt_ctf_get_enum_int(const struct bt_definition *field);
544 const char *bt_ctf_get_enum_str(const struct bt_definition *field);
545 enum ctf_string_encoding bt_ctf_get_encoding(const struct bt_declaration *field);
546 int bt_ctf_get_array_len(const struct bt_declaration *field);
547 struct bt_definition *bt_array_index(struct definition_array *array, uint64_t i);
548 uint64_t bt_ctf_get_uint64(const struct bt_definition *field);
549 int64_t bt_ctf_get_int64(const struct bt_definition *field);
550 char *bt_ctf_get_char_array(const struct bt_definition *field);
551 char *bt_ctf_get_string(const struct bt_definition *field);
552 double bt_ctf_get_float(const struct bt_definition *field);
553 const struct bt_definition *bt_ctf_get_variant(const struct bt_definition *field);
554 int bt_ctf_field_get_error(void);
555 const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event);
556 uint64_t bt_ctf_get_decl_event_id(const struct bt_ctf_event_decl *event);
557 const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field);
558 const struct bt_declaration *bt_ctf_get_decl_from_def(const struct bt_definition *field);
559 const struct bt_declaration *bt_ctf_get_decl_from_field_decl(const struct bt_ctf_field_decl *field);
560 uint64_t bt_sequence_len(struct definition_sequence *sequence);
561 struct bt_definition *bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
562 uint64_t bt_ctf_get_struct_field_count(const struct bt_definition *structure);
563 const struct bt_definition *bt_ctf_get_struct_field_index(const struct bt_definition *structure, uint64_t i);
567 class CTFStringEncoding:
573 # Based on the enum in ctf-writer/writer.h
575 BYTE_ORDER_NATIVE = 0
576 BYTE_ORDER_LITTLE_ENDIAN = 1
577 BYTE_ORDER_BIG_ENDIAN = 2
578 BYTE_ORDER_NETWORK = 3
579 BYTE_ORDER_UNKNOWN = 4 # Python-specific entry
581 #enum equivalent, accessible constants
582 #These are taken directly from ctf/events.h
583 #All changes to enums must also be made here
598 name = "UNKNOWN_TYPE"
599 constants = [attr for attr in dir(CTFTypeId) if not callable(getattr(CTFTypeId, attr)) and not attr.startswith("__")]
600 for attr in constants:
601 if getattr(CTFTypeId, attr) == id:
607 TRACE_PACKET_HEADER = 0
608 STREAM_PACKET_CONTEXT = 1
609 STREAM_EVENT_HEADER = 2
610 STREAM_EVENT_CONTEXT = 3
614 def scope_name(scope):
615 name = "UNKNOWN_SCOPE"
616 constants = [attr for attr in dir(CTFScope) if not callable(getattr(CTFScope, attr)) and not attr.startswith("__")]
617 for attr in constants:
618 if getattr(CTFScope, attr) == scope:
623 # Priority of the scopes when searching for event fields
624 _scopes = [CTFScope.EVENT_FIELDS, CTFScope.EVENT_CONTEXT, CTFScope.STREAM_EVENT_CONTEXT,
625 CTFScope.STREAM_EVENT_HEADER, CTFScope.STREAM_PACKET_CONTEXT, CTFScope.TRACE_PACKET_HEADER]
628 class Event(collections.Mapping):
630 This class represents an event from the trace.
631 It is obtained using the TraceCollection generator functions.
635 raise NotImplementedError("Event cannot be instantiated")
639 """Return the name of the event or None on error."""
640 return _bt_ctf_event_name(self._e)
645 Return the timestamp of the event as written in
646 the packet (in cycles) or -1ULL on error.
648 return _bt_ctf_get_cycles(self._e)
653 Return the timestamp of the event offset with the
654 system clock source or -1ULL on error.
656 return _bt_ctf_get_timestamp(self._e)
658 def field_with_scope(self, field_name, scope):
660 Get field_name's value in scope.
661 None is returned if no field matches field_name.
663 if not scope in _scopes:
664 raise ValueError("Invalid scope provided")
665 field = self._field_with_scope(field_name, scope)
666 if field is not None:
670 def field_list_with_scope(self, scope):
671 """Return a list of field names in scope."""
672 if not scope in _scopes:
673 raise ValueError("Invalid scope provided")
675 for field in self._field_list_with_scope(scope):
676 field_names.append(field.name)
682 Get the TraceHandle associated with this event
685 ret = _bt_ctf_event_get_handle_id(self._e)
689 th = TraceHandle.__new__(TraceHandle)
691 th._trace_collection = self.get_trace_collection()
695 def trace_collection(self):
697 Get the TraceCollection associated with this event.
698 Return None on error.
700 trace_collection = TraceCollection()
701 trace_collection._tc = _bt_ctf_event_get_context(self._e);
702 if trace_collection._tc is None:
705 return trace_collection
707 def __getitem__(self, field_name):
709 Get field_name's value. If the field_name exists in multiple
710 scopes, the first field found is returned. The scopes are searched
711 in the following order:
714 3) STREAM_EVENT_CONTEXT
715 4) STREAM_EVENT_HEADER
716 5) STREAM_PACKET_CONTEXT
717 6) TRACE_PACKET_HEADER
718 None is returned if no field matches field_name.
720 Use field_with_scope() to explicitly access fields in a given
723 field = self._field(field_name)
724 if field is not None:
726 raise KeyError(field_name)
729 for key in self.keys():
734 for scope in _scopes:
735 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
736 ret = _bt_python_field_listcaller(self._e, scope_ptr)
737 if isinstance(ret, list):
741 def __contains__(self, field_name):
742 return self._field(field_name) is not None
745 """Return a list of field names."""
747 for scope in _scopes:
748 for name in self.field_list_with_scope(scope):
749 field_names.add(name)
750 return list(field_names)
752 def get(self, field_name, default = None):
753 field = self._field(field_name)
759 for field in self.keys():
760 yield (field, self[field])
762 def _field_with_scope(self, field_name, scope):
763 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
764 if scope_ptr is None:
767 definition_ptr = _bt_ctf_get_field(self._e, scope_ptr, field_name)
768 if definition_ptr is None:
771 field = _Definition(definition_ptr, scope)
774 def _field(self, field_name):
776 for scope in _scopes:
777 field = self._field_with_scope(field_name, scope)
778 if field is not None:
782 def _field_list_with_scope(self, scope):
784 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
786 # Returns a list [list_ptr, count]. If list_ptr is NULL, SWIG will only
787 # provide the "count" return value
790 ret = _bt_python_field_listcaller(self._e, scope_ptr)
791 if isinstance(ret, list):
792 list_ptr, count = ret
794 for i in range(count):
795 definition_ptr = _bt_python_field_one_from_list(list_ptr, i)
796 if definition_ptr is not None:
797 definition = _Definition(definition_ptr, scope)
798 fields.append(definition)
801 class FieldError(Exception):
802 def __init__(self, value):
806 return repr(self.value)
808 class EventDeclaration(object):
809 """Event declaration class. Do not instantiate."""
810 MAX_UINT64 = 0xFFFFFFFFFFFFFFFF
813 raise NotImplementedError("EventDeclaration cannot be instantiated")
817 """Return the name of the event or None on error"""
818 return _bt_ctf_get_decl_event_name(self._ed)
822 """Return the event-ID of the event or -1 on error"""
823 id = _bt_ctf_get_decl_event_id(self._ed)
824 if id == self.MAX_UINT64:
831 Generator returning all FieldDeclarations of an event, going through
832 each scope in the following order:
835 3) STREAM_EVENT_CONTEXT
836 4) STREAM_EVENT_HEADER
837 5) STREAM_PACKET_CONTEXT
838 6) TRACE_PACKET_HEADER
840 for scope in _scopes:
841 for declaration in self.fields_scope(scope):
844 def fields_scope(self, scope):
846 Generator returning FieldDeclarations of the current event in scope.
848 ret = _by_python_field_decl_listcaller(self._ed, scope)
850 if not isinstance(ret, list):
853 list_ptr, count = ret
854 for i in range(count):
855 field_declaration_ptr = _bt_python_field_decl_one_from_list(list_ptr, i)
856 if field_declaration_ptr is not None:
857 declaration_ptr = _bt_ctf_get_decl_from_field_decl(field_declaration_ptr)
858 field_declaration = _create_field_declaration(declaration_ptr, _bt_ctf_get_decl_field_name(field_declaration_ptr), scope)
859 yield field_declaration
861 class FieldDeclaration(object):
862 """Field declaration class. Do not instantiate."""
864 raise NotImplementedError("FieldDeclaration cannot be instantiated")
867 return "({0}) {1} {2}".format(CTFScope.scope_name(self.scope), CTFTypeId.type_name(self.type), self.name)
871 """Return the name of a FieldDeclaration or None on error."""
877 Return the FieldDeclaration's type. One of the entries in class
880 return _bt_ctf_field_type(self._fd)
885 Return the FieldDeclaration's scope.
889 class IntegerFieldDeclaration(FieldDeclaration):
890 """Do not instantiate."""
892 raise NotImplementedError("IntegerFieldDeclaration cannot be instantiated")
895 def signedness(self):
897 Return the signedness of an integer:
898 0 if unsigned; 1 if signed; -1 on error.
900 return _bt_ctf_get_int_signedness(self._fd)
904 """Return the base of an int or a negative value on error."""
905 return _bt_ctf_get_int_base(self._fd)
908 def byte_order(self):
910 Return the byte order. One of class ByteOrder's entries.
912 ret = _bt_ctf_get_int_byte_order(self._fd)
914 return ByteOrder.BYTE_ORDER_LITTLE_ENDIAN
916 return ByteOrder.BYTE_ORDER_BIG_ENDIAN
918 return ByteOrder.BYTE_ORDER_UNKNOWN
923 Return the size, in bits, of an int or a negative
926 return _bt_ctf_get_int_len(self._fd)
931 Return the encoding. One of class CTFStringEncoding's entries.
932 Return a negative value on error.
934 return _bt_ctf_get_encoding(self._fd)
936 class EnumerationFieldDeclaration(FieldDeclaration):
937 """Do not instantiate."""
939 raise NotImplementedError("EnumerationFieldDeclaration cannot be instantiated")
941 class ArrayFieldDeclaration(FieldDeclaration):
942 """Do not instantiate."""
944 raise NotImplementedError("ArrayFieldDeclaration cannot be instantiated")
949 Return the length of an array or a negative
952 return _bt_ctf_get_array_len(self._fd)
955 def element_declaration(self):
957 Return element declaration.
959 field_decl_ptr = _bt_python_get_array_element_declaration(self._fd)
960 return _create_field_declaration(field_decl_ptr, "", self.scope)
962 class SequenceFieldDeclaration(FieldDeclaration):
963 """Do not instantiate."""
965 raise NotImplementedError("SequenceFieldDeclaration cannot be instantiated")
967 class FloatFieldDeclaration(FieldDeclaration):
968 """Do not instantiate."""
970 raise NotImplementedError("FloatFieldDeclaration cannot be instantiated")
972 class StructureFieldDeclaration(FieldDeclaration):
973 """Do not instantiate."""
975 raise NotImplementedError("StructureFieldDeclaration cannot be instantiated")
977 class StringFieldDeclaration(FieldDeclaration):
978 """Do not instantiate."""
980 raise NotImplementedError("StringFieldDeclaration cannot be instantiated")
982 class VariantFieldDeclaration(FieldDeclaration):
983 """Do not instantiate."""
985 raise NotImplementedError("VariantFieldDeclaration cannot be instantiated")
989 Return the last error code encountered while
990 accessing a field and reset the error flag.
991 Return 0 if no error, a negative value otherwise.
993 return _bt_ctf_field_get_error()
995 def _create_field_declaration(declaration_ptr, name, scope):
997 Private field declaration factory.
999 if declaration_ptr is None:
1000 raise ValueError("declaration_ptr must be valid")
1001 if not scope in _scopes:
1002 raise ValueError("Invalid scope provided")
1004 type = _bt_ctf_field_type(declaration_ptr)
1006 if type == CTFTypeId.INTEGER:
1007 declaration = IntegerFieldDeclaration.__new__(IntegerFieldDeclaration)
1008 elif type == CTFTypeId.ENUM:
1009 declaration = EnumerationFieldDeclaration.__new__(EnumerationFieldDeclaration)
1010 elif type == CTFTypeId.ARRAY:
1011 declaration = ArrayFieldDeclaration.__new__(ArrayFieldDeclaration)
1012 elif type == CTFTypeId.SEQUENCE:
1013 declaration = SequenceFieldDeclaration.__new__(SequenceFieldDeclaration)
1014 elif type == CTFTypeId.FLOAT:
1015 declaration = FloatFieldDeclaration.__new__(FloatFieldDeclaration)
1016 elif type == CTFTypeId.STRUCT:
1017 declaration = StructureFieldDeclaration.__new__(StructureFieldDeclaration)
1018 elif type == CTFTypeId.STRING:
1019 declaration = StringFieldDeclaration.__new__(StringFieldDeclaration)
1020 elif type == CTFTypeId.VARIANT:
1021 declaration = VariantFieldDeclaration.__new__(VariantFieldDeclaration)
1025 declaration._fd = declaration_ptr
1026 declaration._s = scope
1027 declaration._name = name
1030 class _Definition(object):
1031 def __init__(self, definition_ptr, scope):
1032 self._d = definition_ptr
1034 if not scope in _scopes:
1035 ValueError("Invalid scope provided")
1039 """Return the name of a field or None on error."""
1040 return _bt_ctf_field_name(self._d)
1044 """Return the type of a field or -1 if unknown."""
1045 return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d))
1048 def declaration(self):
1049 """Return the associated Definition object."""
1050 return _create_field_declaration(_bt_ctf_get_decl_from_def(self._d), self.name, self.scope)
1052 def _get_enum_str(self):
1054 Return the string matching the current enumeration.
1055 Return None on error.
1057 return _bt_ctf_get_enum_str(self._d)
1059 def _get_array_element_at(self, index):
1061 Return the array's element at position index.
1062 Return None on error
1064 array_ptr = _bt_python_get_array_from_def(self._d)
1065 if array_ptr is None:
1068 definition_ptr = _bt_array_index(array_ptr, index)
1069 if definition_ptr is None:
1071 return _Definition(definition_ptr, self.scope)
1073 def _get_sequence_len(self):
1075 Return the len of a sequence or a negative
1078 seq = _bt_python_get_sequence_from_def(self._d)
1079 return _bt_sequence_len(seq)
1081 def _get_sequence_element_at(self, index):
1083 Return the sequence's element at position index,
1084 otherwise return None
1086 seq = _bt_python_get_sequence_from_def(self._d)
1088 definition_ptr = _bt_sequence_index(seq, index)
1089 if definition_ptr is not None:
1090 return _Definition(definition_ptr, self.scope)
1093 def _get_uint64(self):
1095 Return the value associated with the field.
1096 If the field does not exist or is not of the type requested,
1097 the value returned is undefined. To check if an error occured,
1098 use the field_error() function after accessing a field.
1100 return _bt_ctf_get_uint64(self._d)
1102 def _get_int64(self):
1104 Return the value associated with the field.
1105 If the field does not exist or is not of the type requested,
1106 the value returned is undefined. To check if an error occured,
1107 use the field_error() function after accessing a field.
1109 return _bt_ctf_get_int64(self._d)
1111 def _get_char_array(self):
1113 Return the value associated with the field.
1114 If the field does not exist or is not of the type requested,
1115 the value returned is undefined. To check if an error occurred,
1116 use the field_error() function after accessing a field.
1118 return _bt_ctf_get_char_array(self._d)
1122 Return the value associated with the field.
1123 If the field does not exist or is not of the type requested,
1124 the value returned is undefined. To check if an error occurred,
1125 use the field_error() function after accessing a field.
1127 return _bt_ctf_get_string(self._d)
1129 def _get_float(self):
1131 Return the value associated with the field.
1132 If the field does not exist or is not of the type requested,
1133 the value returned is undefined. To check if an error occurred,
1134 use the field_error() function after accessing a field.
1136 return _bt_ctf_get_float(self._d)
1138 def _get_variant(self):
1140 Return the variant's selected field.
1141 If the field does not exist or is not of the type requested,
1142 the value returned is undefined. To check if an error occurred,
1143 use the field_error() function after accessing a field.
1145 return _bt_ctf_get_variant(self._d)
1147 def _get_struct_field_count(self):
1149 Return the number of fields contained in the structure.
1150 If the field does not exist or is not of the type requested,
1151 the value returned is undefined.
1153 return _bt_ctf_get_struct_field_count(self._d)
1155 def _get_struct_field_at(self, i):
1157 Return the structure's field at position i.
1158 If the field does not exist or is not of the type requested,
1159 the value returned is undefined. To check if an error occurred,
1160 use the field_error() function after accessing a field.
1162 return _bt_ctf_get_struct_field_index(self._d, i)
1167 Return the value associated with the field according to its type.
1168 Return None on error.
1173 if id == CTFTypeId.STRING:
1174 value = self._get_str()
1175 elif id == CTFTypeId.ARRAY:
1176 element_decl = self.declaration.element_declaration
1177 if ((element_decl.type == CTFTypeId.INTEGER
1178 and element_decl.length == 8)
1179 and (element_decl.encoding == CTFStringEncoding.ASCII or element_decl.encoding == CTFStringEncoding.UTF8)):
1180 value = _bt_python_get_array_string(self._d)
1183 for i in range(self.declaration.length):
1184 element = self._get_array_element_at(i)
1185 value.append(element.value)
1186 elif id == CTFTypeId.INTEGER:
1187 if self.declaration.signedness == 0:
1188 value = self._get_uint64()
1190 value = self._get_int64()
1191 elif id == CTFTypeId.ENUM:
1192 value = self._get_enum_str()
1193 elif id == CTFTypeId.SEQUENCE:
1194 seq_len = self._get_sequence_len()
1196 for i in range(seq_len):
1197 evDef = self._get_sequence_element_at(i)
1198 value.append(evDef.value)
1199 elif id == CTFTypeId.FLOAT:
1200 value = self._get_float()
1201 elif id == CTFTypeId.VARIANT:
1202 variant = _Definition.__new__(_Definition)
1203 variant._d = self._get_variant();
1204 value = variant.value
1205 elif id == CTFTypeId.STRUCT:
1207 for i in range(self._get_struct_field_count()):
1208 member = _Definition(self._get_struct_field_at(i), self.scope)
1209 value[member.name] = member.value
1212 raise FieldError("Error occurred while accessing field {} of type {}".format(self.name, CTFTypeId.type_name(id)))
1217 """Return the scope of a field or None on error."""
1223 // =================================================================
1225 // =================================================================
1227 /* =================================================================
1229 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1231 %rename("_bt_ctf_clock_create") bt_ctf_clock_create(const char *name);
1232 %rename("_bt_ctf_clock_set_description") bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc);
1233 %rename("_bt_ctf_clock_set_frequency") bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq);
1234 %rename("_bt_ctf_clock_set_precision") bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision);
1235 %rename("_bt_ctf_clock_set_offset_s") bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, uint64_t offset_s);
1236 %rename("_bt_ctf_clock_set_offset") bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, uint64_t offset);
1237 %rename("_bt_ctf_clock_set_is_absolute") bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute);
1238 %rename("_bt_ctf_clock_set_time") bt_ctf_clock_set_time(struct bt_ctf_clock *clock, uint64_t time);
1239 %rename("_bt_ctf_clock_get") bt_ctf_clock_get(struct bt_ctf_clock *clock);
1240 %rename("_bt_ctf_clock_put") bt_ctf_clock_put(struct bt_ctf_clock *clock);
1242 struct bt_ctf_clock *bt_ctf_clock_create(const char *name);
1243 int bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc);
1244 int bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq);
1245 int bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision);
1246 int bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, uint64_t offset_s);
1247 int bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, uint64_t offset);
1248 int bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute);
1249 int bt_ctf_clock_set_time(struct bt_ctf_clock *clock, uint64_t time);
1250 void bt_ctf_clock_get(struct bt_ctf_clock *clock);
1251 void bt_ctf_clock_put(struct bt_ctf_clock *clock);
1253 /* =================================================================
1255 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1257 %rename("_bt_ctf_field_type_integer_create") bt_ctf_field_type_integer_create(unsigned int size);
1258 %rename("_bt_ctf_field_type_integer_set_signed") bt_ctf_field_type_integer_set_signed(struct bt_ctf_field_type *integer, int is_signed);
1259 %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);
1260 %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);
1261 %rename("_bt_ctf_field_type_enumeration_create") bt_ctf_field_type_enumeration_create(struct bt_ctf_field_type *integer_container_type);
1262 %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);
1263 %rename("_bt_ctf_field_type_floating_point_create") bt_ctf_field_type_floating_point_create(void);
1264 %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);
1265 %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);
1266 %rename("_bt_ctf_field_type_structure_create") bt_ctf_field_type_structure_create(void);
1267 %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);
1268 %rename("_bt_ctf_field_type_variant_create") bt_ctf_field_type_variant_create(struct bt_ctf_field_type *enum_tag, const char *tag_name);
1269 %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);
1270 %rename("_bt_ctf_field_type_array_create") bt_ctf_field_type_array_create(struct bt_ctf_field_type *element_type, unsigned int length);
1271 %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);
1272 %rename("_bt_ctf_field_type_string_create") bt_ctf_field_type_string_create(void);
1273 %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);
1274 %rename("_bt_ctf_field_type_set_alignment") bt_ctf_field_type_set_alignment(struct bt_ctf_field_type *type, unsigned int alignment);
1275 %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);
1276 %rename("_bt_ctf_field_type_get") bt_ctf_field_type_get(struct bt_ctf_field_type *type);
1277 %rename("_bt_ctf_field_type_put") bt_ctf_field_type_put(struct bt_ctf_field_type *type);
1279 struct bt_ctf_field_type *bt_ctf_field_type_integer_create(unsigned int size);
1280 int bt_ctf_field_type_integer_set_signed(struct bt_ctf_field_type *integer, int is_signed);
1281 int bt_ctf_field_type_integer_set_base(struct bt_ctf_field_type *integer, enum bt_ctf_integer_base base);
1282 int bt_ctf_field_type_integer_set_encoding(struct bt_ctf_field_type *integer, enum ctf_string_encoding encoding);
1283 struct bt_ctf_field_type *bt_ctf_field_type_enumeration_create(struct bt_ctf_field_type *integer_container_type);
1284 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);
1285 struct bt_ctf_field_type *bt_ctf_field_type_floating_point_create(void);
1286 int bt_ctf_field_type_floating_point_set_exponent_digits(struct bt_ctf_field_type *floating_point, unsigned int exponent_digits);
1287 int bt_ctf_field_type_floating_point_set_mantissa_digits(struct bt_ctf_field_type *floating_point, unsigned int mantissa_digits);
1288 struct bt_ctf_field_type *bt_ctf_field_type_structure_create(void);
1289 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);
1290 struct bt_ctf_field_type *bt_ctf_field_type_variant_create(struct bt_ctf_field_type *enum_tag, const char *tag_name);
1291 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);
1292 struct bt_ctf_field_type *bt_ctf_field_type_array_create(struct bt_ctf_field_type *element_type, unsigned int length);
1293 struct bt_ctf_field_type *bt_ctf_field_type_sequence_create(struct bt_ctf_field_type *element_type, const char *length_field_name);
1294 struct bt_ctf_field_type *bt_ctf_field_type_string_create(void);
1295 int bt_ctf_field_type_string_set_encoding(struct bt_ctf_field_type *string, enum ctf_string_encoding encoding);
1296 int bt_ctf_field_type_set_alignment(struct bt_ctf_field_type *type, unsigned int alignment);
1297 int bt_ctf_field_type_set_byte_order(struct bt_ctf_field_type *type, enum bt_ctf_byte_order byte_order);
1298 void bt_ctf_field_type_get(struct bt_ctf_field_type *type);
1299 void bt_ctf_field_type_put(struct bt_ctf_field_type *type);
1301 /* =================================================================
1303 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1305 %rename("_bt_ctf_field_create") bt_ctf_field_create(struct bt_ctf_field_type *type);
1306 %rename("_bt_ctf_field_structure_get_field") bt_ctf_field_structure_get_field(struct bt_ctf_field *structure, const char *name);
1307 %rename("_bt_ctf_field_array_get_field") bt_ctf_field_array_get_field(struct bt_ctf_field *array, uint64_t index);
1308 %rename("_bt_ctf_field_sequence_set_length") bt_ctf_field_sequence_set_length(struct bt_ctf_field *sequence, struct bt_ctf_field *length_field);
1309 %rename("_bt_ctf_field_sequence_get_field") bt_ctf_field_sequence_get_field(struct bt_ctf_field *sequence, uint64_t index);
1310 %rename("_bt_ctf_field_variant_get_field") bt_ctf_field_variant_get_field(struct bt_ctf_field *variant, struct bt_ctf_field *tag);
1311 %rename("_bt_ctf_field_enumeration_get_container") bt_ctf_field_enumeration_get_container(struct bt_ctf_field *enumeration);
1312 %rename("_bt_ctf_field_signed_integer_set_value") bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *integer, int64_t value);
1313 %rename("_bt_ctf_field_unsigned_integer_set_value") bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *integer, uint64_t value);
1314 %rename("_bt_ctf_field_floating_point_set_value") bt_ctf_field_floating_point_set_value(struct bt_ctf_field *floating_point, double value);
1315 %rename("_bt_ctf_field_string_set_value") bt_ctf_field_string_set_value(struct bt_ctf_field *string, const char *value);
1316 %rename("_bt_ctf_field_get") bt_ctf_field_get(struct bt_ctf_field *field);
1317 %rename("_bt_ctf_field_put") bt_ctf_field_put(struct bt_ctf_field *field);
1319 struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type);
1320 struct bt_ctf_field *bt_ctf_field_structure_get_field(struct bt_ctf_field *structure, const char *name);
1321 struct bt_ctf_field *bt_ctf_field_array_get_field(struct bt_ctf_field *array, uint64_t index);
1322 int bt_ctf_field_sequence_set_length(struct bt_ctf_field *sequence, struct bt_ctf_field *length_field);
1323 struct bt_ctf_field *bt_ctf_field_sequence_get_field(struct bt_ctf_field *sequence, uint64_t index);
1324 struct bt_ctf_field *bt_ctf_field_variant_get_field(struct bt_ctf_field *variant, struct bt_ctf_field *tag);
1325 struct bt_ctf_field *bt_ctf_field_enumeration_get_container(struct bt_ctf_field *enumeration);
1326 int bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *integer, int64_t value);
1327 int bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *integer, uint64_t value);
1328 int bt_ctf_field_floating_point_set_value(struct bt_ctf_field *floating_point, double value);
1329 int bt_ctf_field_string_set_value(struct bt_ctf_field *string, const char *value);
1330 void bt_ctf_field_get(struct bt_ctf_field *field);
1331 void bt_ctf_field_put(struct bt_ctf_field *field);
1333 /* =================================================================
1335 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1337 %rename("_bt_ctf_event_class_create") bt_ctf_event_class_create(const char *name);
1338 %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);
1339 %rename("_bt_ctf_event_class_get") bt_ctf_event_class_get(struct bt_ctf_event_class *event_class);
1340 %rename("_bt_ctf_event_class_put") bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
1341 %rename("_bt_ctf_event_create") bt_ctf_event_create(struct bt_ctf_event_class *event_class);
1342 %rename("_bt_ctf_event_set_payload") bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struct bt_ctf_field *value);
1343 %rename("_bt_ctf_event_get_payload") bt_ctf_event_get_payload(struct bt_ctf_event *event, const char *name);
1344 %rename("_bt_ctf_event_get") bt_ctf_event_get(struct bt_ctf_event *event);
1345 %rename("_bt_ctf_event_put") bt_ctf_event_put(struct bt_ctf_event *event);
1347 struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name);
1348 int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, struct bt_ctf_field_type *type, const char *name);
1349 void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class);
1350 void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
1351 struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class);
1352 int bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struct bt_ctf_field *value);
1353 struct bt_ctf_field *bt_ctf_event_get_payload(struct bt_ctf_event *event, const char *name);
1354 void bt_ctf_event_get(struct bt_ctf_event *event);
1355 void bt_ctf_event_put(struct bt_ctf_event *event);
1357 /* =================================================================
1359 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1361 %rename("_bt_ctf_stream_class_create") bt_ctf_stream_class_create(const char *name);
1362 %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);
1363 %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);
1364 %rename("_bt_ctf_stream_class_get") bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
1365 %rename("_bt_ctf_stream_class_put") bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
1366 %rename("_bt_ctf_stream_append_discarded_events") bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count);
1367 %rename("_bt_ctf_stream_append_event") bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event);
1368 %rename("_bt_ctf_stream_flush") bt_ctf_stream_flush(struct bt_ctf_stream *stream);
1369 %rename("_bt_ctf_stream_get") bt_ctf_stream_get(struct bt_ctf_stream *stream);
1370 %rename("_bt_ctf_stream_put") bt_ctf_stream_put(struct bt_ctf_stream *stream);
1372 struct bt_ctf_stream_class *bt_ctf_stream_class_create(const char *name);
1373 int bt_ctf_stream_class_set_clock(struct bt_ctf_stream_class *stream_class, struct bt_ctf_clock *clock);
1374 int bt_ctf_stream_class_add_event_class(struct bt_ctf_stream_class *stream_class, struct bt_ctf_event_class *event_class);
1375 void bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
1376 void bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
1377 void bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count);
1378 int bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event);
1379 int bt_ctf_stream_flush(struct bt_ctf_stream *stream);
1380 void bt_ctf_stream_get(struct bt_ctf_stream *stream);
1381 void bt_ctf_stream_put(struct bt_ctf_stream *stream);
1383 /* =================================================================
1385 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1387 %rename("_bt_ctf_writer_create") bt_ctf_writer_create(const char *path);
1388 %rename("_bt_ctf_writer_create_stream") bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class);
1389 %rename("_bt_ctf_writer_add_environment_field") bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value);
1390 %rename("_bt_ctf_writer_add_clock") bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock);
1391 %newobject bt_ctf_writer_get_metadata_string;
1392 %rename("_bt_ctf_writer_get_metadata_string") bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer);
1393 %rename("_bt_ctf_writer_flush_metadata") bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer);
1394 %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);
1395 %rename("_bt_ctf_writer_get") bt_ctf_writer_get(struct bt_ctf_writer *writer);
1396 %rename("_bt_ctf_writer_put") bt_ctf_writer_put(struct bt_ctf_writer *writer);
1398 struct bt_ctf_writer *bt_ctf_writer_create(const char *path);
1399 struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class);
1400 int bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value);
1401 int bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock);
1402 char *bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer);
1403 void bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer);
1404 int bt_ctf_writer_set_byte_order(struct bt_ctf_writer *writer, enum bt_ctf_byte_order byte_order);
1405 void bt_ctf_writer_get(struct bt_ctf_writer *writer);
1406 void bt_ctf_writer_put(struct bt_ctf_writer *writer);
1413 def __init__(self, name):
1414 self._c = _bt_ctf_clock_create(name)
1416 raise ValueError("Invalid clock name.")
1419 _bt_ctf_clock_put(self._c)
1422 Get the clock's description.
1425 def description(self):
1426 raise NotImplementedError("Getter not implemented.")
1429 Set the clock's description. The description appears in the clock's TSDL
1433 def description(self, desc):
1434 ret = _bt_ctf_clock_set_description(self._c, str(desc))
1436 raise ValueError("Invalid clock description.")
1439 Get the clock's frequency (Hz).
1442 def frequency(self):
1443 raise NotImplementedError("Getter not implemented.")
1446 Set the clock's frequency (Hz).
1449 def frequency(self, freq):
1450 ret = _bt_ctf_clock_set_frequency(self._c, freq)
1452 raise ValueError("Invalid frequency value.")
1455 Get the clock's precision (in clock ticks).
1458 def precision(self):
1459 raise NotImplementedError("Getter not implemented.")
1462 Set the clock's precision (in clock ticks).
1465 def precision(self, precision):
1466 ret = _bt_ctf_clock_set_precision(self._c, precision)
1469 Get the clock's offset in seconds from POSIX.1 Epoch.
1472 def offset_seconds(self):
1473 raise NotImplementedError("Getter not implemented.")
1476 Set the clock's offset in seconds from POSIX.1 Epoch.
1478 @offset_seconds.setter
1479 def offset_seconds(self, offset_s):
1480 ret = _bt_ctf_clock_set_offset_s(self._c, offset_s)
1482 raise ValueError("Invalid offset value.")
1485 Get the clock's offset in ticks from POSIX.1 Epoch + offset in seconds.
1489 raise NotImplementedError("Getter not implemented.")
1492 Set the clock's offset in ticks from POSIX.1 Epoch + offset in seconds.
1495 def offset(self, offset):
1496 ret = _bt_ctf_clock_set_offset(self._c, offset)
1498 raise ValueError("Invalid offset value.")
1501 Get a clock's absolute attribute. A clock is absolute if the clock
1502 is a global reference across the trace's other clocks.
1506 raise NotImplementedError("Getter not implemented.")
1509 Set a clock's absolute attribute. A clock is absolute if the clock
1510 is a global reference across the trace's other clocks.
1513 def absolute(self, is_absolute):
1514 ret = _bt_ctf_clock_set_is_absolute(self._c, int(is_absolute))
1516 raise ValueError("Could not set the clock's absolute attribute.")
1519 Get the current time in nanoseconds since the clock's origin (offset and
1520 offset_s attributes).
1524 raise NotImplementedError("Getter not implemented.")
1527 Set the current time in nanoseconds since the clock's origin (offset and
1528 offset_s attributes). The clock's value will be sampled as events are
1529 appended to a stream.
1532 def time(self, time):
1533 ret = _bt_ctf_clock_set_time(self._c, time)
1535 raise ValueError("Invalid time value.")
1537 class FieldDeclaration:
1539 FieldDeclaration should not be instantiated directly. Please instantiate
1540 one of the concrete FieldDeclaration classes.
1543 # These values are based on the bt_ctf_integer_base enum
1544 # declared in event-types.h.
1545 INTEGER_BASE_UNKNOWN = -1
1546 INTEGER_BASE_BINARY = 2
1547 INTEGER_BASE_OCTAL = 8
1548 INTEGER_BASE_DECIMAL = 10
1549 INTEGER_BASE_HEXADECIMAL = 16
1552 if self._ft is None:
1553 raise ValueError("FieldDeclaration creation failed.")
1556 _bt_ctf_field_type_put(self._ft)
1559 Get the field type's alignment.
1562 def alignment(self):
1563 raise NotImplementedError("Getter not implemented.")
1566 Set the field type's alignment. Defaults to 1 (bit-aligned). However,
1567 some types, such as structures and string, may impose other alignment
1571 def alignment(self, alignment):
1572 ret = _bt_ctf_field_type_set_alignment(self._ft, alignment)
1574 raise ValueError("Invalid alignment value.")
1577 Get the field type's byte order. One of the ByteOrder's constant.
1580 def byte_order(self):
1581 raise NotImplementedError("Getter not implemented.")
1584 Set the field type's byte order. Use constants defined in the ByteOrder
1588 def byte_order(self, byte_order):
1589 ret = _bt_ctf_field_type_set_byte_order(self._ft, byte_order)
1591 raise ValueError("Could not set byte order value.")
1593 class IntegerFieldDeclaration(FieldDeclaration):
1595 Create a new integer field type of the given size.
1597 def __init__(self, size):
1598 self._ft = _bt_ctf_field_type_integer_create(size)
1602 Get an integer's signedness attribute.
1606 raise NotImplementedError("Getter not implemented.")
1609 Set an integer's signedness attribute.
1612 def signed(self, signed):
1613 ret = _bt_ctf_field_type_integer_set_signed(self._ft, signed)
1615 raise ValueError("Could not set signed attribute.")
1618 Get the integer's base used to pretty-print the resulting trace.
1622 raise NotImplementedError("Getter not implemented.")
1625 Set the integer's base used to pretty-print the resulting trace.
1626 The base must be a constant of the IntegerBase class.
1629 def base(self, base):
1630 ret = _bt_ctf_field_type_integer_set_base(self._ft, base)
1632 raise ValueError("Could not set base value.")
1635 Get the integer's encoding (one of the constants of the
1636 CTFStringEncoding class).
1640 raise NotImplementedError("Getter not implemented.")
1643 An integer encoding may be set to signal that the integer must be printed
1644 as a text character. Must be a constant from the CTFStringEncoding class.
1647 def encoding(self, encoding):
1648 ret = _bt_ctf_field_type_integer_set_encoding(self._ft, encoding)
1650 raise ValueError("Could not set integer encoding.")
1652 class EnumerationFieldDeclaration(FieldDeclaration):
1654 Create a new enumeration field type with the given underlying type.
1656 def __init__(self, integer_type):
1657 if integer_type is None or not isinstance(integer_type, CTFWriter.IntegerFieldDeclaration):
1658 raise TypeError("Invalid integer container.")
1660 self._ft = _bt_ctf_field_type_enumeration_create(integer_type._ft)
1664 Add a mapping to the enumeration. The range's values are inclusive.
1666 def add_mapping(self, name, range_start, range_end):
1667 ret = _bt_ctf_field_type_enumeration_add_mapping(self._ft, str(name), range_start, range_end)
1669 raise ValueError("Could not add mapping to enumeration type.")
1671 class FloatFieldDeclaration(FieldDeclaration):
1678 Create a new floating point field type.
1681 self._ft = _bt_ctf_field_type_floating_point_create()
1685 Get the number of exponent digits to use to store the floating point field.
1688 def exponent_digits(self):
1689 raise NotImplementedError("Getter not implemented.")
1692 Set the number of exponent digits to use to store the floating point field.
1693 The only values currently supported are FLT_EXP_DIG and DBL_EXP_DIG which
1694 are defined as constants of this class.
1696 @exponent_digits.setter
1697 def exponent_digits(self, exponent_digits):
1698 ret = _bt_ctf_field_type_floating_point_set_exponent_digits(self._ft, exponent_digits)
1700 raise ValueError("Could not set exponent digit count.")
1703 Get the number of mantissa digits to use to store the floating point field.
1706 def mantissa_digits(self):
1707 raise NotImplementedError("Getter not implemented.")
1710 Set the number of mantissa digits to use to store the floating point field.
1711 The only values currently supported are FLT_MANT_DIG and DBL_MANT_DIG which
1712 are defined as constants of this class.
1714 @mantissa_digits.setter
1715 def mantissa_digits(self, mantissa_digits):
1716 ret = _bt_ctf_field_type_floating_point_set_mantissa_digits(self._ft, mantissa_digits)
1718 raise ValueError("Could not set mantissa digit count.")
1720 class StructureFieldDeclaration(FieldDeclaration):
1722 Create a new structure field type.
1725 self._ft = _bt_ctf_field_type_structure_create()
1729 Add a field of type "field_type" to the structure.
1731 def add_field(self, field_type, field_name):
1732 ret = _bt_ctf_field_type_structure_add_field(self._ft, field_type._ft, str(field_name))
1734 raise ValueError("Could not add field to structure.")
1736 class VariantFieldDeclaration(FieldDeclaration):
1738 Create a new variant field type.
1740 def __init__(self, enum_tag, tag_name):
1741 if enum_tag is None or not isinstance(enum_tag, CTFWriter.EnumerationFieldDeclaration):
1742 raise TypeError("Invalid tag type; must be of type EnumerationFieldDeclaration.")
1744 self._ft = _bt_ctf_field_type_variant_create(enum_tag._ft, str(tag_name))
1748 Add a field of type "field_type" to the variant.
1750 def add_field(self, field_type, field_name):
1751 ret = _bt_ctf_field_type_variant_add_field(self._ft, field_type._ft, str(field_name))
1753 raise ValueError("Could not add field to variant.")
1755 class ArrayFieldDeclaration(FieldDeclaration):
1757 Create a new array field type.
1759 def __init__(self, element_type, length):
1760 self._ft = _bt_ctf_field_type_array_create(element_type._ft, length)
1763 class SequenceFieldDeclaration(FieldDeclaration):
1765 Create a new sequence field type.
1767 def __init__(self, element_type, length_field_name):
1768 self._ft = _bt_ctf_field_type_sequence_create(element_type._ft, str(length_field_name))
1771 class StringFieldDeclaration(FieldDeclaration):
1773 Create a new string field type.
1776 self._ft = _bt_ctf_field_type_string_create()
1780 Get a string type's encoding (a constant from the CTFStringEncoding class).
1784 raise NotImplementedError("Getter not implemented.")
1787 Set a string type's encoding. Must be a constant from the CTFStringEncoding class.
1790 def encoding(self, encoding):
1791 ret = _bt_ctf_field_type_string_set_encoding(self._ft, encoding)
1793 raise ValueError("Could not set string encoding.")
1796 Create an instance of a field.
1799 def create_field(self, field_type):
1800 if field_type is None or not isinstance(field_type, CTFWriter.FieldDeclaration):
1801 raise TypeError("Invalid field_type. Type must be a FieldDeclaration-derived class.")
1803 if isinstance(field_type, CTFWriter.IntegerFieldDeclaration):
1804 return CTFWriter.IntegerField(field_type)
1805 elif isinstance(field_type, CTFWriter.EnumerationFieldDeclaration):
1806 return CTFWriter.EnumerationField(field_type)
1807 elif isinstance(field_type, CTFWriter.FloatFieldDeclaration):
1808 return CTFWriter.FloatFieldingPoint(field_type)
1809 elif isinstance(field_type, CTFWriter.StructureFieldDeclaration):
1810 return CTFWriter.StructureField(field_type)
1811 elif isinstance(field_type, CTFWriter.VariantFieldDeclaration):
1812 return CTFWriter.VariantField(field_type)
1813 elif isinstance(field_type, CTFWriter.ArrayFieldDeclaration):
1814 return CTFWriter.ArrayField(field_type)
1815 elif isinstance(field_type, CTFWriter.SequenceFieldDeclaration):
1816 return CTFWriter.SequenceField(field_type)
1817 elif isinstance(field_type, CTFWriter.StringFieldDeclaration):
1818 return CTFWriter.StringField(field_type)
1822 Base class, do not instantiate.
1824 def __init__(self, field_type):
1825 if not isinstance(field_type, CTFWriter.FieldDeclaration):
1826 raise TypeError("Invalid field_type argument.")
1828 self._f = _bt_ctf_field_create(field_type._ft)
1830 raise ValueError("Field creation failed.")
1833 _bt_ctf_field_put(self._f)
1836 def _create_field_from_native_instance(native_field_instance):
1838 CTFTypeId.INTEGER : CTFWriter.IntegerField,
1839 CTFTypeId.FLOAT : CTFWriter.FloatFieldingPoint,
1840 CTFTypeId.ENUM : CTFWriter.EnumerationField,
1841 CTFTypeId.STRING : CTFWriter.StringField,
1842 CTFTypeId.STRUCT : CTFWriter.StructureField,
1843 CTFTypeId.VARIANT : CTFWriter.VariantField,
1844 CTFTypeId.ARRAY : CTFWriter.ArrayField,
1845 CTFTypeId.SEQUENCE : CTFWriter.SequenceField
1848 field_type = _bt_python_get_field_type(native_field_instance)
1849 if field_type == CTFTypeId.UNKNOWN:
1850 raise TypeError("Invalid field instance")
1852 field = CTFWriter.Field.__new__(CTFWriter.Field)
1853 field._f = native_field_instance
1854 field.__class__ = type_dict[field_type]
1857 class IntegerField(Field):
1859 Get an integer field's value.
1863 raise NotImplementedError("Getter not implemented.")
1866 Set an integer field's value.
1869 def value(self, value):
1870 signedness = _bt_python_field_integer_get_signedness(self._f)
1872 raise TypeError("Invalid integer instance.")
1875 ret = _bt_ctf_field_unsigned_integer_set_value(self._f, value)
1877 ret = _bt_ctf_field_signed_integer_set_value(self._f, value)
1880 raise ValueError("Could not set integer field value.")
1882 class EnumerationField(Field):
1884 Return the enumeration's underlying container field (an integer field).
1887 def container(self):
1888 container = CTFWriter.IntegerField.__new__(CTFWriter.IntegerField)
1889 container._f = _bt_ctf_field_enumeration_get_container(self._f)
1890 if container._f is None:
1891 raise TypeError("Invalid enumeration field type.")
1894 class FloatFieldingPoint(Field):
1896 Get a floating point field's value.
1900 raise NotImplementedError("Getter not implemented.")
1903 Set a floating point field's value.
1906 def value(self, value):
1907 ret = _bt_ctf_field_floating_point_set_value(self._f, float(value))
1909 raise ValueError("Could not set floating point field value.")
1911 class StructureField(Field):
1913 Get the structure's field corresponding to the provided field name.
1915 def field(self, field_name):
1916 native_instance = _bt_ctf_field_structure_get_field(self._f, str(field_name))
1917 if native_instance is None:
1918 raise ValueError("Invalid field_name provided.")
1919 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1921 class VariantField(Field):
1923 Return the variant's selected field. The "tag" field is the selector enum field.
1925 def field(self, tag):
1926 native_instance = _bt_ctf_field_variant_get_field(self._f, tag._f)
1927 if native_instance is None:
1928 raise ValueError("Invalid tag provided.")
1929 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1931 class ArrayField(Field):
1933 Return the array's field at position "index".
1935 def field(self, index):
1936 native_instance = _bt_ctf_field_array_get_field(self._f, index)
1937 if native_instance is None:
1938 raise IndexError("Invalid index provided.")
1939 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1941 class SequenceField(Field):
1943 Get the sequence's length field (IntegerField).
1947 raise NotImplementedError("Getter not implemented.")
1950 Set the sequence's length field (IntegerField).
1953 def length(self, length_field):
1954 if not isinstance(length, CTFWriter.IntegerField):
1955 raise TypeError("Invalid length field.")
1956 ret = _bt_ctf_field_sequence_set_length(self._f, length._f)
1958 raise ValueError("Could not set sequence length.")
1961 Return the sequence's field at position "index".
1963 def field(self, index):
1964 native_instance = _bt_ctf_field_sequence_get_field(self._f, index)
1965 if native_instance is None:
1966 raise ValueError("Could not get sequence element at index.")
1967 return CTFWriter.Field._create_field_from_native_instance(native_instance)
1969 class StringField(Field):
1971 Get a string field's value.
1975 raise NotImplementedError("Getter not implemented.")
1978 Set a string field's value.
1981 def value(self, value):
1982 ret = _bt_ctf_field_string_set_value(self._f, str(value))
1984 raise ValueError("Could not set string field value.")
1988 Create a new event class of the given name.
1990 def __init__(self, name):
1991 self._ec = _bt_ctf_event_class_create(name)
1992 if self._ec is None:
1993 raise ValueError("Event class creation failed.")
1996 _bt_ctf_event_class_put(self._ec)
1999 Add a field of type "field_type" to the event class.
2001 def add_field(self, field_type, field_name):
2002 ret = _bt_ctf_event_class_add_field(self._ec, field_type._ft, str(field_name))
2004 raise ValueError("Could not add field to event class.")
2008 Create a new event of the given event class.
2010 def __init__(self, event_class):
2011 if not isinstance(event_class, CTFWriter.EventClass):
2012 raise TypeError("Invalid event_class argument.")
2014 self._e = _bt_ctf_event_create(event_class._ec)
2016 raise ValueError("Event creation failed.")
2019 _bt_ctf_event_put(self._e)
2022 Set a manually created field as an event's payload.
2024 def set_payload(self, field_name, value_field):
2025 if not isinstance(value, CTFWriter.Field):
2026 raise TypeError("Invalid value type.")
2027 ret = _bt_ctf_event_set_payload(self._e, str(field_name), value._f)
2029 raise ValueError("Could not set event field payload.")
2032 Get a field from event.
2034 def payload(self, field_name):
2035 native_instance = _bt_ctf_event_get_payload(self._e, str(field_name))
2036 if native_instance is None:
2037 raise ValueError("Could not get event payload.")
2038 return CTFWriter.Field._create_field_from_native_instance(native_instance)
2042 Create a new stream class of the given name.
2044 def __init__(self, name):
2045 self._sc = _bt_ctf_stream_class_create(name)
2046 if self._sc is None:
2047 raise ValueError("Stream class creation failed.")
2050 _bt_ctf_stream_class_put(self._sc)
2053 Get a stream class' clock.
2057 raise NotImplementedError("Getter not implemented.")
2060 Assign a clock to a stream class.
2063 def clock(self, clock):
2064 if not isinstance(clock, CTFWriter.Clock):
2065 raise TypeError("Invalid clock type.")
2067 ret = _bt_ctf_stream_class_set_clock(self._sc, clock._c)
2069 raise ValueError("Could not set stream class clock.")
2072 Add an event class to a stream class. New events can be added even after a
2073 stream has been instantiated and events have been appended. However, a stream
2074 will not accept events of a class that has not been registered beforehand.
2076 def add_event_class(self, event_class):
2077 if not isinstance(event_class, CTFWriter.EventClass):
2078 raise TypeError("Invalid event_class type.")
2080 ret = _bt_ctf_stream_class_add_event_class(self._sc, event_class._ec)
2082 raise ValueError("Could not add event class.")
2086 Create a stream of the given class.
2088 def __init__(self, stream_class):
2089 if not isinstance(stream_class, CTFWriter.StreamClass):
2090 raise TypeError("Invalid stream_class type.")
2092 self._s = _bt_ctf_stream_create(stream_class._sc)
2094 raise ValueError("Stream creation failed.")
2097 _bt_ctf_stream_put(self._s)
2100 Increase the current packet's discarded event count.
2102 def append_discarded_events(self, event_count):
2103 ret = _bt_ctf_stream_append_discarded_events(self._s, event_count)
2105 raise ValueError("Could not append discarded events.")
2108 Append "event" to the stream's current packet. The stream's associated clock
2109 will be sampled during this call. The event shall not be modified after
2110 being appended to a stream.
2112 def append_event(self, event):
2113 ret = _bt_ctf_stream_append_event(self._s, event._e)
2115 raise ValueError("Could not append event to stream.")
2118 The stream's current packet's events will be flushed to disk. Events
2119 subsequently appended to the stream will be added to a new packet.
2122 ret = _bt_ctf_stream_flush(self._s)
2124 raise ValueError("Could not flush stream.")
2128 Create a new writer that will produce a trace in the given path.
2130 def __init__(self, path):
2131 self._w = _bt_ctf_writer_create(path)
2133 raise ValueError("Writer creation failed.")
2136 _bt_ctf_writer_put(self._w)
2139 Create a new stream instance and register it to the writer.
2141 def create_stream(self, stream_class):
2142 if not isinstance(stream_class, CTFWriter.StreamClass):
2143 raise TypeError("Invalid stream_class type.")
2145 stream = CTFWriter.Stream.__new__(CTFWriter.Stream)
2146 stream._s = _bt_ctf_writer_create_stream(self._w, stream_class._sc)
2150 Add an environment field to the trace.
2152 def add_environment_field(self, name, value):
2153 ret = _bt_ctf_writer_add_environment_field(self._w, str(name), str(value))
2155 raise ValueError("Could not add environment field to trace.")
2158 Add a clock to the trace. Clocks assigned to stream classes must be
2159 registered to the writer.
2161 def add_clock(self, clock):
2162 ret = _bt_ctf_writer_add_clock(self._w, clock._c)
2164 raise ValueError("Could not add clock to Writer.")
2167 Get the trace's TSDL meta-data.
2171 return _bt_ctf_writer_get_metadata_string(self._w)
2174 Flush the trace's metadata to the metadata file.
2176 def flush_metadata(self):
2177 _bt_ctf_writer_flush_metadata(self._w)
2180 Get the trace's byte order. Must be a constant from the ByteOrder
2184 def byte_order(self):
2185 raise NotImplementedError("Getter not implemented.")
2188 Set the trace's byte order. Must be a constant from the ByteOrder
2189 class. Defaults to BYTE_ORDER_NATIVE, the host machine's endianness.
2192 def byte_order(self, byte_order):
2193 ret = _bt_ctf_writer_set_byte_order(self._w, byte_order)
2195 raise ValueError("Could not set trace's byte order.")