Python bindings: clarify invalid argument type exception
[babeltrace.git] / bindings / python / babeltrace.i.in
CommitLineData
24a3136a
DS
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>
74ea15ad 9 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
24a3136a
DS
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
26Babeltrace is a trace viewer and converter reading and writing the
27Common Trace Format (CTF). Its main use is to pretty-print CTF
28traces into a human-readable text output.
29
74ea15ad 30To use this module, the first step is to create a TraceCollection and add a
24a3136a
DS
31trace to it."
32%enddef
33
34%module(docstring=DOCSTRING) babeltrace
35
38f28df6 36%include "stdint.i"
24a3136a
DS
37%include "typemaps.i"
38%{
39#define SWIG_FILE_WITH_INIT
40#include <babeltrace/babeltrace.h>
41#include <babeltrace/babeltrace-internal.h>
42#include <babeltrace/trace-handle.h>
43#include <babeltrace/trace-handle-internal.h>
44#include <babeltrace/context.h>
45#include <babeltrace/context-internal.h>
46#include <babeltrace/iterator.h>
47#include <babeltrace/iterator-internal.h>
48#include <babeltrace/format.h>
49#include <babeltrace/list.h>
24a3136a
DS
50#include <babeltrace/types.h>
51#include <babeltrace/ctf/iterator.h>
52#include "python-complements.h"
ec8c88d7
JG
53#include <babeltrace/ctf-writer/clock.h>
54#include <babeltrace/ctf-writer/event-fields.h>
55#include <babeltrace/ctf-writer/event-types.h>
56#include <babeltrace/ctf-writer/event.h>
57#include <babeltrace/ctf-writer/stream.h>
58#include <babeltrace/ctf-writer/writer.h>
24a3136a
DS
59%}
60
24a3136a 61typedef int bt_intern_str;
5792eb34 62typedef int64_t ssize_t;
24a3136a 63
cebae8c3
JG
64/* =================================================================
65 PYTHON-COMPLEMENTS.H
66 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
67*/
68
cebae8c3
JG
69struct bt_definition **_bt_python_field_listcaller(
70 const struct bt_ctf_event *ctf_event,
71 const struct bt_definition *scope,
72 unsigned int *OUTPUT);
73struct bt_definition *_bt_python_field_one_from_list(
74 struct bt_definition **list, int index);
75struct bt_ctf_event_decl **_bt_python_event_decl_listcaller(
76 int handle_id,
77 struct bt_context *ctx,
78 unsigned int *OUTPUT);
79struct bt_ctf_event_decl *_bt_python_decl_one_from_list(
80 struct bt_ctf_event_decl **list, int index);
81struct bt_ctf_field_decl **_by_python_field_decl_listcaller(
82 struct bt_ctf_event_decl *event_decl,
83 enum bt_ctf_scope scope,
84 unsigned int *OUTPUT);
85struct bt_ctf_field_decl *_bt_python_field_decl_one_from_list(
86 struct bt_ctf_field_decl **list, int index);
87struct definition_array *_bt_python_get_array_from_def(
88 struct bt_definition *field);
89struct definition_sequence *_bt_python_get_sequence_from_def(
90 struct bt_definition *field);
5792eb34
JG
91struct bt_declaration *_bt_python_get_array_element_declaration(
92 struct bt_declaration *field);
3866c850
JG
93struct bt_declaration *_bt_python_get_sequence_element_declaration(
94 struct bt_declaration *field);
5792eb34 95const char *_bt_python_get_array_string(struct bt_definition *field);
3866c850 96const char *_bt_python_get_sequence_string(struct bt_definition *field);
ec8c88d7
JG
97int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field);
98enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field);
b4b5e4b5
JG
99const char *_bt_python_ctf_field_type_enumeration_get_mapping(
100 struct bt_ctf_field_type *enumeration, size_t index,
101 int64_t *OUTPUT, int64_t *OUTPUT);
102const char *_bt_python_ctf_field_type_enumeration_get_mapping_unsigned(
103 struct bt_ctf_field_type *enumeration, size_t index,
104 uint64_t *OUTPUT, uint64_t *OUTPUT);
105const char *_bt_python_ctf_field_type_structure_get_field_name(
106 struct bt_ctf_field_type *structure, size_t index);
107struct bt_ctf_field_type *_bt_python_ctf_field_type_structure_get_field_type(
108 struct bt_ctf_field_type *structure, size_t index);
109const char *_bt_python_ctf_field_type_variant_get_field_name(
110 struct bt_ctf_field_type *variant, size_t index);
111struct bt_ctf_field_type *_bt_python_ctf_field_type_variant_get_field_type(
112 struct bt_ctf_field_type *variant, size_t index);
38f28df6
JG
113const char *_bt_python_ctf_event_class_get_field_name(
114 struct bt_ctf_event_class *event_class, size_t index);
115struct bt_ctf_field_type *_bt_python_ctf_event_class_get_field_type(
116 struct bt_ctf_event_class *event_class, size_t index);
da64442f
JG
117int _bt_python_ctf_clock_get_uuid_index(struct bt_ctf_clock *clock,
118 size_t index, unsigned char *OUTPUT);
119int _bt_python_ctf_clock_set_uuid_index(struct bt_ctf_clock *clock,
120 size_t index, unsigned char value);
cebae8c3 121
24a3136a
DS
122/* =================================================================
123 CONTEXT.H, CONTEXT-INTERNAL.H
124 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
125*/
126
127%rename("_bt_context_create") bt_context_create(void);
128%rename("_bt_context_add_trace") bt_context_add_trace(
129 struct bt_context *ctx, const char *path, const char *format,
2c0df204
XH
130 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
131 struct bt_mmap_stream_list *stream_list, FILE *metadata);
24a3136a
DS
132%rename("_bt_context_remove_trace") bt_context_remove_trace(
133 struct bt_context *ctx, int trace_id);
134%rename("_bt_context_get") bt_context_get(struct bt_context *ctx);
135%rename("_bt_context_put") bt_context_put(struct bt_context *ctx);
136%rename("_bt_ctf_event_get_context") bt_ctf_event_get_context(
137 const struct bt_ctf_event *event);
138
139struct bt_context *bt_context_create(void);
140int bt_context_add_trace(struct bt_context *ctx, const char *path, const char *format,
2c0df204
XH
141 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
142 struct bt_mmap_stream_list *stream_list, FILE *metadata);
24a3136a
DS
143void bt_context_remove_trace(struct bt_context *ctx, int trace_id);
144void bt_context_get(struct bt_context *ctx);
145void bt_context_put(struct bt_context *ctx);
146struct bt_context *bt_ctf_event_get_context(const struct bt_ctf_event *event);
147
74ea15ad 148// class TraceCollection to prevent direct access to struct bt_context
24a3136a 149%pythoncode%{
74ea15ad 150class TraceCollection:
24a3136a 151 """
74ea15ad 152 The TraceCollection is the object that contains all currently opened traces.
24a3136a
DS
153 """
154
155 def __init__(self):
74ea15ad 156 self._tc = _bt_context_create()
24a3136a
DS
157
158 def __del__(self):
74ea15ad 159 _bt_context_put(self._tc)
24a3136a 160
74ea15ad 161 def add_trace(self, path, format_str):
24a3136a 162 """
74ea15ad 163 Add a trace by path to the TraceCollection.
24a3136a
DS
164
165 Open a trace.
166
167 path is the path to the trace, it is not recursive.
168 If "path" is None, stream_list is used instead as a list
169 of mmap streams to open for the trace.
170
171 format is a string containing the format name in which the trace was
172 produced.
173
24a3136a
DS
174 Return: the corresponding TraceHandle on success or None on error.
175 """
464425e1 176 ret = _bt_context_add_trace(self._tc, path, format_str, None, None, None)
24a3136a
DS
177 if ret < 0:
178 return None
179
180 th = TraceHandle.__new__(TraceHandle)
181 th._id = ret
464425e1 182 th._trace_collection = self
24a3136a
DS
183 return th
184
185 def add_traces_recursive(self, path, format_str):
186 """
187 Open a trace recursively.
188
189 Find each trace present in the subdirectory starting from the given
74ea15ad 190 path, and add them to the TraceCollection.
24a3136a
DS
191
192 Return a dict of TraceHandle instances (the full path is the key).
193 Return None on error.
194 """
195
196 import os
197
198 trace_handles = {}
199
200 noTrace = True
201 error = False
202
203 for fullpath, dirs, files in os.walk(path):
204 if "metadata" in files:
205 trace_handle = self.add_trace(fullpath, format_str)
206 if trace_handle is None:
207 error = True
208 continue
209
210 trace_handles[fullpath] = trace_handle
211 noTrace = False
212
213 if noTrace and error:
214 return None
215 return trace_handles
216
217 def remove_trace(self, trace_handle):
218 """
74ea15ad 219 Remove a trace from the TraceCollection.
24a3136a
DS
220 Effectively closing the trace.
221 """
222 try:
74ea15ad 223 _bt_context_remove_trace(self._tc, trace_handle._id)
24a3136a
DS
224 except AttributeError:
225 raise TypeError("in remove_trace, "
226 "argument 2 must be a TraceHandle instance")
74ea15ad
JG
227
228 @property
229 def events(self):
230 """
231 Generator function to iterate over the events of open in the current
232 TraceCollection.
9213bd4f
JG
233
234 Due to limitations of the native Babeltrace API, only one event
235 may be "alive" at a time (i.e. a user should never store a copy
236 of the events returned by this function for ulterior use). Users
237 shall make sure to copy the information they need from an event
238 before accessing the next one.
239
240 Furthermore, event objects become invalid when the generator goes
241 out of scope as the underlying iterator will be reclaimed. Using an
242 event after the the generator has gone out of scope may result in a
243 crash or data corruption.
74ea15ad
JG
244 """
245 begin_pos_ptr = _bt_iter_pos()
246 end_pos_ptr = _bt_iter_pos()
247 begin_pos_ptr.type = SEEK_BEGIN
248 end_pos_ptr.type = SEEK_LAST
249
250 for event in self._events(begin_pos_ptr, end_pos_ptr):
251 yield event
252
253 def events_timestamps(self, timestamp_begin, timestamp_end):
254 """
255 Generator function to iterate over the events of open in the current
256 TraceCollection from timestamp_begin to timestamp_end.
257 """
258 begin_pos_ptr = _bt_iter_pos()
259 end_pos_ptr = _bt_iter_pos()
260 begin_pos_ptr.type = end_pos_ptr.type = SEEK_TIME
261 begin_pos_ptr.u.seek_time = timestamp_begin
262 end_pos_ptr.u.seek_time = timestamp_end
263
264 for event in self._events(begin_pos_ptr, end_pos_ptr):
265 yield event
266
267 @property
268 def timestamp_begin(self):
269 pos_ptr = _bt_iter_pos()
270 pos_ptr.type = SEEK_BEGIN
271 return self._timestamp_at_pos(pos_ptr)
272
273 @property
274 def timestamp_end(self):
275 pos_ptr = _bt_iter_pos()
276 pos_ptr.type = SEEK_LAST
277 return self._timestamp_at_pos(pos_ptr)
278
279 def _timestamp_at_pos(self, pos_ptr):
280 ctf_it_ptr = _bt_ctf_iter_create(self._tc, pos_ptr, pos_ptr)
281 if ctf_it_ptr is None:
282 raise NotImplementedError("Creation of multiple iterators is unsupported.")
283 ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
284 _bt_ctf_iter_destroy(ctf_it_ptr)
285 if ev_ptr is None:
286 return None;
287
288 def _events(self, begin_pos_ptr, end_pos_ptr):
289 ctf_it_ptr = _bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr)
290 if ctf_it_ptr is None:
291 raise NotImplementedError(
292 "Creation of multiple iterators is unsupported.")
293
294 while True:
295 ev_ptr = _bt_ctf_iter_read_event(ctf_it_ptr)
296 if ev_ptr is None:
297 break
298
78d714e8 299 ev = Event.__new__(Event)
74ea15ad
JG
300 ev._e = ev_ptr
301 try:
302 yield ev
303 except GeneratorExit:
304 break
305
306 ret = _bt_iter_next(_bt_ctf_get_iter(ctf_it_ptr))
307 if ret != 0:
308 break
309
310 _bt_ctf_iter_destroy(ctf_it_ptr)
311
24a3136a
DS
312%}
313
314
315
316/* =================================================================
317 FORMAT.H, REGISTRY
318 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
319*/
320
321%rename("lookup_format") bt_lookup_format(bt_intern_str qname);
322%rename("_bt_print_format_list") bt_fprintf_format_list(FILE *fp);
323%rename("register_format") bt_register_format(struct format *format);
cc26a15a 324%rename("unregister_format") bt_unregister_format(struct bt_format *format);
24a3136a
DS
325
326extern struct format *bt_lookup_format(bt_intern_str qname);
327extern void bt_fprintf_format_list(FILE *fp);
2c0df204 328extern int bt_register_format(struct bt_format *format);
cc26a15a 329extern void bt_unregister_format(struct bt_format *format);
24a3136a 330
24a3136a
DS
331%pythoncode %{
332
333def print_format_list(babeltrace_file):
334 """
335 Print a list of available formats to file.
336
337 babeltrace_file must be a File instance opened in write mode.
338 """
339 try:
340 if babeltrace_file._file is not None:
341 _bt_print_format_list(babeltrace_file._file)
342 except AttributeError:
343 raise TypeError("in print_format_list, "
344 "argument 1 must be a File instance")
345
346%}
347
348
349/* =================================================================
350 ITERATOR.H, ITERATOR-INTERNAL.H
351 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
352*/
353
354%rename("_bt_iter_create") bt_iter_create(struct bt_context *ctx,
355 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
356%rename("_bt_iter_destroy") bt_iter_destroy(struct bt_iter *iter);
357%rename("_bt_iter_next") bt_iter_next(struct bt_iter *iter);
358%rename("_bt_iter_get_pos") bt_iter_get_pos(struct bt_iter *iter);
359%rename("_bt_iter_free_pos") bt_iter_free_pos(struct bt_iter_pos *pos);
360%rename("_bt_iter_set_pos") bt_iter_set_pos(struct bt_iter *iter,
361 const struct bt_iter_pos *pos);
362%rename("_bt_iter_create_time_pos") bt_iter_create_time_pos(struct bt_iter *iter,
363 uint64_t timestamp);
364
365struct bt_iter *bt_iter_create(struct bt_context *ctx,
366 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
367void bt_iter_destroy(struct bt_iter *iter);
368int bt_iter_next(struct bt_iter *iter);
369struct bt_iter_pos *bt_iter_get_pos(struct bt_iter *iter);
370void bt_iter_free_pos(struct bt_iter_pos *pos);
371int bt_iter_set_pos(struct bt_iter *iter, const struct bt_iter_pos *pos);
372struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter, uint64_t timestamp);
373
374%rename("_bt_iter_pos") bt_iter_pos;
375%rename("SEEK_TIME") BT_SEEK_TIME;
376%rename("SEEK_RESTORE") BT_SEEK_RESTORE;
377%rename("SEEK_CUR") BT_SEEK_CUR;
378%rename("SEEK_BEGIN") BT_SEEK_BEGIN;
ef42f9eb 379%rename("SEEK_LAST") BT_SEEK_LAST;
24a3136a
DS
380
381// This struct is taken from iterator.h
382// All changes to the struct must also be made here
383struct bt_iter_pos {
384 enum {
385 BT_SEEK_TIME, /* uses u.seek_time */
386 BT_SEEK_RESTORE, /* uses u.restore */
387 BT_SEEK_CUR,
388 BT_SEEK_BEGIN,
ef42f9eb 389 BT_SEEK_LAST
24a3136a
DS
390 } type;
391 union {
392 uint64_t seek_time;
393 struct bt_saved_pos *restore;
394 } u;
395};
396
24a3136a
DS
397/* =================================================================
398 TRACE-HANDLE.H, TRACE-HANDLE-INTERNAL.H
399 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
400*/
401
402%rename("_bt_trace_handle_create") bt_trace_handle_create(struct bt_context *ctx);
403%rename("_bt_trace_handle_destroy") bt_trace_handle_destroy(struct bt_trace_handle *bt);
404struct bt_trace_handle *bt_trace_handle_create(struct bt_context *ctx);
405void bt_trace_handle_destroy(struct bt_trace_handle *bt);
406
407%rename("_bt_trace_handle_get_path") bt_trace_handle_get_path(struct bt_context *ctx,
408 int handle_id);
409%rename("_bt_trace_handle_get_timestamp_begin") bt_trace_handle_get_timestamp_begin(
410 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
411%rename("_bt_trace_handle_get_timestamp_end") bt_trace_handle_get_timestamp_end(
412 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
24a3136a
DS
413const char *bt_trace_handle_get_path(struct bt_context *ctx, int handle_id);
414uint64_t bt_trace_handle_get_timestamp_begin(struct bt_context *ctx, int handle_id,
415 enum bt_clock_type type);
416uint64_t bt_trace_handle_get_timestamp_end(struct bt_context *ctx, int handle_id,
417 enum bt_clock_type type);
418
419%rename("_bt_ctf_event_get_handle_id") bt_ctf_event_get_handle_id(
420 const struct bt_ctf_event *event);
421int bt_ctf_event_get_handle_id(const struct bt_ctf_event *event);
422
423
424%pythoncode%{
425
8a2cd19a 426# Based on enum bt_clock_type in clock-type.h
464425e1
JG
427class ClockType:
428 CLOCK_CYCLES = 0
429 CLOCK_REAL = 1
430
24a3136a
DS
431class TraceHandle(object):
432 """
433 The TraceHandle allows the user to manipulate a trace file directly.
434 It is a unique identifier representing a trace file.
435 Do not instantiate.
436 """
437
438 def __init__(self):
439 raise NotImplementedError("TraceHandle cannot be instantiated")
440
441 def __repr__(self):
288209fb 442 return "Babeltrace TraceHandle: trace_id('{0}')".format(self._id)
24a3136a 443
464425e1
JG
444 @property
445 def id(self):
24a3136a
DS
446 """Return the TraceHandle id."""
447 return self._id
448
464425e1
JG
449 @property
450 def path(self):
24a3136a 451 """Return the path of a TraceHandle."""
464425e1 452 return _bt_trace_handle_get_path(self._trace_collection._tc, self._id)
24a3136a 453
464425e1
JG
454 @property
455 def timestamp_begin(self):
24a3136a 456 """Return the creation time of the buffers of a trace."""
464425e1
JG
457 return _bt_trace_handle_get_timestamp_begin(
458 self._trace_collection._tc, self._id, ClockType.CLOCK_REAL)
24a3136a 459
464425e1
JG
460 @property
461 def timestamp_end(self):
24a3136a 462 """Return the destruction timestamp of the buffers of a trace."""
464425e1
JG
463 return _bt_trace_handle_get_timestamp_end(
464 self._trace_collection._tc, self._id, ClockType.CLOCK_REAL)
24a3136a 465
8bb27181
JG
466 @property
467 def events(self):
468 """
469 Generator returning all events (EventDeclaration) in a trace.
470 """
471 ret = _bt_python_event_decl_listcaller(self.id, self._trace_collection._tc)
472
473 if not isinstance(ret, list):
474 return
475
476 ptr_list, count = ret
477 for i in range(count):
478 tmp = EventDeclaration.__new__(EventDeclaration)
479 tmp._ed = _bt_python_decl_one_from_list(ptr_list, i)
480 yield tmp
481
24a3136a
DS
482%}
483
484
485
486// =================================================================
487// CTF
488// =================================================================
489
490/* =================================================================
491 ITERATOR.H, EVENTS.H
492 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
493*/
494
495//Iterator
496%rename("_bt_ctf_iter_create") bt_ctf_iter_create(struct bt_context *ctx,
497 const struct bt_iter_pos *begin_pos,
498 const struct bt_iter_pos *end_pos);
499%rename("_bt_ctf_get_iter") bt_ctf_get_iter(struct bt_ctf_iter *iter);
500%rename("_bt_ctf_iter_destroy") bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
501%rename("_bt_ctf_iter_read_event") bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
502
503struct bt_ctf_iter *bt_ctf_iter_create(struct bt_context *ctx,
504 const struct bt_iter_pos *begin_pos,
505 const struct bt_iter_pos *end_pos);
506struct bt_iter *bt_ctf_get_iter(struct bt_ctf_iter *iter);
507void bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
508struct bt_ctf_event *bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
509
510
511//Events
24a3136a
DS
512%rename("_bt_ctf_get_top_level_scope") bt_ctf_get_top_level_scope(const struct
513 bt_ctf_event *event, enum bt_ctf_scope scope);
514%rename("_bt_ctf_event_name") bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
515%rename("_bt_ctf_get_timestamp") bt_ctf_get_timestamp(
516 const struct bt_ctf_event *ctf_event);
517%rename("_bt_ctf_get_cycles") bt_ctf_get_cycles(
518 const struct bt_ctf_event *ctf_event);
519
520%rename("_bt_ctf_get_field") bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
2c0df204 521 const struct bt_definition *scope, const char *field);
24a3136a 522%rename("_bt_ctf_get_index") bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
2c0df204
XH
523 const struct bt_definition *field, unsigned int index);
524%rename("_bt_ctf_field_name") bt_ctf_field_name(const struct bt_definition *field);
525%rename("_bt_ctf_field_type") bt_ctf_field_type(const struct bt_declaration *field);
24a3136a 526%rename("_bt_ctf_get_int_signedness") bt_ctf_get_int_signedness(
2c0df204
XH
527 const struct bt_declaration *field);
528%rename("_bt_ctf_get_int_base") bt_ctf_get_int_base(const struct bt_declaration *field);
24a3136a 529%rename("_bt_ctf_get_int_byte_order") bt_ctf_get_int_byte_order(
2c0df204
XH
530 const struct bt_declaration *field);
531%rename("_bt_ctf_get_int_len") bt_ctf_get_int_len(const struct bt_declaration *field);
4191bcd2
XH
532%rename("_bt_ctf_get_enum_int") bt_ctf_get_enum_int(const struct bt_definition *field);
533%rename("_bt_ctf_get_enum_str") bt_ctf_get_enum_str(const struct bt_definition *field);
2c0df204
XH
534%rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct bt_declaration *field);
535%rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct bt_declaration *field);
536%rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct bt_definition *field);
537%rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct bt_definition *field);
538%rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field);
539%rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field);
e5a73b90 540%rename("_bt_ctf_get_float") bt_ctf_get_float(const struct bt_definition *field);
812e6682 541%rename("_bt_ctf_get_variant") bt_ctf_get_variant(const struct bt_definition *field);
24a3136a
DS
542%rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void);
543%rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct
544 bt_ctf_event_decl *event);
78564612
AM
545%rename("_bt_ctf_get_decl_event_id") bt_ctf_get_decl_event_id(const struct
546 bt_ctf_event_decl *event);
24a3136a
DS
547%rename("_bt_ctf_get_decl_field_name") bt_ctf_get_decl_field_name(
548 const struct bt_ctf_field_decl *field);
f01efa78 549%rename("_bt_ctf_get_decl_from_def") bt_ctf_get_decl_from_def(
2c0df204 550 const struct bt_definition *field);
8bb27181
JG
551%rename("_bt_ctf_get_decl_from_field_decl") bt_ctf_get_decl_from_field_decl(
552 const struct bt_ctf_field_decl *field);
3c2ce778 553%rename("_bt_array_index") bt_array_index(struct definition_array *array, uint64_t i);
786207e0
XH
554%rename("_bt_sequence_len") bt_sequence_len(struct definition_sequence *sequence);
555%rename("_bt_sequence_index") bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
3a068915
JG
556%rename("_bt_ctf_get_struct_field_count") bt_ctf_get_struct_field_count(const struct bt_definition *structure);
557%rename("_bt_ctf_get_struct_field_index") bt_ctf_get_struct_field_index(const struct bt_definition *structure, uint64_t i);
24a3136a 558
2c0df204 559const struct bt_definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event,
24a3136a
DS
560 enum bt_ctf_scope scope);
561const char *bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
562uint64_t bt_ctf_get_timestamp(const struct bt_ctf_event *ctf_event);
563uint64_t bt_ctf_get_cycles(const struct bt_ctf_event *ctf_event);
2c0df204
XH
564const struct bt_definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
565 const struct bt_definition *scope,
24a3136a 566 const char *field);
2c0df204
XH
567const struct bt_definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
568 const struct bt_definition *field,
24a3136a 569 unsigned int index);
2c0df204
XH
570const char *bt_ctf_field_name(const struct bt_definition *field);
571enum ctf_type_id bt_ctf_field_type(const struct bt_declaration *field);
572int bt_ctf_get_int_signedness(const struct bt_declaration *field);
573int bt_ctf_get_int_base(const struct bt_declaration *field);
574int bt_ctf_get_int_byte_order(const struct bt_declaration *field);
575ssize_t bt_ctf_get_int_len(const struct bt_declaration *field);
4191bcd2
XH
576const struct bt_definition *bt_ctf_get_enum_int(const struct bt_definition *field);
577const char *bt_ctf_get_enum_str(const struct bt_definition *field);
2c0df204
XH
578enum ctf_string_encoding bt_ctf_get_encoding(const struct bt_declaration *field);
579int bt_ctf_get_array_len(const struct bt_declaration *field);
3c2ce778 580struct bt_definition *bt_array_index(struct definition_array *array, uint64_t i);
2c0df204
XH
581uint64_t bt_ctf_get_uint64(const struct bt_definition *field);
582int64_t bt_ctf_get_int64(const struct bt_definition *field);
583char *bt_ctf_get_char_array(const struct bt_definition *field);
584char *bt_ctf_get_string(const struct bt_definition *field);
e5a73b90 585double bt_ctf_get_float(const struct bt_definition *field);
812e6682 586const struct bt_definition *bt_ctf_get_variant(const struct bt_definition *field);
24a3136a
DS
587int bt_ctf_field_get_error(void);
588const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event);
78564612 589uint64_t bt_ctf_get_decl_event_id(const struct bt_ctf_event_decl *event);
24a3136a 590const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field);
2c0df204 591const struct bt_declaration *bt_ctf_get_decl_from_def(const struct bt_definition *field);
8bb27181 592const struct bt_declaration *bt_ctf_get_decl_from_field_decl(const struct bt_ctf_field_decl *field);
786207e0
XH
593uint64_t bt_sequence_len(struct definition_sequence *sequence);
594struct bt_definition *bt_sequence_index(struct definition_sequence *sequence, uint64_t i);
3a068915
JG
595uint64_t bt_ctf_get_struct_field_count(const struct bt_definition *structure);
596const struct bt_definition *bt_ctf_get_struct_field_index(const struct bt_definition *structure, uint64_t i);
24a3136a
DS
597
598%pythoncode%{
599
24d5c942
JG
600class CTFStringEncoding:
601 NONE = 0
602 UTF8 = 1
603 ASCII = 2
604 UNKNOWN = 3
605
8bb27181
JG
606# Based on the enum in ctf-writer/writer.h
607class ByteOrder:
608 BYTE_ORDER_NATIVE = 0
609 BYTE_ORDER_LITTLE_ENDIAN = 1
610 BYTE_ORDER_BIG_ENDIAN = 2
611 BYTE_ORDER_NETWORK = 3
612 BYTE_ORDER_UNKNOWN = 4 # Python-specific entry
613
24d5c942
JG
614#enum equivalent, accessible constants
615#These are taken directly from ctf/events.h
616#All changes to enums must also be made here
617class CTFTypeId:
618 UNKNOWN = 0
619 INTEGER = 1
620 FLOAT = 2
621 ENUM = 3
622 STRING = 4
623 STRUCT = 5
624 UNTAGGED_VARIANT = 6
625 VARIANT = 7
626 ARRAY = 8
627 SEQUENCE = 9
628 NR_CTF_TYPES = 10
8bb27181
JG
629 def type_name(id):
630 name = "UNKNOWN_TYPE"
24d5c942
JG
631 constants = [attr for attr in dir(CTFTypeId) if not callable(getattr(CTFTypeId, attr)) and not attr.startswith("__")]
632 for attr in constants:
633 if getattr(CTFTypeId, attr) == id:
634 name = attr
635 break
636 return name
637
8bb27181 638class CTFScope:
78d714e8
JG
639 TRACE_PACKET_HEADER = 0
640 STREAM_PACKET_CONTEXT = 1
641 STREAM_EVENT_HEADER = 2
642 STREAM_EVENT_CONTEXT = 3
643 EVENT_CONTEXT = 4
644 EVENT_FIELDS = 5
645
8bb27181
JG
646 def scope_name(scope):
647 name = "UNKNOWN_SCOPE"
648 constants = [attr for attr in dir(CTFScope) if not callable(getattr(CTFScope, attr)) and not attr.startswith("__")]
649 for attr in constants:
650 if getattr(CTFScope, attr) == scope:
651 name = attr
652 break
653 return name
654
e404272a 655# Priority of the scopes when searching for event fields
8bb27181
JG
656_scopes = [CTFScope.EVENT_FIELDS, CTFScope.EVENT_CONTEXT, CTFScope.STREAM_EVENT_CONTEXT,
657 CTFScope.STREAM_EVENT_HEADER, CTFScope.STREAM_PACKET_CONTEXT, CTFScope.TRACE_PACKET_HEADER]
e404272a 658
78d714e8 659import collections
49a04569 660from datetime import datetime
78d714e8
JG
661class Event(collections.Mapping):
662 """
663 This class represents an event from the trace.
664 It is obtained using the TraceCollection generator functions.
665 Do not instantiate.
666 """
78d714e8
JG
667 def __init__(self):
668 raise NotImplementedError("Event cannot be instantiated")
669
670 @property
671 def name(self):
672 """Return the name of the event or None on error."""
673 return _bt_ctf_event_name(self._e)
674
675 @property
676 def cycles(self):
24a3136a 677 """
78d714e8
JG
678 Return the timestamp of the event as written in
679 the packet (in cycles) or -1ULL on error.
24a3136a 680 """
78d714e8 681 return _bt_ctf_get_cycles(self._e)
24a3136a 682
78d714e8
JG
683 @property
684 def timestamp(self):
685 """
686 Return the timestamp of the event offset with the
687 system clock source or -1ULL on error.
688 """
689 return _bt_ctf_get_timestamp(self._e)
690
49a04569
JG
691 @property
692 def datetime(self):
693 """
694 Return a datetime object based on the event's
695 timestamp. Note that the datetime class' precision
696 is limited to microseconds.
697 """
698 return datetime.fromtimestamp(self.timestamp / 1E9)
699
78d714e8
JG
700 def field_with_scope(self, field_name, scope):
701 """
702 Get field_name's value in scope.
703 None is returned if no field matches field_name.
704 """
e404272a 705 if not scope in _scopes:
78d714e8
JG
706 raise ValueError("Invalid scope provided")
707 field = self._field_with_scope(field_name, scope)
708 if field is not None:
709 return field.value
710 return None
711
712 def field_list_with_scope(self, scope):
713 """Return a list of field names in scope."""
e404272a 714 if not scope in _scopes:
78d714e8
JG
715 raise ValueError("Invalid scope provided")
716 field_names = []
717 for field in self._field_list_with_scope(scope):
718 field_names.append(field.name)
719 return field_names
720
721 @property
722 def handle(self):
723 """
724 Get the TraceHandle associated with this event
725 Return None on error
726 """
727 ret = _bt_ctf_event_get_handle_id(self._e)
728 if ret < 0:
786207e0
XH
729 return None
730
78d714e8
JG
731 th = TraceHandle.__new__(TraceHandle)
732 th._id = ret
733 th._trace_collection = self.get_trace_collection()
734 return th
735
736 @property
737 def trace_collection(self):
738 """
739 Get the TraceCollection associated with this event.
740 Return None on error.
24a3136a 741 """
78d714e8
JG
742 trace_collection = TraceCollection()
743 trace_collection._tc = _bt_ctf_event_get_context(self._e);
744 if trace_collection._tc is None:
745 return None
746 else:
747 return trace_collection
748
749 def __getitem__(self, field_name):
24a3136a 750 """
78d714e8
JG
751 Get field_name's value. If the field_name exists in multiple
752 scopes, the first field found is returned. The scopes are searched
753 in the following order:
754 1) EVENT_FIELDS
755 2) EVENT_CONTEXT
756 3) STREAM_EVENT_CONTEXT
757 4) STREAM_EVENT_HEADER
758 5) STREAM_PACKET_CONTEXT
759 6) TRACE_PACKET_HEADER
760 None is returned if no field matches field_name.
761
762 Use field_with_scope() to explicitly access fields in a given
763 scope.
764 """
765 field = self._field(field_name)
766 if field is not None:
767 return field.value
768 raise KeyError(field_name)
769
770 def __iter__(self):
771 for key in self.keys():
772 yield key
773
774 def __len__(self):
775 count = 0
e404272a 776 for scope in _scopes:
78d714e8
JG
777 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
778 ret = _bt_python_field_listcaller(self._e, scope_ptr)
779 if isinstance(ret, list):
780 count += ret[1]
781 return count
782
783 def __contains__(self, field_name):
784 return self._field(field_name) is not None
785
786 def keys(self):
787 """Return a list of field names."""
788 field_names = set()
e404272a 789 for scope in _scopes:
78d714e8
JG
790 for name in self.field_list_with_scope(scope):
791 field_names.add(name)
792 return list(field_names)
793
794 def get(self, field_name, default = None):
795 field = self._field(field_name)
796 if field is None:
797 return default
798 return field.value
799
800 def items(self):
801 for field in self.keys():
802 yield (field, self[field])
803
804 def _field_with_scope(self, field_name, scope):
805 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
806 if scope_ptr is None:
807 return None
808
809 definition_ptr = _bt_ctf_get_field(self._e, scope_ptr, field_name)
810 if definition_ptr is None:
811 return None
24a3136a 812
78d714e8
JG
813 field = _Definition(definition_ptr, scope)
814 return field
815
816 def _field(self, field_name):
817 field = None
e404272a 818 for scope in _scopes:
78d714e8
JG
819 field = self._field_with_scope(field_name, scope)
820 if field is not None:
821 break
822 return field
823
824 def _field_list_with_scope(self, scope):
825 fields = []
826 scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope)
feb06edb 827
78d714e8
JG
828 # Returns a list [list_ptr, count]. If list_ptr is NULL, SWIG will only
829 # provide the "count" return value
830 count = 0
831 list_ptr = None
832 ret = _bt_python_field_listcaller(self._e, scope_ptr)
833 if isinstance(ret, list):
834 list_ptr, count = ret
835
836 for i in range(count):
837 definition_ptr = _bt_python_field_one_from_list(list_ptr, i)
838 if definition_ptr is not None:
839 definition = _Definition(definition_ptr, scope)
840 fields.append(definition)
841 return fields
842
843class FieldError(Exception):
844 def __init__(self, value):
845 self.value = value
846
847 def __str__(self):
848 return repr(self.value)
849
cb1fcc68 850class EventDeclaration(object):
78d714e8 851 """Event declaration class. Do not instantiate."""
78564612 852 MAX_UINT64 = 0xFFFFFFFFFFFFFFFF
78d714e8
JG
853
854 def __init__(self):
cb1fcc68 855 raise NotImplementedError("EventDeclaration cannot be instantiated")
78d714e8 856
cb1fcc68
JG
857 @property
858 def name(self):
78d714e8 859 """Return the name of the event or None on error"""
cb1fcc68 860 return _bt_ctf_get_decl_event_name(self._ed)
78d714e8 861
78564612
AM
862 @property
863 def id(self):
864 """Return the event-ID of the event or -1 on error"""
865 id = _bt_ctf_get_decl_event_id(self._ed)
866 if id == self.MAX_UINT64:
867 id = -1
868 return id
869
8bb27181
JG
870 @property
871 def fields(self):
24a3136a 872 """
8bb27181
JG
873 Generator returning all FieldDeclarations of an event, going through
874 each scope in the following order:
875 1) EVENT_FIELDS
876 2) EVENT_CONTEXT
877 3) STREAM_EVENT_CONTEXT
878 4) STREAM_EVENT_HEADER
879 5) STREAM_PACKET_CONTEXT
880 6) TRACE_PACKET_HEADER
881 """
882 for scope in _scopes:
883 for declaration in self.fields_scope(scope):
884 yield declaration
885
886 def fields_scope(self, scope):
887 """
888 Generator returning FieldDeclarations of the current event in scope.
24a3136a 889 """
cb1fcc68 890 ret = _by_python_field_decl_listcaller(self._ed, scope)
24a3136a 891
cb1fcc68 892 if not isinstance(ret, list):
8bb27181 893 return
24a3136a 894
cb1fcc68 895 list_ptr, count = ret
cb1fcc68 896 for i in range(count):
8bb27181
JG
897 field_declaration_ptr = _bt_python_field_decl_one_from_list(list_ptr, i)
898 if field_declaration_ptr is not None:
899 declaration_ptr = _bt_ctf_get_decl_from_field_decl(field_declaration_ptr)
900 field_declaration = _create_field_declaration(declaration_ptr, _bt_ctf_get_decl_field_name(field_declaration_ptr), scope)
901 yield field_declaration
cb1fcc68
JG
902
903class FieldDeclaration(object):
904 """Field declaration class. Do not instantiate."""
78d714e8 905 def __init__(self):
cb1fcc68 906 raise NotImplementedError("FieldDeclaration cannot be instantiated")
78d714e8 907
8bb27181
JG
908 def __repr__(self):
909 return "({0}) {1} {2}".format(CTFScope.scope_name(self.scope), CTFTypeId.type_name(self.type), self.name)
910
cb1fcc68
JG
911 @property
912 def name(self):
8bb27181
JG
913 """Return the name of a FieldDeclaration or None on error."""
914 return self._name
915
916 @property
917 def type(self):
918 """
919 Return the FieldDeclaration's type. One of the entries in class
920 CTFTypeId.
921 """
922 return _bt_ctf_field_type(self._fd)
923
924 @property
925 def scope(self):
926 """
927 Return the FieldDeclaration's scope.
928 """
929 return self._s
930
931class IntegerFieldDeclaration(FieldDeclaration):
932 """Do not instantiate."""
933 def __init__(self):
934 raise NotImplementedError("IntegerFieldDeclaration cannot be instantiated")
935
936 @property
937 def signedness(self):
938 """
939 Return the signedness of an integer:
940 0 if unsigned; 1 if signed; -1 on error.
941 """
942 return _bt_ctf_get_int_signedness(self._fd)
943
944 @property
945 def base(self):
946 """Return the base of an int or a negative value on error."""
947 return _bt_ctf_get_int_base(self._fd)
948
949 @property
950 def byte_order(self):
951 """
952 Return the byte order. One of class ByteOrder's entries.
953 """
954 ret = _bt_ctf_get_int_byte_order(self._fd)
955 if ret == 1234:
956 return ByteOrder.BYTE_ORDER_LITTLE_ENDIAN
957 elif ret == 4321:
958 return ByteOrder.BYTE_ORDER_BIG_ENDIAN
959 else:
960 return ByteOrder.BYTE_ORDER_UNKNOWN
961
962 @property
963 def length(self):
964 """
965 Return the size, in bits, of an int or a negative
966 value on error.
967 """
968 return _bt_ctf_get_int_len(self._fd)
969
970 @property
971 def encoding(self):
972 """
973 Return the encoding. One of class CTFStringEncoding's entries.
974 Return a negative value on error.
975 """
976 return _bt_ctf_get_encoding(self._fd)
977
978class EnumerationFieldDeclaration(FieldDeclaration):
979 """Do not instantiate."""
980 def __init__(self):
981 raise NotImplementedError("EnumerationFieldDeclaration cannot be instantiated")
982
983class ArrayFieldDeclaration(FieldDeclaration):
984 """Do not instantiate."""
985 def __init__(self):
986 raise NotImplementedError("ArrayFieldDeclaration cannot be instantiated")
987
988 @property
989 def length(self):
990 """
991 Return the length of an array or a negative
992 value on error.
993 """
994 return _bt_ctf_get_array_len(self._fd)
995
5792eb34
JG
996 @property
997 def element_declaration(self):
998 """
999 Return element declaration.
1000 """
1001 field_decl_ptr = _bt_python_get_array_element_declaration(self._fd)
1002 return _create_field_declaration(field_decl_ptr, "", self.scope)
1003
8bb27181
JG
1004class SequenceFieldDeclaration(FieldDeclaration):
1005 """Do not instantiate."""
1006 def __init__(self):
1007 raise NotImplementedError("SequenceFieldDeclaration cannot be instantiated")
1008
3866c850
JG
1009 @property
1010 def element_declaration(self):
1011 """
1012 Return element declaration.
1013 """
1014 field_decl_ptr = _bt_python_get_sequence_element_declaration(self._fd)
1015 return _create_field_declaration(field_decl_ptr, "", self.scope)
1016
8bb27181
JG
1017class FloatFieldDeclaration(FieldDeclaration):
1018 """Do not instantiate."""
1019 def __init__(self):
1020 raise NotImplementedError("FloatFieldDeclaration cannot be instantiated")
1021
1022class StructureFieldDeclaration(FieldDeclaration):
1023 """Do not instantiate."""
1024 def __init__(self):
1025 raise NotImplementedError("StructureFieldDeclaration cannot be instantiated")
1026
1027class StringFieldDeclaration(FieldDeclaration):
1028 """Do not instantiate."""
1029 def __init__(self):
1030 raise NotImplementedError("StringFieldDeclaration cannot be instantiated")
1031
1032class VariantFieldDeclaration(FieldDeclaration):
1033 """Do not instantiate."""
1034 def __init__(self):
1035 raise NotImplementedError("VariantFieldDeclaration cannot be instantiated")
78d714e8
JG
1036
1037def field_error():
1038 """
1039 Return the last error code encountered while
1040 accessing a field and reset the error flag.
1041 Return 0 if no error, a negative value otherwise.
1042 """
1043 return _bt_ctf_field_get_error()
1044
8bb27181 1045def _create_field_declaration(declaration_ptr, name, scope):
78d714e8 1046 """
8bb27181 1047 Private field declaration factory.
78d714e8 1048 """
8bb27181
JG
1049 if declaration_ptr is None:
1050 raise ValueError("declaration_ptr must be valid")
1051 if not scope in _scopes:
1052 raise ValueError("Invalid scope provided")
1053
1054 type = _bt_ctf_field_type(declaration_ptr)
1055 declaration = None
1056 if type == CTFTypeId.INTEGER:
1057 declaration = IntegerFieldDeclaration.__new__(IntegerFieldDeclaration)
1058 elif type == CTFTypeId.ENUM:
1059 declaration = EnumerationFieldDeclaration.__new__(EnumerationFieldDeclaration)
1060 elif type == CTFTypeId.ARRAY:
1061 declaration = ArrayFieldDeclaration.__new__(ArrayFieldDeclaration)
1062 elif type == CTFTypeId.SEQUENCE:
1063 declaration = SequenceFieldDeclaration.__new__(SequenceFieldDeclaration)
1064 elif type == CTFTypeId.FLOAT:
1065 declaration = FloatFieldDeclaration.__new__(FloatFieldDeclaration)
1066 elif type == CTFTypeId.STRUCT:
1067 declaration = StructureFieldDeclaration.__new__(StructureFieldDeclaration)
1068 elif type == CTFTypeId.STRING:
1069 declaration = StringFieldDeclaration.__new__(StringFieldDeclaration)
1070 elif type == CTFTypeId.VARIANT:
1071 declaration = VariantFieldDeclaration.__new__(VariantFieldDeclaration)
1072 else:
1073 return declaration
1074
1075 declaration._fd = declaration_ptr
1076 declaration._s = scope
1077 declaration._name = name
1078 return declaration
78d714e8
JG
1079
1080class _Definition(object):
1081 def __init__(self, definition_ptr, scope):
1082 self._d = definition_ptr
1083 self._s = scope
e404272a 1084 if not scope in _scopes:
78d714e8
JG
1085 ValueError("Invalid scope provided")
1086
78d714e8
JG
1087 @property
1088 def name(self):
1089 """Return the name of a field or None on error."""
1090 return _bt_ctf_field_name(self._d)
1091
5792eb34 1092 @property
78d714e8
JG
1093 def type(self):
1094 """Return the type of a field or -1 if unknown."""
1095 return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d))
1096
8bb27181
JG
1097 @property
1098 def declaration(self):
1099 """Return the associated Definition object."""
1100 return _create_field_declaration(_bt_ctf_get_decl_from_def(self._d), self.name, self.scope)
78d714e8 1101
8bb27181 1102 def _get_enum_str(self):
78d714e8
JG
1103 """
1104 Return the string matching the current enumeration.
1105 Return None on error.
1106 """
1107 return _bt_ctf_get_enum_str(self._d)
1108
8bb27181 1109 def _get_array_element_at(self, index):
78d714e8
JG
1110 """
1111 Return the array's element at position index.
1112 Return None on error
1113 """
1114 array_ptr = _bt_python_get_array_from_def(self._d)
1115 if array_ptr is None:
1116 return None
1117
1118 definition_ptr = _bt_array_index(array_ptr, index)
1119 if definition_ptr is None:
1120 return None
1121 return _Definition(definition_ptr, self.scope)
1122
8bb27181 1123 def _get_sequence_len(self):
78d714e8
JG
1124 """
1125 Return the len of a sequence or a negative
1126 value on error.
1127 """
1128 seq = _bt_python_get_sequence_from_def(self._d)
1129 return _bt_sequence_len(seq)
1130
8bb27181 1131 def _get_sequence_element_at(self, index):
78d714e8
JG
1132 """
1133 Return the sequence's element at position index,
1134 otherwise return None
1135 """
1136 seq = _bt_python_get_sequence_from_def(self._d)
1137 if seq is not None:
1138 definition_ptr = _bt_sequence_index(seq, index)
1139 if definition_ptr is not None:
1140 return _Definition(definition_ptr, self.scope)
1141 return None
1142
8bb27181 1143 def _get_uint64(self):
78d714e8
JG
1144 """
1145 Return the value associated with the field.
1146 If the field does not exist or is not of the type requested,
1147 the value returned is undefined. To check if an error occured,
1148 use the field_error() function after accessing a field.
1149 """
1150 return _bt_ctf_get_uint64(self._d)
1151
8bb27181 1152 def _get_int64(self):
78d714e8
JG
1153 """
1154 Return the value associated with the field.
1155 If the field does not exist or is not of the type requested,
1156 the value returned is undefined. To check if an error occured,
1157 use the field_error() function after accessing a field.
1158 """
1159 return _bt_ctf_get_int64(self._d)
1160
8bb27181 1161 def _get_char_array(self):
78d714e8
JG
1162 """
1163 Return the value associated with the field.
1164 If the field does not exist or is not of the type requested,
1165 the value returned is undefined. To check if an error occurred,
1166 use the field_error() function after accessing a field.
1167 """
1168 return _bt_ctf_get_char_array(self._d)
1169
8bb27181 1170 def _get_str(self):
78d714e8
JG
1171 """
1172 Return the value associated with the field.
1173 If the field does not exist or is not of the type requested,
1174 the value returned is undefined. To check if an error occurred,
1175 use the field_error() function after accessing a field.
1176 """
1177 return _bt_ctf_get_string(self._d)
1178
8bb27181 1179 def _get_float(self):
78d714e8
JG
1180 """
1181 Return the value associated with the field.
1182 If the field does not exist or is not of the type requested,
1183 the value returned is undefined. To check if an error occurred,
1184 use the field_error() function after accessing a field.
1185 """
1186 return _bt_ctf_get_float(self._d)
1187
8bb27181 1188 def _get_variant(self):
78d714e8
JG
1189 """
1190 Return the variant's selected field.
1191 If the field does not exist or is not of the type requested,
1192 the value returned is undefined. To check if an error occurred,
1193 use the field_error() function after accessing a field.
1194 """
1195 return _bt_ctf_get_variant(self._d)
1196
8bb27181 1197 def _get_struct_field_count(self):
78d714e8
JG
1198 """
1199 Return the number of fields contained in the structure.
1200 If the field does not exist or is not of the type requested,
1201 the value returned is undefined.
1202 """
1203 return _bt_ctf_get_struct_field_count(self._d)
1204
8bb27181 1205 def _get_struct_field_at(self, i):
78d714e8
JG
1206 """
1207 Return the structure's field at position i.
1208 If the field does not exist or is not of the type requested,
1209 the value returned is undefined. To check if an error occurred,
1210 use the field_error() function after accessing a field.
1211 """
1212 return _bt_ctf_get_struct_field_index(self._d, i)
1213
1214 @property
1215 def value(self):
1216 """
1217 Return the value associated with the field according to its type.
1218 Return None on error.
1219 """
1220 id = self.type
1221 value = None
5792eb34 1222
78d714e8 1223 if id == CTFTypeId.STRING:
8bb27181 1224 value = self._get_str()
78d714e8 1225 elif id == CTFTypeId.ARRAY:
5792eb34
JG
1226 element_decl = self.declaration.element_declaration
1227 if ((element_decl.type == CTFTypeId.INTEGER
1228 and element_decl.length == 8)
1229 and (element_decl.encoding == CTFStringEncoding.ASCII or element_decl.encoding == CTFStringEncoding.UTF8)):
1230 value = _bt_python_get_array_string(self._d)
1231 else:
1232 value = []
1233 for i in range(self.declaration.length):
1234 element = self._get_array_element_at(i)
1235 value.append(element.value)
78d714e8 1236 elif id == CTFTypeId.INTEGER:
8bb27181
JG
1237 if self.declaration.signedness == 0:
1238 value = self._get_uint64()
78d714e8 1239 else:
8bb27181 1240 value = self._get_int64()
78d714e8 1241 elif id == CTFTypeId.ENUM:
8bb27181 1242 value = self._get_enum_str()
78d714e8 1243 elif id == CTFTypeId.SEQUENCE:
3866c850
JG
1244 element_decl = self.declaration.element_declaration
1245 if ((element_decl.type == CTFTypeId.INTEGER
1246 and element_decl.length == 8)
1247 and (element_decl.encoding == CTFStringEncoding.ASCII or element_decl.encoding == CTFStringEncoding.UTF8)):
1248 value = _bt_python_get_sequence_string(self._d)
1249 else:
1250 seq_len = self._get_sequence_len()
1251 value = []
1252 for i in range(seq_len):
1253 evDef = self._get_sequence_element_at(i)
1254 value.append(evDef.value)
78d714e8 1255 elif id == CTFTypeId.FLOAT:
8bb27181 1256 value = self._get_float()
78d714e8 1257 elif id == CTFTypeId.VARIANT:
8bb27181
JG
1258 variant = _Definition.__new__(_Definition)
1259 variant._d = self._get_variant();
78d714e8
JG
1260 value = variant.value
1261 elif id == CTFTypeId.STRUCT:
1262 value = {}
8bb27181
JG
1263 for i in range(self._get_struct_field_count()):
1264 member = _Definition(self._get_struct_field_at(i), self.scope)
78d714e8
JG
1265 value[member.name] = member.value
1266
1267 if field_error():
5792eb34 1268 raise FieldError("Error occurred while accessing field {} of type {}".format(self.name, CTFTypeId.type_name(id)))
78d714e8
JG
1269 return value
1270
1271 @property
1272 def scope(self):
1273 """Return the scope of a field or None on error."""
1274 return self._s
1275
24a3136a
DS
1276%}
1277
1278
ec8c88d7
JG
1279// =================================================================
1280// CTF Writer
1281// =================================================================
1282
1283/* =================================================================
1284 CLOCK.H
1285 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1286*/
1287%rename("_bt_ctf_clock_create") bt_ctf_clock_create(const char *name);
b0bb560c
JG
1288%rename("_bt_ctf_clock_get_name") bt_ctf_clock_get_name(struct bt_ctf_clock *clock);
1289%rename("_bt_ctf_clock_get_description") bt_ctf_clock_get_description(struct bt_ctf_clock *clock);
ec8c88d7 1290%rename("_bt_ctf_clock_set_description") bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc);
b0bb560c 1291%rename("_bt_ctf_clock_get_frequency") bt_ctf_clock_get_frequency(struct bt_ctf_clock *clock);
ec8c88d7 1292%rename("_bt_ctf_clock_set_frequency") bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq);
b0bb560c 1293%rename("_bt_ctf_clock_get_precision") bt_ctf_clock_get_precision(struct bt_ctf_clock *clock);
ec8c88d7 1294%rename("_bt_ctf_clock_set_precision") bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision);
b0bb560c 1295%rename("_bt_ctf_clock_get_offset_s") bt_ctf_clock_get_offset_s(struct bt_ctf_clock *clock);
ec8c88d7 1296%rename("_bt_ctf_clock_set_offset_s") bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, uint64_t offset_s);
b0bb560c 1297%rename("_bt_ctf_clock_get_offset") bt_ctf_clock_get_offset(struct bt_ctf_clock *clock);
ec8c88d7 1298%rename("_bt_ctf_clock_set_offset") bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, uint64_t offset);
b0bb560c 1299%rename("_bt_ctf_clock_get_is_absolute") bt_ctf_clock_get_is_absolute(struct bt_ctf_clock *clock);
ec8c88d7 1300%rename("_bt_ctf_clock_set_is_absolute") bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute);
b0bb560c 1301%rename("_bt_ctf_clock_get_time") bt_ctf_clock_get_time(struct bt_ctf_clock *clock);
ec8c88d7
JG
1302%rename("_bt_ctf_clock_set_time") bt_ctf_clock_set_time(struct bt_ctf_clock *clock, uint64_t time);
1303%rename("_bt_ctf_clock_get") bt_ctf_clock_get(struct bt_ctf_clock *clock);
1304%rename("_bt_ctf_clock_put") bt_ctf_clock_put(struct bt_ctf_clock *clock);
1305
1306struct bt_ctf_clock *bt_ctf_clock_create(const char *name);
b0bb560c
JG
1307const char *bt_ctf_clock_get_name(struct bt_ctf_clock *clock);
1308const char *bt_ctf_clock_get_description(struct bt_ctf_clock *clock);
ec8c88d7 1309int bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc);
b0bb560c 1310uint64_t bt_ctf_clock_get_frequency(struct bt_ctf_clock *clock);
ec8c88d7 1311int bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq);
b0bb560c 1312uint64_t bt_ctf_clock_get_precision(struct bt_ctf_clock *clock);
ec8c88d7 1313int bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision);
b0bb560c 1314uint64_t bt_ctf_clock_get_offset_s(struct bt_ctf_clock *clock);
ec8c88d7 1315int bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, uint64_t offset_s);
b0bb560c 1316uint64_t bt_ctf_clock_get_offset(struct bt_ctf_clock *clock);
ec8c88d7 1317int bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, uint64_t offset);
b0bb560c 1318int bt_ctf_clock_get_is_absolute(struct bt_ctf_clock *clock);
ec8c88d7 1319int bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute);
b0bb560c 1320uint64_t bt_ctf_clock_get_time(struct bt_ctf_clock *clock);
ec8c88d7
JG
1321int bt_ctf_clock_set_time(struct bt_ctf_clock *clock, uint64_t time);
1322void bt_ctf_clock_get(struct bt_ctf_clock *clock);
1323void bt_ctf_clock_put(struct bt_ctf_clock *clock);
1324
1325/* =================================================================
1326 EVENT-TYPES.H
1327 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1328*/
1329%rename("_bt_ctf_field_type_integer_create") bt_ctf_field_type_integer_create(unsigned int size);
b4b5e4b5
JG
1330%rename("_bt_ctf_field_type_integer_get_size") bt_ctf_field_type_integer_get_size(struct bt_ctf_field_type *integer);
1331%rename("_bt_ctf_field_type_integer_get_signed") bt_ctf_field_type_integer_get_signed(struct bt_ctf_field_type *integer);
ec8c88d7 1332%rename("_bt_ctf_field_type_integer_set_signed") bt_ctf_field_type_integer_set_signed(struct bt_ctf_field_type *integer, int is_signed);
b4b5e4b5 1333%rename("_bt_ctf_field_type_integer_get_base") bt_ctf_field_type_integer_get_base(struct bt_ctf_field_type *integer);
ec8c88d7 1334%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);
b4b5e4b5 1335%rename("_bt_ctf_field_type_integer_get_encoding") bt_ctf_field_type_integer_get_encoding(struct bt_ctf_field_type *integer);
ec8c88d7
JG
1336%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);
1337%rename("_bt_ctf_field_type_enumeration_create") bt_ctf_field_type_enumeration_create(struct bt_ctf_field_type *integer_container_type);
b4b5e4b5
JG
1338%rename("_bt_ctf_field_type_enumeration_get_container_type") bt_ctf_field_type_enumeration_get_container_type(struct bt_ctf_field_type *enumeration);
1339%rename("_bt_ctf_field_type_enumeration_add_mapping") bt_ctf_field_type_enumeration_add_mapping(struct bt_ctf_field_type *enumeration, const char *name, int64_t range_start, int64_t range_end);
1340%rename("_bt_ctf_field_type_enumeration_add_mapping_unsigned") bt_ctf_field_type_enumeration_add_mapping_unsigned(struct bt_ctf_field_type *enumeration, const char *name, uint64_t range_start, uint64_t range_end);
1341%rename("_bt_ctf_field_type_enumeration_get_mapping_count") bt_ctf_field_type_enumeration_get_mapping_count(struct bt_ctf_field_type *enumeration);
1342%rename("_bt_ctf_field_type_enumeration_get_mapping") bt_ctf_field_type_enumeration_get_mapping(struct bt_ctf_field_type *enumeration, size_t index, const char **name, int64_t *range_start, int64_t *range_end);
1343%rename("_bt_ctf_field_type_enumeration_get_mapping_unsigned") bt_ctf_field_type_enumeration_get_mapping_unsigned(struct bt_ctf_field_type *enumeration, size_t index, const char **name, uint64_t *range_start, uint64_t *range_end);
1344%rename("_bt_ctf_field_type_enumeration_get_mapping_index_by_name") bt_ctf_field_type_enumeration_get_mapping_index_by_name(struct bt_ctf_field_type *enumeration, const char *name, size_t *index);
1345%rename("_bt_ctf_field_type_enumeration_get_mapping_index_by_value") bt_ctf_field_type_enumeration_get_mapping_index_by_value(struct bt_ctf_field_type *enumeration, int64_t value, size_t *index);
1346%rename("_bt_ctf_field_type_enumeration_get_mapping_index_by_unsigned_value") bt_ctf_field_type_enumeration_get_mapping_index_by_unsigned_value(struct bt_ctf_field_type *enumeration, uint64_t value, size_t *index);
ec8c88d7 1347%rename("_bt_ctf_field_type_floating_point_create") bt_ctf_field_type_floating_point_create(void);
b4b5e4b5 1348%rename("_bt_ctf_field_type_floating_point_get_exponent_digits") bt_ctf_field_type_floating_point_get_exponent_digits(struct bt_ctf_field_type *floating_point);
ec8c88d7 1349%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);
b4b5e4b5 1350%rename("_bt_ctf_field_type_floating_point_get_mantissa_digits") bt_ctf_field_type_floating_point_get_mantissa_digits(struct bt_ctf_field_type *floating_point);
ec8c88d7
JG
1351%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);
1352%rename("_bt_ctf_field_type_structure_create") bt_ctf_field_type_structure_create(void);
1353%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);
b4b5e4b5
JG
1354%rename("_bt_ctf_field_type_structure_get_field_count") bt_ctf_field_type_structure_get_field_count(struct bt_ctf_field_type *structure);
1355%rename("_bt_ctf_field_type_structure_get_field") bt_ctf_field_type_structure_get_field(struct bt_ctf_field_type *structure, const char **field_name, struct bt_ctf_field_type **field_type, size_t index);
1356%rename("_bt_ctf_field_type_structure_get_field_type_by_name") bt_ctf_field_type_structure_get_field_type_by_name(struct bt_ctf_field_type *structure, const char *field_name);
ec8c88d7 1357%rename("_bt_ctf_field_type_variant_create") bt_ctf_field_type_variant_create(struct bt_ctf_field_type *enum_tag, const char *tag_name);
b4b5e4b5
JG
1358%rename("_bt_ctf_field_type_variant_get_tag_type") bt_ctf_field_type_variant_get_tag_type(struct bt_ctf_field_type *variant);
1359%rename("_bt_ctf_field_type_variant_get_tag_name") bt_ctf_field_type_variant_get_tag_name(struct bt_ctf_field_type *variant);
ec8c88d7 1360%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);
b4b5e4b5
JG
1361%rename("_bt_ctf_field_type_variant_get_field_type_by_name") bt_ctf_field_type_variant_get_field_type_by_name(struct bt_ctf_field_type *variant, const char *field_name);
1362%rename("_bt_ctf_field_type_variant_get_field_type_from_tag") bt_ctf_field_type_variant_get_field_type_from_tag(struct bt_ctf_field_type *variant, struct bt_ctf_field *tag);
1363%rename("_bt_ctf_field_type_variant_get_field_count") bt_ctf_field_type_variant_get_field_count(struct bt_ctf_field_type *variant);
1364%rename("_bt_ctf_field_type_variant_get_field") bt_ctf_field_type_variant_get_field(struct bt_ctf_field_type *variant, const char **field_name, struct bt_ctf_field_type **field_type, size_t index);
ec8c88d7 1365%rename("_bt_ctf_field_type_array_create") bt_ctf_field_type_array_create(struct bt_ctf_field_type *element_type, unsigned int length);
b4b5e4b5
JG
1366%rename("_bt_ctf_field_type_array_get_element_type") bt_ctf_field_type_array_get_element_type(struct bt_ctf_field_type *array);
1367%rename("_bt_ctf_field_type_array_get_length") bt_ctf_field_type_array_get_length(struct bt_ctf_field_type *array);
ec8c88d7 1368%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);
b4b5e4b5
JG
1369%rename("_bt_ctf_field_type_sequence_get_element_type") bt_ctf_field_type_sequence_get_element_type(struct bt_ctf_field_type *sequence);
1370%rename("_bt_ctf_field_type_sequence_get_length_field_name") bt_ctf_field_type_sequence_get_length_field_name(struct bt_ctf_field_type *sequence);
ec8c88d7 1371%rename("_bt_ctf_field_type_string_create") bt_ctf_field_type_string_create(void);
b4b5e4b5
JG
1372%rename("_bt_ctf_field_type_string_get_encoding") bt_ctf_field_type_string_get_encoding(struct bt_ctf_field_type *string_type);
1373%rename("_bt_ctf_field_type_string_set_encoding") bt_ctf_field_type_string_set_encoding(struct bt_ctf_field_type *string_type, enum ctf_string_encoding encoding);
1374%rename("_bt_ctf_field_type_get_alignment") bt_ctf_field_type_get_alignment(struct bt_ctf_field_type *type);
ec8c88d7 1375%rename("_bt_ctf_field_type_set_alignment") bt_ctf_field_type_set_alignment(struct bt_ctf_field_type *type, unsigned int alignment);
b4b5e4b5 1376%rename("_bt_ctf_field_type_get_byte_order") bt_ctf_field_type_get_byte_order(struct bt_ctf_field_type *type);
ec8c88d7 1377%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);
b4b5e4b5 1378%rename("_bt_ctf_field_type_get_type_id") bt_ctf_field_type_get_type_id(struct bt_ctf_field_type *type);
ec8c88d7
JG
1379%rename("_bt_ctf_field_type_get") bt_ctf_field_type_get(struct bt_ctf_field_type *type);
1380%rename("_bt_ctf_field_type_put") bt_ctf_field_type_put(struct bt_ctf_field_type *type);
1381
1382struct bt_ctf_field_type *bt_ctf_field_type_integer_create(unsigned int size);
b4b5e4b5
JG
1383int bt_ctf_field_type_integer_get_size(struct bt_ctf_field_type *integer);
1384int bt_ctf_field_type_integer_get_signed(struct bt_ctf_field_type *integer);
ec8c88d7 1385int bt_ctf_field_type_integer_set_signed(struct bt_ctf_field_type *integer, int is_signed);
b4b5e4b5 1386enum bt_ctf_integer_base bt_ctf_field_type_integer_get_base(struct bt_ctf_field_type *integer);
ec8c88d7 1387int bt_ctf_field_type_integer_set_base(struct bt_ctf_field_type *integer, enum bt_ctf_integer_base base);
b4b5e4b5 1388enum ctf_string_encoding bt_ctf_field_type_integer_get_encoding(struct bt_ctf_field_type *integer);
ec8c88d7
JG
1389int bt_ctf_field_type_integer_set_encoding(struct bt_ctf_field_type *integer, enum ctf_string_encoding encoding);
1390struct bt_ctf_field_type *bt_ctf_field_type_enumeration_create(struct bt_ctf_field_type *integer_container_type);
b4b5e4b5
JG
1391struct bt_ctf_field_type *bt_ctf_field_type_enumeration_get_container_type(struct bt_ctf_field_type *enumeration);
1392int bt_ctf_field_type_enumeration_add_mapping(struct bt_ctf_field_type *enumeration, const char *name, int64_t range_start, int64_t range_end);
1393int bt_ctf_field_type_enumeration_add_mapping_unsigned(struct bt_ctf_field_type *enumeration, const char *name, uint64_t range_start, uint64_t range_end);
1394int64_t bt_ctf_field_type_enumeration_get_mapping_count(struct bt_ctf_field_type *enumeration);
1395int bt_ctf_field_type_enumeration_get_mapping(struct bt_ctf_field_type *enumeration, size_t index, const char **OUTPUT, int64_t *OUTPUT, int64_t *OUTPUT);
1396int bt_ctf_field_type_enumeration_get_mapping_unsigned(struct bt_ctf_field_type *enumeration, size_t index, const char **OUTPUT, uint64_t *OUTPUT, uint64_t *OUTPUT);
1397int bt_ctf_field_type_enumeration_get_mapping_index_by_name(struct bt_ctf_field_type *enumeration, const char *name, size_t *OUTPUT);
1398int bt_ctf_field_type_enumeration_get_mapping_index_by_value(struct bt_ctf_field_type *enumeration, int64_t value, size_t *OUTPUT);
1399int bt_ctf_field_type_enumeration_get_mapping_index_by_unsigned_value(struct bt_ctf_field_type *enumeration, uint64_t value, size_t *OUTPUT);
ec8c88d7 1400struct bt_ctf_field_type *bt_ctf_field_type_floating_point_create(void);
b4b5e4b5 1401int bt_ctf_field_type_floating_point_get_exponent_digits(struct bt_ctf_field_type *floating_point);
ec8c88d7 1402int bt_ctf_field_type_floating_point_set_exponent_digits(struct bt_ctf_field_type *floating_point, unsigned int exponent_digits);
b4b5e4b5 1403int bt_ctf_field_type_floating_point_get_mantissa_digits(struct bt_ctf_field_type *floating_point);
ec8c88d7
JG
1404int bt_ctf_field_type_floating_point_set_mantissa_digits(struct bt_ctf_field_type *floating_point, unsigned int mantissa_digits);
1405struct bt_ctf_field_type *bt_ctf_field_type_structure_create(void);
1406int bt_ctf_field_type_structure_add_field(struct bt_ctf_field_type *structure, struct bt_ctf_field_type *field_type, const char *field_name);
b4b5e4b5
JG
1407int64_t bt_ctf_field_type_structure_get_field_count(struct bt_ctf_field_type *structure);
1408int bt_ctf_field_type_structure_get_field(struct bt_ctf_field_type *structure, const char **OUTPUT, struct bt_ctf_field_type **OUTPUT, size_t index);
1409struct bt_ctf_field_type *bt_ctf_field_type_structure_get_field_type_by_name(struct bt_ctf_field_type *structure, const char *field_name);
ec8c88d7 1410struct bt_ctf_field_type *bt_ctf_field_type_variant_create(struct bt_ctf_field_type *enum_tag, const char *tag_name);
b4b5e4b5
JG
1411struct bt_ctf_field_type *bt_ctf_field_type_variant_get_tag_type(struct bt_ctf_field_type *variant);
1412const char *bt_ctf_field_type_variant_get_tag_name(struct bt_ctf_field_type *variant);
ec8c88d7 1413int bt_ctf_field_type_variant_add_field(struct bt_ctf_field_type *variant, struct bt_ctf_field_type *field_type, const char *field_name);
b4b5e4b5
JG
1414struct bt_ctf_field_type *bt_ctf_field_type_variant_get_field_type_by_name(struct bt_ctf_field_type *variant, const char *field_name);
1415struct bt_ctf_field_type *bt_ctf_field_type_variant_get_field_type_from_tag(struct bt_ctf_field_type *variant, struct bt_ctf_field *tag);
1416int64_t bt_ctf_field_type_variant_get_field_count(struct bt_ctf_field_type *variant);
1417int bt_ctf_field_type_variant_get_field(struct bt_ctf_field_type *variant, const char **OUTPUT, struct bt_ctf_field_type **OUTPUT, size_t index);
ec8c88d7 1418struct bt_ctf_field_type *bt_ctf_field_type_array_create(struct bt_ctf_field_type *element_type, unsigned int length);
b4b5e4b5
JG
1419struct bt_ctf_field_type *bt_ctf_field_type_array_get_element_type(struct bt_ctf_field_type *array);
1420int64_t bt_ctf_field_type_array_get_length(struct bt_ctf_field_type *array);
ec8c88d7 1421struct bt_ctf_field_type *bt_ctf_field_type_sequence_create(struct bt_ctf_field_type *element_type, const char *length_field_name);
b4b5e4b5
JG
1422struct bt_ctf_field_type *bt_ctf_field_type_sequence_get_element_type(struct bt_ctf_field_type *sequence);
1423const char *bt_ctf_field_type_sequence_get_length_field_name(struct bt_ctf_field_type *sequence);
ec8c88d7 1424struct bt_ctf_field_type *bt_ctf_field_type_string_create(void);
b4b5e4b5
JG
1425enum ctf_string_encoding bt_ctf_field_type_string_get_encoding(struct bt_ctf_field_type *string_type);
1426int bt_ctf_field_type_string_set_encoding(struct bt_ctf_field_type *string_type, enum ctf_string_encoding encoding);
1427int bt_ctf_field_type_get_alignment(struct bt_ctf_field_type *type);
ec8c88d7 1428int bt_ctf_field_type_set_alignment(struct bt_ctf_field_type *type, unsigned int alignment);
b4b5e4b5 1429enum bt_ctf_byte_order bt_ctf_field_type_get_byte_order(struct bt_ctf_field_type *type);
ec8c88d7 1430int bt_ctf_field_type_set_byte_order(struct bt_ctf_field_type *type, enum bt_ctf_byte_order byte_order);
b4b5e4b5 1431enum ctf_type_id bt_ctf_field_type_get_type_id(struct bt_ctf_field_type *type);
ec8c88d7
JG
1432void bt_ctf_field_type_get(struct bt_ctf_field_type *type);
1433void bt_ctf_field_type_put(struct bt_ctf_field_type *type);
1434
1435/* =================================================================
1436 EVENT-FIELDS.H
1437 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1438*/
1439%rename("_bt_ctf_field_create") bt_ctf_field_create(struct bt_ctf_field_type *type);
1440%rename("_bt_ctf_field_structure_get_field") bt_ctf_field_structure_get_field(struct bt_ctf_field *structure, const char *name);
1441%rename("_bt_ctf_field_array_get_field") bt_ctf_field_array_get_field(struct bt_ctf_field *array, uint64_t index);
821ca76c 1442%rename("_bt_ctf_field_sequence_get_length") bt_ctf_field_sequence_get_length(struct bt_ctf_field *sequence);
ec8c88d7
JG
1443%rename("_bt_ctf_field_sequence_set_length") bt_ctf_field_sequence_set_length(struct bt_ctf_field *sequence, struct bt_ctf_field *length_field);
1444%rename("_bt_ctf_field_sequence_get_field") bt_ctf_field_sequence_get_field(struct bt_ctf_field *sequence, uint64_t index);
1445%rename("_bt_ctf_field_variant_get_field") bt_ctf_field_variant_get_field(struct bt_ctf_field *variant, struct bt_ctf_field *tag);
1446%rename("_bt_ctf_field_enumeration_get_container") bt_ctf_field_enumeration_get_container(struct bt_ctf_field *enumeration);
821ca76c
JG
1447%rename("_bt_ctf_field_enumeration_get_mapping_name") bt_ctf_field_enumeration_get_mapping_name(struct bt_ctf_field *enumeration);
1448%rename("_bt_ctf_field_signed_integer_get_value") bt_ctf_field_signed_integer_get_value(struct bt_ctf_field *integer, int64_t *value);
ec8c88d7 1449%rename("_bt_ctf_field_signed_integer_set_value") bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *integer, int64_t value);
821ca76c 1450%rename("_bt_ctf_field_unsigned_integer_get_value") bt_ctf_field_unsigned_integer_get_value(struct bt_ctf_field *integer, uint64_t *value);
ec8c88d7 1451%rename("_bt_ctf_field_unsigned_integer_set_value") bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *integer, uint64_t value);
821ca76c 1452%rename("_bt_ctf_field_floating_point_get_value") bt_ctf_field_floating_point_get_value(struct bt_ctf_field *floating_point, double *value);
ec8c88d7 1453%rename("_bt_ctf_field_floating_point_set_value") bt_ctf_field_floating_point_set_value(struct bt_ctf_field *floating_point, double value);
b4b5e4b5
JG
1454%rename("_bt_ctf_field_string_get_value") bt_ctf_field_string_get_value(struct bt_ctf_field *string_field);
1455%rename("_bt_ctf_field_string_set_value") bt_ctf_field_string_set_value(struct bt_ctf_field *string_field, const char *value);
821ca76c 1456%rename("_bt_ctf_field_get_type") bt_ctf_field_get_type(struct bt_ctf_field *field);
ec8c88d7
JG
1457%rename("_bt_ctf_field_get") bt_ctf_field_get(struct bt_ctf_field *field);
1458%rename("_bt_ctf_field_put") bt_ctf_field_put(struct bt_ctf_field *field);
1459
1460struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type);
1461struct bt_ctf_field *bt_ctf_field_structure_get_field(struct bt_ctf_field *structure, const char *name);
1462struct bt_ctf_field *bt_ctf_field_array_get_field(struct bt_ctf_field *array, uint64_t index);
821ca76c 1463struct bt_ctf_field * bt_ctf_field_sequence_get_length(struct bt_ctf_field *sequence);
ec8c88d7
JG
1464int bt_ctf_field_sequence_set_length(struct bt_ctf_field *sequence, struct bt_ctf_field *length_field);
1465struct bt_ctf_field *bt_ctf_field_sequence_get_field(struct bt_ctf_field *sequence, uint64_t index);
1466struct bt_ctf_field *bt_ctf_field_variant_get_field(struct bt_ctf_field *variant, struct bt_ctf_field *tag);
1467struct bt_ctf_field *bt_ctf_field_enumeration_get_container(struct bt_ctf_field *enumeration);
821ca76c
JG
1468const char *bt_ctf_field_enumeration_get_mapping_name(struct bt_ctf_field *enumeration);
1469int bt_ctf_field_signed_integer_get_value(struct bt_ctf_field *integer, int64_t *OUTPUT);
ec8c88d7 1470int bt_ctf_field_signed_integer_set_value(struct bt_ctf_field *integer, int64_t value);
821ca76c 1471int bt_ctf_field_unsigned_integer_get_value(struct bt_ctf_field *integer, uint64_t *OUTPUT);
ec8c88d7 1472int bt_ctf_field_unsigned_integer_set_value(struct bt_ctf_field *integer, uint64_t value);
821ca76c 1473int bt_ctf_field_floating_point_get_value(struct bt_ctf_field *floating_point, double *OUTPUT);
ec8c88d7 1474int bt_ctf_field_floating_point_set_value(struct bt_ctf_field *floating_point, double value);
b4b5e4b5
JG
1475const char *bt_ctf_field_string_get_value(struct bt_ctf_field *string_field);
1476int bt_ctf_field_string_set_value(struct bt_ctf_field *string_field, const char *value);
821ca76c 1477struct bt_ctf_field_type *bt_ctf_field_get_type(struct bt_ctf_field *field);
ec8c88d7
JG
1478void bt_ctf_field_get(struct bt_ctf_field *field);
1479void bt_ctf_field_put(struct bt_ctf_field *field);
1480
1481/* =================================================================
1482 EVENT.H
1483 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1484*/
1485%rename("_bt_ctf_event_class_create") bt_ctf_event_class_create(const char *name);
38f28df6
JG
1486%rename("_bt_ctf_event_class_get_name") bt_ctf_event_class_get_name(struct bt_ctf_event_class *event_class);
1487%rename("_bt_ctf_event_class_get_id") bt_ctf_event_class_get_id(struct bt_ctf_event_class *event_class);
1488%rename("_bt_ctf_event_class_set_id") bt_ctf_event_class_set_id(struct bt_ctf_event_class *event_class, uint32_t id);
1489%rename("_bt_ctf_event_class_get_stream_class") bt_ctf_event_class_get_stream_class(struct bt_ctf_event_class *event_class);
ec8c88d7 1490%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);
38f28df6
JG
1491%rename("_bt_ctf_event_class_get_field_count") bt_ctf_event_class_get_field_count(struct bt_ctf_event_class *event_class);
1492%rename("_bt_ctf_event_class_get_field") bt_ctf_event_class_get_field(struct bt_ctf_event_class *event_class, const char **field_name, struct bt_ctf_field_type **field_type, size_t index);
1493%rename("_bt_ctf_event_class_get_field_by_name") bt_ctf_event_class_get_field_by_name(struct bt_ctf_event_class *event_class, const char *name);
ec8c88d7
JG
1494%rename("_bt_ctf_event_class_get") bt_ctf_event_class_get(struct bt_ctf_event_class *event_class);
1495%rename("_bt_ctf_event_class_put") bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
1496%rename("_bt_ctf_event_create") bt_ctf_event_create(struct bt_ctf_event_class *event_class);
38f28df6
JG
1497%rename("_bt_ctf_event_get_class") bt_ctf_event_get_class(struct bt_ctf_event *event);
1498%rename("_bt_ctf_event_get_clock") bt_ctf_event_get_clock(struct bt_ctf_event *event);
ec8c88d7 1499%rename("_bt_ctf_event_get_payload") bt_ctf_event_get_payload(struct bt_ctf_event *event, const char *name);
38f28df6
JG
1500%rename("_bt_ctf_event_set_payload") bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struct bt_ctf_field *value);
1501%rename("_bt_ctf_event_get_payload_by_index") bt_ctf_event_get_payload_by_index(struct bt_ctf_event *event, size_t index);
ec8c88d7
JG
1502%rename("_bt_ctf_event_get") bt_ctf_event_get(struct bt_ctf_event *event);
1503%rename("_bt_ctf_event_put") bt_ctf_event_put(struct bt_ctf_event *event);
1504
1505struct bt_ctf_event_class *bt_ctf_event_class_create(const char *name);
38f28df6
JG
1506const char *bt_ctf_event_class_get_name(struct bt_ctf_event_class *event_class);
1507int64_t bt_ctf_event_class_get_id(struct bt_ctf_event_class *event_class);
1508int bt_ctf_event_class_set_id(struct bt_ctf_event_class *event_class, uint32_t id);
1509struct bt_ctf_stream_class *bt_ctf_event_class_get_stream_class(struct bt_ctf_event_class *event_class);
ec8c88d7 1510int bt_ctf_event_class_add_field(struct bt_ctf_event_class *event_class, struct bt_ctf_field_type *type, const char *name);
38f28df6
JG
1511int64_t bt_ctf_event_class_get_field_count(struct bt_ctf_event_class *event_class);
1512int bt_ctf_event_class_get_field(struct bt_ctf_event_class *event_class, const char **field_name, struct bt_ctf_field_type **field_type, size_t index);
1513struct bt_ctf_field_type *bt_ctf_event_class_get_field_by_name(struct bt_ctf_event_class *event_class, const char *name);
ec8c88d7
JG
1514void bt_ctf_event_class_get(struct bt_ctf_event_class *event_class);
1515void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
1516struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class);
38f28df6
JG
1517struct bt_ctf_event_class *bt_ctf_event_get_class(struct bt_ctf_event *event);
1518struct bt_ctf_clock *bt_ctf_event_get_clock(struct bt_ctf_event *event);
ec8c88d7 1519struct bt_ctf_field *bt_ctf_event_get_payload(struct bt_ctf_event *event, const char *name);
38f28df6
JG
1520int bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struct bt_ctf_field *value);
1521struct bt_ctf_field *bt_ctf_event_get_payload_by_index(struct bt_ctf_event *event, size_t index);
ec8c88d7
JG
1522void bt_ctf_event_get(struct bt_ctf_event *event);
1523void bt_ctf_event_put(struct bt_ctf_event *event);
1524
1525/* =================================================================
1526 STREAM.H
1527 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1528*/
1529%rename("_bt_ctf_stream_class_create") bt_ctf_stream_class_create(const char *name);
f6c2aa83
JG
1530%rename("_bt_ctf_stream_class_get_name") bt_ctf_stream_class_get_name(struct bt_ctf_stream_class *stream_class);
1531%rename("_bt_ctf_stream_class_get_clock") bt_ctf_stream_class_get_clock(struct bt_ctf_stream_class *stream_class);
ec8c88d7 1532%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);
f6c2aa83
JG
1533%rename("_bt_ctf_stream_class_get_id") bt_ctf_stream_class_get_id(struct bt_ctf_stream_class *stream_class);
1534%rename("_bt_ctf_stream_class_set_id") bt_ctf_stream_class_set_id(struct bt_ctf_stream_class *stream_class, uint32_t id);
ec8c88d7 1535%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);
f6c2aa83
JG
1536%rename("_bt_ctf_stream_class_get_event_class_count") bt_ctf_stream_class_get_event_class_count(struct bt_ctf_stream_class *stream_class);
1537%rename("_bt_ctf_stream_class_get_event_class") bt_ctf_stream_class_get_event_class(struct bt_ctf_stream_class *stream_class, size_t index);
1538%rename("_bt_ctf_stream_class_get_event_class_by_name") bt_ctf_stream_class_get_event_class_by_name(struct bt_ctf_stream_class *stream_class, const char *name);
7df927c7
JG
1539%rename("_bt_ctf_stream_class_get_packet_context_type") bt_ctf_stream_class_get_packet_context_type(struct bt_ctf_stream_class *stream_class);
1540%rename("_bt_ctf_stream_class_set_packet_context_type") bt_ctf_stream_class_set_packet_context_type(struct bt_ctf_stream_class *stream_class, struct bt_ctf_field_type *packet_context_type);
ec8c88d7
JG
1541%rename("_bt_ctf_stream_class_get") bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
1542%rename("_bt_ctf_stream_class_put") bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
708e628a 1543%rename("_bt_ctf_stream_get_discarded_events_count") bt_ctf_stream_get_discarded_events_count(struct bt_ctf_stream *stream, uint64_t *count);
ec8c88d7
JG
1544%rename("_bt_ctf_stream_append_discarded_events") bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count);
1545%rename("_bt_ctf_stream_append_event") bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event);
7df927c7
JG
1546%rename("_bt_ctf_stream_get_packet_context") bt_ctf_stream_get_packet_context(struct bt_ctf_stream *stream);
1547%rename("_bt_ctf_stream_set_packet_context") bt_ctf_stream_set_packet_context(struct bt_ctf_stream *stream, struct bt_ctf_field *packet_context);
ec8c88d7
JG
1548%rename("_bt_ctf_stream_flush") bt_ctf_stream_flush(struct bt_ctf_stream *stream);
1549%rename("_bt_ctf_stream_get") bt_ctf_stream_get(struct bt_ctf_stream *stream);
1550%rename("_bt_ctf_stream_put") bt_ctf_stream_put(struct bt_ctf_stream *stream);
1551
1552struct bt_ctf_stream_class *bt_ctf_stream_class_create(const char *name);
f6c2aa83
JG
1553const char *bt_ctf_stream_class_get_name(struct bt_ctf_stream_class *stream_class);
1554struct bt_ctf_clock *bt_ctf_stream_class_get_clock(struct bt_ctf_stream_class *stream_class);
ec8c88d7 1555int bt_ctf_stream_class_set_clock(struct bt_ctf_stream_class *stream_class, struct bt_ctf_clock *clock);
f6c2aa83
JG
1556int64_t bt_ctf_stream_class_get_id(struct bt_ctf_stream_class *stream_class);
1557int bt_ctf_stream_class_set_id(struct bt_ctf_stream_class *stream_class, uint32_t id);
ec8c88d7 1558int bt_ctf_stream_class_add_event_class(struct bt_ctf_stream_class *stream_class, struct bt_ctf_event_class *event_class);
f6c2aa83
JG
1559int64_t bt_ctf_stream_class_get_event_class_count(struct bt_ctf_stream_class *stream_class);
1560struct bt_ctf_event_class *bt_ctf_stream_class_get_event_class(struct bt_ctf_stream_class *stream_class, size_t index);
1561struct bt_ctf_event_class *bt_ctf_stream_class_get_event_class_by_name(struct bt_ctf_stream_class *stream_class, const char *name);
7df927c7
JG
1562struct bt_ctf_field_type *bt_ctf_stream_class_get_packet_context_type(struct bt_ctf_stream_class *stream_class);
1563int bt_ctf_stream_class_set_packet_context_type(struct bt_ctf_stream_class *stream_class, struct bt_ctf_field_type *packet_context_type);
ec8c88d7
JG
1564void bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
1565void bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
708e628a 1566int bt_ctf_stream_get_discarded_events_count(struct bt_ctf_stream *stream, uint64_t *OUTPUT);
ec8c88d7
JG
1567void bt_ctf_stream_append_discarded_events(struct bt_ctf_stream *stream, uint64_t event_count);
1568int bt_ctf_stream_append_event(struct bt_ctf_stream *stream, struct bt_ctf_event *event);
7df927c7
JG
1569struct bt_ctf_field *bt_ctf_stream_get_packet_context(struct bt_ctf_stream *stream);
1570int bt_ctf_stream_set_packet_context(struct bt_ctf_stream *stream, struct bt_ctf_field *packet_context);
ec8c88d7
JG
1571int bt_ctf_stream_flush(struct bt_ctf_stream *stream);
1572void bt_ctf_stream_get(struct bt_ctf_stream *stream);
1573void bt_ctf_stream_put(struct bt_ctf_stream *stream);
1574
1575/* =================================================================
1576 WRITER.H
1577 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
1578*/
1579%rename("_bt_ctf_writer_create") bt_ctf_writer_create(const char *path);
1580%rename("_bt_ctf_writer_create_stream") bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class);
1581%rename("_bt_ctf_writer_add_environment_field") bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value);
1582%rename("_bt_ctf_writer_add_clock") bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock);
1583%newobject bt_ctf_writer_get_metadata_string;
1584%rename("_bt_ctf_writer_get_metadata_string") bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer);
1585%rename("_bt_ctf_writer_flush_metadata") bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer);
1586%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);
1587%rename("_bt_ctf_writer_get") bt_ctf_writer_get(struct bt_ctf_writer *writer);
1588%rename("_bt_ctf_writer_put") bt_ctf_writer_put(struct bt_ctf_writer *writer);
1589
1590struct bt_ctf_writer *bt_ctf_writer_create(const char *path);
1591struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class);
1592int bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value);
1593int bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock);
1594char *bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer);
1595void bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer);
1596int bt_ctf_writer_set_byte_order(struct bt_ctf_writer *writer, enum bt_ctf_byte_order byte_order);
1597void bt_ctf_writer_get(struct bt_ctf_writer *writer);
1598void bt_ctf_writer_put(struct bt_ctf_writer *writer);
1599
1600%pythoncode %{
da64442f 1601import uuid
ec8c88d7
JG
1602
1603class CTFWriter:
b0bb560c
JG
1604 # Used to compare to -1ULL in error checks
1605 _MAX_UINT64 = 0xFFFFFFFFFFFFFFFF
ec8c88d7 1606
b4b5e4b5
JG
1607 """
1608 Enumeration mapping class. start and end values are inclusive.
1609 """
1610 class EnumerationMapping:
1611 def __init__(self, name, start, end):
1612 self.name = name
1613 self.start = start
1614 self.end = end
1615
ec8c88d7
JG
1616 class Clock:
1617 def __init__(self, name):
1618 self._c = _bt_ctf_clock_create(name)
1619 if self._c is None:
1620 raise ValueError("Invalid clock name.")
1621
1622 def __del__(self):
1623 _bt_ctf_clock_put(self._c)
1624
14001277 1625 """
b0bb560c
JG
1626 Get the clock's name.
1627 """
1628 @property
1629 def name(self):
1630 name = _bt_ctf_clock_get_name(self._c)
1631 if name is None:
1632 raise ValueError("Invalid clock instance.")
1633 return name
1634
1635 """
1636 Get the clock's description. None if unset.
14001277
JG
1637 """
1638 @property
1639 def description(self):
b0bb560c 1640 return _bt_ctf_clock_get_description(self._c)
14001277 1641
ec8c88d7
JG
1642 """
1643 Set the clock's description. The description appears in the clock's TSDL
1644 meta-data.
1645 """
14001277
JG
1646 @description.setter
1647 def description(self, desc):
1648 ret = _bt_ctf_clock_set_description(self._c, str(desc))
ec8c88d7
JG
1649 if ret < 0:
1650 raise ValueError("Invalid clock description.")
1651
14001277
JG
1652 """
1653 Get the clock's frequency (Hz).
1654 """
1655 @property
1656 def frequency(self):
b0bb560c
JG
1657 freq = _bt_ctf_clock_get_frequency(self._c)
1658 if freq == CTFWriter._MAX_UINT64:
1659 raise ValueError("Invalid clock instance")
1660 return freq
14001277 1661
ec8c88d7
JG
1662 """
1663 Set the clock's frequency (Hz).
1664 """
14001277
JG
1665 @frequency.setter
1666 def frequency(self, freq):
ec8c88d7
JG
1667 ret = _bt_ctf_clock_set_frequency(self._c, freq)
1668 if ret < 0:
1669 raise ValueError("Invalid frequency value.")
1670
14001277
JG
1671 """
1672 Get the clock's precision (in clock ticks).
1673 """
1674 @property
1675 def precision(self):
b0bb560c
JG
1676 precision = _bt_ctf_clock_get_precision(self._c)
1677 if precision == CTFWriter._MAX_UINT64:
1678 raise ValueError("Invalid clock instance")
1679 return precision
14001277 1680
ec8c88d7
JG
1681 """
1682 Set the clock's precision (in clock ticks).
1683 """
14001277
JG
1684 @precision.setter
1685 def precision(self, precision):
ec8c88d7
JG
1686 ret = _bt_ctf_clock_set_precision(self._c, precision)
1687
14001277
JG
1688 """
1689 Get the clock's offset in seconds from POSIX.1 Epoch.
1690 """
1691 @property
1692 def offset_seconds(self):
b0bb560c
JG
1693 offset_s = _bt_ctf_clock_get_offset_s(self._c)
1694 if offset_s == CTFWriter._MAX_UINT64:
1695 raise ValueError("Invalid clock instance")
1696 return offset_s
14001277 1697
ec8c88d7
JG
1698 """
1699 Set the clock's offset in seconds from POSIX.1 Epoch.
1700 """
14001277
JG
1701 @offset_seconds.setter
1702 def offset_seconds(self, offset_s):
ec8c88d7
JG
1703 ret = _bt_ctf_clock_set_offset_s(self._c, offset_s)
1704 if ret < 0:
1705 raise ValueError("Invalid offset value.")
1706
14001277
JG
1707 """
1708 Get the clock's offset in ticks from POSIX.1 Epoch + offset in seconds.
1709 """
1710 @property
1711 def offset(self):
b0bb560c
JG
1712 offset = _bt_ctf_clock_get_offset(self._c)
1713 if offset == CTFWriter._MAX_UINT64:
1714 raise ValueError("Invalid clock instance")
1715 return offset
14001277 1716
ec8c88d7
JG
1717 """
1718 Set the clock's offset in ticks from POSIX.1 Epoch + offset in seconds.
1719 """
14001277
JG
1720 @offset.setter
1721 def offset(self, offset):
ec8c88d7
JG
1722 ret = _bt_ctf_clock_set_offset(self._c, offset)
1723 if ret < 0:
1724 raise ValueError("Invalid offset value.")
1725
14001277
JG
1726 """
1727 Get a clock's absolute attribute. A clock is absolute if the clock
1728 is a global reference across the trace's other clocks.
1729 """
1730 @property
1731 def absolute(self):
b0bb560c
JG
1732 is_absolute = _bt_ctf_clock_get_is_absolute(self._c)
1733 if is_absolute == -1:
1734 raise ValueError("Invalid clock instance")
1735 return False if is_absolute == 0 else True
14001277 1736
ec8c88d7
JG
1737 """
1738 Set a clock's absolute attribute. A clock is absolute if the clock
1739 is a global reference across the trace's other clocks.
1740 """
14001277
JG
1741 @absolute.setter
1742 def absolute(self, is_absolute):
1743 ret = _bt_ctf_clock_set_is_absolute(self._c, int(is_absolute))
ec8c88d7
JG
1744 if ret < 0:
1745 raise ValueError("Could not set the clock's absolute attribute.")
1746
da64442f
JG
1747 """
1748 Get a clock's UUID (an object of type UUID).
1749 """
1750 @property
1751 def uuid(self):
1752 uuid_list = []
1753 for i in range(16):
1754 ret, value = _bt_python_ctf_clock_get_uuid_index(self._c, i)
1755 if ret < 0:
1756 raise ValueError("Invalid clock instance")
1757 uuid_list.append(value)
1758 return uuid.UUID(bytes=bytes(uuid_list))
1759
1760 """
1761 Set a clock's UUID (an object of type UUID).
1762 """
1763 @uuid.setter
1764 def uuid(self, uuid):
1765 uuid_bytes = uuid.bytes
1766 if len(uuid_bytes) != 16:
1767 raise ValueError("Invalid UUID provided. UUID length must be 16 bytes")
1768 for i in range(len(uuid_bytes)):
1769 ret = _bt_python_ctf_clock_set_uuid_index(self._c, i, uuid_bytes[i])
1770 if ret < 0:
1771 raise ValueError("Invalid clock instance")
1772
14001277
JG
1773 """
1774 Get the current time in nanoseconds since the clock's origin (offset and
1775 offset_s attributes).
1776 """
1777 @property
1778 def time(self):
b0bb560c
JG
1779 time = _bt_ctf_clock_get_time(self._c)
1780 if time == CTFWriter._MAX_UINT64:
1781 raise ValueError("Invalid clock instance")
1782 return time
14001277 1783
ec8c88d7
JG
1784 """
1785 Set the current time in nanoseconds since the clock's origin (offset and
1786 offset_s attributes). The clock's value will be sampled as events are
1787 appended to a stream.
1788 """
14001277
JG
1789 @time.setter
1790 def time(self, time):
ec8c88d7
JG
1791 ret = _bt_ctf_clock_set_time(self._c, time)
1792 if ret < 0:
1793 raise ValueError("Invalid time value.")
1794
14001277 1795 class FieldDeclaration:
ec8c88d7 1796 """
b4b5e4b5 1797 FieldDeclaration should not be instantiated directly. Instantiate
14001277 1798 one of the concrete FieldDeclaration classes.
ec8c88d7
JG
1799 """
1800 class IntegerBase:
1801 # These values are based on the bt_ctf_integer_base enum
1802 # declared in event-types.h.
1803 INTEGER_BASE_UNKNOWN = -1
1804 INTEGER_BASE_BINARY = 2
1805 INTEGER_BASE_OCTAL = 8
1806 INTEGER_BASE_DECIMAL = 10
1807 INTEGER_BASE_HEXADECIMAL = 16
1808
1809 def __init__(self):
1810 if self._ft is None:
14001277 1811 raise ValueError("FieldDeclaration creation failed.")
ec8c88d7
JG
1812
1813 def __del__(self):
1814 _bt_ctf_field_type_put(self._ft)
1815
b4b5e4b5
JG
1816 @staticmethod
1817 def _create_field_declaration_from_native_instance(native_field_declaration):
1818 type_dict = {
1819 CTFTypeId.INTEGER : CTFWriter.IntegerFieldDeclaration,
1820 CTFTypeId.FLOAT : CTFWriter.FloatFieldDeclaration,
1821 CTFTypeId.ENUM : CTFWriter.EnumerationFieldDeclaration,
1822 CTFTypeId.STRING : CTFWriter.StringFieldDeclaration,
1823 CTFTypeId.STRUCT : CTFWriter.StructureFieldDeclaration,
1824 CTFTypeId.VARIANT : CTFWriter.VariantFieldDeclaration,
1825 CTFTypeId.ARRAY : CTFWriter.ArrayFieldDeclaration,
1826 CTFTypeId.SEQUENCE : CTFWriter.SequenceFieldDeclaration
1827 }
1828
1829 field_type_id = _bt_ctf_field_type_get_type_id(native_field_declaration)
1830 if field_type_id == CTFTypeId.UNKNOWN:
1831 raise TypeError("Invalid field instance")
1832
1833 declaration = CTFWriter.Field.__new__(CTFWriter.Field)
1834 declaration._ft = native_field_declaration
1835 declaration.__class__ = type_dict[field_type_id]
1836 return declaration
1837
14001277 1838 """
b4b5e4b5 1839 Get the field declaration's alignment. Returns -1 on error.
14001277
JG
1840 """
1841 @property
1842 def alignment(self):
b4b5e4b5 1843 return _bt_ctf_field_type_get_alignment(self._ft)
14001277 1844
ec8c88d7 1845 """
b4b5e4b5 1846 Set the field declaration's alignment. Defaults to 1 (bit-aligned). However,
ec8c88d7
JG
1847 some types, such as structures and string, may impose other alignment
1848 constraints.
1849 """
14001277
JG
1850 @alignment.setter
1851 def alignment(self, alignment):
ec8c88d7
JG
1852 ret = _bt_ctf_field_type_set_alignment(self._ft, alignment)
1853 if ret < 0:
1854 raise ValueError("Invalid alignment value.")
1855
14001277 1856 """
b4b5e4b5 1857 Get the field declaration's byte order. One of the ByteOrder's constant.
14001277
JG
1858 """
1859 @property
1860 def byte_order(self):
b4b5e4b5 1861 return _bt_ctf_field_type_get_byte_order(self._ft)
14001277 1862
ec8c88d7 1863 """
b4b5e4b5 1864 Set the field declaration's byte order. Use constants defined in the ByteOrder
ec8c88d7
JG
1865 class.
1866 """
14001277
JG
1867 @byte_order.setter
1868 def byte_order(self, byte_order):
ec8c88d7
JG
1869 ret = _bt_ctf_field_type_set_byte_order(self._ft, byte_order)
1870 if ret < 0:
1871 raise ValueError("Could not set byte order value.")
1872
14001277 1873 class IntegerFieldDeclaration(FieldDeclaration):
ec8c88d7 1874 """
b4b5e4b5 1875 Create a new integer field declaration of the given size.
ec8c88d7
JG
1876 """
1877 def __init__(self, size):
1878 self._ft = _bt_ctf_field_type_integer_create(size)
1879 super().__init__()
1880
b4b5e4b5
JG
1881 """
1882 Get an integer's size.
1883 """
1884 @property
1885 def size(self):
1886 ret = _bt_ctf_field_type_integer_get_size(self._ft)
1887 if ret < 0:
1888 raise ValueError("Could not get Integer's size attribute.")
1889 else:
1890 return ret
1891
ec8c88d7 1892 """
14001277
JG
1893 Get an integer's signedness attribute.
1894 """
1895 @property
1896 def signed(self):
b4b5e4b5
JG
1897 ret = _bt_ctf_field_type_integer_get_signed(self._ft)
1898 if ret < 0:
1899 raise ValueError("Could not get Integer's signed attribute.")
1900 elif ret > 0:
1901 return True
1902 else:
1903 return False
14001277
JG
1904
1905 """
1906 Set an integer's signedness attribute.
ec8c88d7 1907 """
14001277
JG
1908 @signed.setter
1909 def signed(self, signed):
ec8c88d7
JG
1910 ret = _bt_ctf_field_type_integer_set_signed(self._ft, signed)
1911 if ret < 0:
b4b5e4b5 1912 raise ValueError("Could not set Integer's signed attribute.")
ec8c88d7
JG
1913
1914 """
14001277 1915 Get the integer's base used to pretty-print the resulting trace.
b4b5e4b5 1916 Returns a constant from the FieldDeclaration.IntegerBase class.
14001277
JG
1917 """
1918 @property
1919 def base(self):
b4b5e4b5 1920 return _bt_ctf_field_type_integer_get_base(self._ft)
14001277
JG
1921
1922 """
1923 Set the integer's base used to pretty-print the resulting trace.
b4b5e4b5 1924 The base must be a constant of the FieldDeclarationIntegerBase class.
ec8c88d7 1925 """
14001277
JG
1926 @base.setter
1927 def base(self, base):
ec8c88d7
JG
1928 ret = _bt_ctf_field_type_integer_set_base(self._ft, base)
1929 if ret < 0:
b4b5e4b5 1930 raise ValueError("Could not set Integer's base.")
ec8c88d7 1931
14001277
JG
1932 """
1933 Get the integer's encoding (one of the constants of the
1934 CTFStringEncoding class).
b4b5e4b5 1935 Returns a constant from the CTFStringEncoding class.
14001277
JG
1936 """
1937 @property
1938 def encoding(self):
b4b5e4b5 1939 return _bt_ctf_field_type_integer_get_encoding(self._ft)
14001277 1940
ec8c88d7
JG
1941 """
1942 An integer encoding may be set to signal that the integer must be printed
1943 as a text character. Must be a constant from the CTFStringEncoding class.
1944 """
14001277
JG
1945 @encoding.setter
1946 def encoding(self, encoding):
ec8c88d7
JG
1947 ret = _bt_ctf_field_type_integer_set_encoding(self._ft, encoding)
1948 if ret < 0:
b4b5e4b5 1949 raise ValueError("Could not set Integer's encoding.")
ec8c88d7 1950
14001277 1951 class EnumerationFieldDeclaration(FieldDeclaration):
ec8c88d7 1952 """
b4b5e4b5 1953 Create a new enumeration field declaration with the given underlying container type.
ec8c88d7
JG
1954 """
1955 def __init__(self, integer_type):
14001277 1956 if integer_type is None or not isinstance(integer_type, CTFWriter.IntegerFieldDeclaration):
ec8c88d7
JG
1957 raise TypeError("Invalid integer container.")
1958
1959 self._ft = _bt_ctf_field_type_enumeration_create(integer_type._ft)
1960 super().__init__()
1961
b4b5e4b5
JG
1962 """
1963 Get the enumeration's underlying container type.
1964 """
1965 @property
1966 def container(self):
1967 ret = _bt_ctf_field_type_enumeration_get_container_type(self._ft)
1968 if ret is None:
1969 raise TypeError("Invalid enumeration declaration")
1970 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(ret)
1971
ec8c88d7
JG
1972 """
1973 Add a mapping to the enumeration. The range's values are inclusive.
1974 """
1975 def add_mapping(self, name, range_start, range_end):
b4b5e4b5
JG
1976 if range_start < 0 or range_end < 0:
1977 ret = _bt_ctf_field_type_enumeration_add_mapping(self._ft, str(name), range_start, range_end)
1978 else:
1979 ret = _bt_ctf_field_type_enumeration_add_mapping_unsigned(self._ft, str(name), range_start, range_end)
1980
ec8c88d7 1981 if ret < 0:
b4b5e4b5
JG
1982 raise ValueError("Could not add mapping to enumeration declaration.")
1983
1984 """
1985 Generator returning instances of EnumerationMapping.
1986 """
1987 @property
1988 def mappings(self):
1989 signed = self.container.signed
1990
1991 count = _bt_ctf_field_type_enumeration_get_mapping_count(self._ft)
1992 for i in range(count):
1993 if signed:
1994 ret = _bt_python_ctf_field_type_enumeration_get_mapping(self._ft, i)
1995 else:
1996 ret = _bt_python_ctf_field_type_enumeration_get_mapping_unsigned(self._ft, i)
1997
1998 if len(ret) != 3:
1999 raise TypeError("Could not get Enumeration mapping at index {}".format(i))
2000 name, range_start, range_end = ret
2001 yield CTFWriter.EnumerationMapping(name, range_start, range_end)
2002
2003 """
2004 Get a mapping by name (EnumerationMapping).
2005 """
2006 def get_mapping_by_name(self, name):
2007 ret, index = _bt_ctf_field_type_enumeration_get_mapping_index_by_name(self._ft, name);
2008 if ret < 0:
2009 return None
2010
2011 if self.container.signed:
2012 ret = _bt_python_ctf_field_type_enumeration_get_mapping(self._ft, index)
2013 else:
2014 ret = _bt_python_ctf_field_type_enumeration_get_mapping_unsigned(self._ft, index)
2015
2016 if len(ret) != 3:
2017 raise TypeError("Could not get Enumeration mapping at index {}".format(i))
2018 name, range_start, range_end = ret
2019 return CTFWriter.EnumerationMapping(name, range_start, range_end)
2020
2021 """
2022 Get a mapping by value (EnumerationMapping).
2023 """
2024 def get_mapping_by_value(self, value):
2025 if value < 0:
2026 ret, index = _bt_ctf_field_type_enumeration_get_mapping_index_by_value(self._ft, value);
2027 else:
2028 ret, index = _bt_ctf_field_type_enumeration_get_mapping_index_by_unsigned_value(self._ft, value);
2029
2030 if ret < 0:
2031 return None
2032
2033 if self.container.signed:
2034 ret = _bt_python_ctf_field_type_enumeration_get_mapping(self._ft, index)
2035 else:
2036 ret = _bt_python_ctf_field_type_enumeration_get_mapping_unsigned(self._ft, index)
2037
2038 if len(ret) != 3:
2039 raise TypeError("Could not get Enumeration mapping at index {}".format(i))
2040 name, range_start, range_end = ret
2041 return CTFWriter.EnumerationMapping(name, range_start, range_end)
ec8c88d7 2042
14001277 2043 class FloatFieldDeclaration(FieldDeclaration):
ec8c88d7
JG
2044 FLT_EXP_DIG = 8
2045 DBL_EXP_DIG = 11
2046 FLT_MANT_DIG = 24
2047 DBL_MANT_DIG = 53
2048
2049 """
b4b5e4b5 2050 Create a new floating point field declaration.
ec8c88d7
JG
2051 """
2052 def __init__(self):
2053 self._ft = _bt_ctf_field_type_floating_point_create()
2054 super().__init__()
2055
2056 """
b4b5e4b5 2057 Get the number of exponent digits used to store the floating point field.
14001277
JG
2058 """
2059 @property
2060 def exponent_digits(self):
b4b5e4b5
JG
2061 ret = _bt_ctf_field_type_floating_point_get_exponent_digits(self._ft)
2062 if ret < 0:
2063 raise TypeError("Could not get Floating point exponent digit count")
2064 return ret
14001277
JG
2065
2066 """
2067 Set the number of exponent digits to use to store the floating point field.
ec8c88d7
JG
2068 The only values currently supported are FLT_EXP_DIG and DBL_EXP_DIG which
2069 are defined as constants of this class.
2070 """
14001277
JG
2071 @exponent_digits.setter
2072 def exponent_digits(self, exponent_digits):
ec8c88d7
JG
2073 ret = _bt_ctf_field_type_floating_point_set_exponent_digits(self._ft, exponent_digits)
2074 if ret < 0:
2075 raise ValueError("Could not set exponent digit count.")
2076
2077 """
b4b5e4b5 2078 Get the number of mantissa digits used to store the floating point field.
14001277
JG
2079 """
2080 @property
2081 def mantissa_digits(self):
b4b5e4b5
JG
2082 ret = _bt_ctf_field_type_floating_point_get_mantissa_digits(self._ft)
2083 if ret < 0:
2084 raise TypeError("Could not get Floating point mantissa digit count")
2085 return ret
14001277
JG
2086
2087 """
2088 Set the number of mantissa digits to use to store the floating point field.
ec8c88d7
JG
2089 The only values currently supported are FLT_MANT_DIG and DBL_MANT_DIG which
2090 are defined as constants of this class.
2091 """
14001277
JG
2092 @mantissa_digits.setter
2093 def mantissa_digits(self, mantissa_digits):
ec8c88d7
JG
2094 ret = _bt_ctf_field_type_floating_point_set_mantissa_digits(self._ft, mantissa_digits)
2095 if ret < 0:
2096 raise ValueError("Could not set mantissa digit count.")
2097
14001277 2098 class StructureFieldDeclaration(FieldDeclaration):
ec8c88d7 2099 """
b4b5e4b5 2100 Create a new structure field declaration.
ec8c88d7
JG
2101 """
2102 def __init__(self):
2103 self._ft = _bt_ctf_field_type_structure_create()
2104 super().__init__()
2105
2106 """
2107 Add a field of type "field_type" to the structure.
2108 """
2109 def add_field(self, field_type, field_name):
14001277 2110 ret = _bt_ctf_field_type_structure_add_field(self._ft, field_type._ft, str(field_name))
ec8c88d7
JG
2111 if ret < 0:
2112 raise ValueError("Could not add field to structure.")
2113
b4b5e4b5
JG
2114 """
2115 Generator returning the structure's field as tuples of (field name, field declaration).
2116 """
2117 @property
2118 def fields(self):
2119 count = _bt_ctf_field_type_structure_get_field_count(self._ft)
2120 if count < 0:
2121 raise TypeError("Could not get Structure field count")
2122
2123 for i in range(count):
2124 field_name = _bt_python_ctf_field_type_structure_get_field_name(self._ft, i)
2125 if field_name is None:
2126 raise TypeError("Could not get Structure field name at index {}".format(i))
2127
2128 field_type_native = _bt_python_ctf_field_type_structure_get_field_type(self._ft, i)
2129 if field_type_native is None:
2130 raise TypeError("Could not get Structure field type at index {}".format(i))
2131
2132 field_type = CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2133 yield (field_name, field_type)
2134
2135 """
2136 Get a field declaration by name (FieldDeclaration).
2137 """
2138 def get_field_by_name(self, name):
2139 field_type_native = _bt_ctf_field_type_structure_get_field_type_by_name(self._ft, name)
2140 if field_type_native is None:
2141 raise TypeError("Could not find Structure field with name {}".format(name))
2142
2143 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2144
14001277 2145 class VariantFieldDeclaration(FieldDeclaration):
ec8c88d7 2146 """
b4b5e4b5 2147 Create a new variant field declaration.
ec8c88d7
JG
2148 """
2149 def __init__(self, enum_tag, tag_name):
14001277
JG
2150 if enum_tag is None or not isinstance(enum_tag, CTFWriter.EnumerationFieldDeclaration):
2151 raise TypeError("Invalid tag type; must be of type EnumerationFieldDeclaration.")
ec8c88d7 2152
14001277 2153 self._ft = _bt_ctf_field_type_variant_create(enum_tag._ft, str(tag_name))
ec8c88d7
JG
2154 super().__init__()
2155
b4b5e4b5
JG
2156 """
2157 Get the variant's tag name.
2158 """
2159 @property
2160 def tag_name(self):
2161 ret = _bt_ctf_field_type_variant_get_tag_name(self._ft)
2162 if ret is None:
2163 raise TypeError("Could not get Variant tag name")
2164 return ret
2165
2166 """
2167 Get the variant's tag type.
2168 """
2169 @property
2170 def tag_type(self):
2171 ret = _bt_ctf_field_type_variant_get_tag_type(self._ft)
2172 if ret is None:
2173 raise TypeError("Could not get Variant tag type")
2174 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(ret)
2175
ec8c88d7
JG
2176 """
2177 Add a field of type "field_type" to the variant.
2178 """
2179 def add_field(self, field_type, field_name):
14001277 2180 ret = _bt_ctf_field_type_variant_add_field(self._ft, field_type._ft, str(field_name))
ec8c88d7
JG
2181 if ret < 0:
2182 raise ValueError("Could not add field to variant.")
2183
b4b5e4b5
JG
2184 """
2185 Generator returning the variant's field as tuples of (field name, field declaration).
2186 """
2187 @property
2188 def fields(self):
2189 count = _bt_ctf_field_type_variant_get_field_count(self._ft)
2190 if count < 0:
2191 raise TypeError("Could not get Variant field count")
2192
2193 for i in range(count):
2194 field_name = _bt_python_ctf_field_type_variant_get_field_name(self._ft, i)
2195 if field_name is None:
2196 raise TypeError("Could not get Variant field name at index {}".format(i))
2197
2198 field_type_native = _bt_python_ctf_field_type_variant_get_field_type(self._ft, i)
2199 if field_type_native is None:
2200 raise TypeError("Could not get Variant field type at index {}".format(i))
2201
2202 field_type = CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2203 yield (field_name, field_type)
2204
2205 """
2206 Get a field declaration by name (FieldDeclaration).
2207 """
2208 def get_field_by_name(self, name):
2209 field_type_native = _bt_ctf_field_type_variant_get_field_type_by_name(self._ft, name)
2210 if field_type_native is None:
2211 raise TypeError("Could not find Variant field with name {}".format(name))
2212
2213 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2214
2215 """
2216 Get a field declaration from tag (EnumerationField).
2217 """
2218 def get_field_from_tag(self, tag):
2219 field_type_native = _bt_ctf_field_type_variant_get_field_type_from_tag(self._ft, tag._f)
2220 if field_type_native is None:
2221 raise TypeError("Could not find Variant field with tag value {}".format(tag.value))
2222
2223 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2224
14001277 2225 class ArrayFieldDeclaration(FieldDeclaration):
ec8c88d7 2226 """
b4b5e4b5 2227 Create a new array field declaration.
ec8c88d7
JG
2228 """
2229 def __init__(self, element_type, length):
2230 self._ft = _bt_ctf_field_type_array_create(element_type._ft, length)
2231 super().__init__()
2232
b4b5e4b5
JG
2233 """
2234 Get the array's element type.
2235 """
2236 @property
2237 def element_type(self):
2238 ret = _bt_ctf_field_type_array_get_element_type(self._ft)
2239 if ret is None:
2240 raise TypeError("Could not get Array element type")
2241 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(ret)
2242
2243 """
2244 Get the array's length.
2245 """
2246 @property
2247 def length(self):
2248 ret = _bt_ctf_field_type_array_get_length(self._ft)
2249 if ret < 0:
2250 raise TypeError("Could not get Array length")
2251 return ret
2252
14001277 2253 class SequenceFieldDeclaration(FieldDeclaration):
ec8c88d7 2254 """
b4b5e4b5 2255 Create a new sequence field declaration.
ec8c88d7
JG
2256 """
2257 def __init__(self, element_type, length_field_name):
14001277 2258 self._ft = _bt_ctf_field_type_sequence_create(element_type._ft, str(length_field_name))
ec8c88d7
JG
2259 super().__init__()
2260
b4b5e4b5
JG
2261 """
2262 Get the sequence's element type.
2263 """
2264 @property
2265 def element_type(self):
2266 ret = _bt_ctf_field_type_sequence_get_element_type(self._ft)
2267 if ret is None:
2268 raise TypeError("Could not get Sequence element type")
2269 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(ret)
2270
2271 """
2272 Get the sequence's length field name.
2273 """
2274 @property
2275 def length_field_name(self):
2276 ret = _bt_ctf_field_type_sequence_get_length_field_name(self._ft)
2277 if ret is None:
2278 raise TypeError("Could not get Sequence length field name")
2279 return ret
2280
14001277 2281 class StringFieldDeclaration(FieldDeclaration):
ec8c88d7 2282 """
b4b5e4b5 2283 Create a new string field declaration.
ec8c88d7
JG
2284 """
2285 def __init__(self):
2286 self._ft = _bt_ctf_field_type_string_create()
2287 super().__init__()
2288
14001277 2289 """
b4b5e4b5 2290 Get a string declaration's encoding (a constant from the CTFStringEncoding class).
14001277
JG
2291 """
2292 @property
2293 def encoding(self):
b4b5e4b5 2294 return _bt_ctf_field_type_string_get_encoding(self._ft)
14001277 2295
ec8c88d7 2296 """
b4b5e4b5 2297 Set a string declaration's encoding. Must be a constant from the CTFStringEncoding class.
ec8c88d7 2298 """
14001277
JG
2299 @encoding.setter
2300 def encoding(self, encoding):
ec8c88d7
JG
2301 ret = _bt_ctf_field_type_string_set_encoding(self._ft, encoding)
2302 if ret < 0:
2303 raise ValueError("Could not set string encoding.")
2304
2305 """
2306 Create an instance of a field.
2307 """
2308 @staticmethod
b4b5e4b5 2309 def create_field(field_type):
14001277
JG
2310 if field_type is None or not isinstance(field_type, CTFWriter.FieldDeclaration):
2311 raise TypeError("Invalid field_type. Type must be a FieldDeclaration-derived class.")
2312
2313 if isinstance(field_type, CTFWriter.IntegerFieldDeclaration):
2314 return CTFWriter.IntegerField(field_type)
2315 elif isinstance(field_type, CTFWriter.EnumerationFieldDeclaration):
2316 return CTFWriter.EnumerationField(field_type)
2317 elif isinstance(field_type, CTFWriter.FloatFieldDeclaration):
2318 return CTFWriter.FloatFieldingPoint(field_type)
2319 elif isinstance(field_type, CTFWriter.StructureFieldDeclaration):
2320 return CTFWriter.StructureField(field_type)
2321 elif isinstance(field_type, CTFWriter.VariantFieldDeclaration):
2322 return CTFWriter.VariantField(field_type)
2323 elif isinstance(field_type, CTFWriter.ArrayFieldDeclaration):
2324 return CTFWriter.ArrayField(field_type)
2325 elif isinstance(field_type, CTFWriter.SequenceFieldDeclaration):
2326 return CTFWriter.SequenceField(field_type)
2327 elif isinstance(field_type, CTFWriter.StringFieldDeclaration):
2328 return CTFWriter.StringField(field_type)
ec8c88d7
JG
2329
2330 class Field:
2331 """
2332 Base class, do not instantiate.
2333 """
2334 def __init__(self, field_type):
14001277 2335 if not isinstance(field_type, CTFWriter.FieldDeclaration):
ec8c88d7
JG
2336 raise TypeError("Invalid field_type argument.")
2337
2338 self._f = _bt_ctf_field_create(field_type._ft)
2339 if self._f is None:
2340 raise ValueError("Field creation failed.")
2341
2342 def __del__(self):
2343 _bt_ctf_field_put(self._f)
2344
2345 @staticmethod
2346 def _create_field_from_native_instance(native_field_instance):
2347 type_dict = {
14001277
JG
2348 CTFTypeId.INTEGER : CTFWriter.IntegerField,
2349 CTFTypeId.FLOAT : CTFWriter.FloatFieldingPoint,
2350 CTFTypeId.ENUM : CTFWriter.EnumerationField,
2351 CTFTypeId.STRING : CTFWriter.StringField,
2352 CTFTypeId.STRUCT : CTFWriter.StructureField,
2353 CTFTypeId.VARIANT : CTFWriter.VariantField,
2354 CTFTypeId.ARRAY : CTFWriter.ArrayField,
2355 CTFTypeId.SEQUENCE : CTFWriter.SequenceField
ec8c88d7
JG
2356 }
2357
2358 field_type = _bt_python_get_field_type(native_field_instance)
2359 if field_type == CTFTypeId.UNKNOWN:
2360 raise TypeError("Invalid field instance")
2361
2362 field = CTFWriter.Field.__new__(CTFWriter.Field)
2363 field._f = native_field_instance
2364 field.__class__ = type_dict[field_type]
2365 return field
2366
b4b5e4b5
JG
2367 @property
2368 def declaration(self):
2369 native_field_type = _bt_ctf_field_get_type(self._f)
2370 if native_field_type is None:
2371 raise TypeError("Invalid field instance")
2372 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(native_field_type)
2373
14001277
JG
2374 class IntegerField(Field):
2375 """
2376 Get an integer field's value.
2377 """
2378 @property
2379 def value(self):
821ca76c
JG
2380 signedness = _bt_python_field_integer_get_signedness(self._f)
2381 if signedness < 0:
2382 raise TypeError("Invalid integer instance.")
2383
2384 if signedness == 0:
2385 ret, value = _bt_ctf_field_unsigned_integer_get_value(self._f)
2386 else:
2387 ret, value = _bt_ctf_field_signed_integer_get_value(self._f)
2388
2389 if ret < 0:
2390 raise ValueError("Could not get integer field value.")
2391 return value
14001277 2392
ec8c88d7
JG
2393 """
2394 Set an integer field's value.
2395 """
14001277
JG
2396 @value.setter
2397 def value(self, value):
821ca76c
JG
2398 if not isinstance(value, int):
2399 raise TypeError("IntegerField's value must be an int")
2400
ec8c88d7
JG
2401 signedness = _bt_python_field_integer_get_signedness(self._f)
2402 if signedness < 0:
2403 raise TypeError("Invalid integer instance.")
2404
2405 if signedness == 0:
2406 ret = _bt_ctf_field_unsigned_integer_set_value(self._f, value)
2407 else:
2408 ret = _bt_ctf_field_signed_integer_set_value(self._f, value)
2409
2410 if ret < 0:
2411 raise ValueError("Could not set integer field value.")
2412
14001277 2413 class EnumerationField(Field):
ec8c88d7
JG
2414 """
2415 Return the enumeration's underlying container field (an integer field).
2416 """
14001277
JG
2417 @property
2418 def container(self):
2419 container = CTFWriter.IntegerField.__new__(CTFWriter.IntegerField)
ec8c88d7
JG
2420 container._f = _bt_ctf_field_enumeration_get_container(self._f)
2421 if container._f is None:
2422 raise TypeError("Invalid enumeration field type.")
2423 return container
2424
821ca76c
JG
2425 """
2426 Get the enumeration field's mapping name.
2427 """
2428 @property
2429 def value(self):
2430 value = _bt_ctf_field_enumeration_get_mapping_name(self._f)
2431 if value is None:
2432 raise ValueError("Could not get enumeration's mapping name.")
2433 return value
2434
2435 """
2436 Set the enumeration field's value. Must be an integer as mapping names
2437 may be ambiguous.
2438 """
2439 @value.setter
2440 def value(self, value):
2441 if not isinstance(value, int):
2442 raise TypeError("EnumerationField value must be an int")
2443 self.container.value = value
2444
14001277
JG
2445 class FloatFieldingPoint(Field):
2446 """
2447 Get a floating point field's value.
2448 """
2449 @property
2450 def value(self):
821ca76c
JG
2451 ret, value = _bt_ctf_field_floating_point_get_value(self._f)
2452 if ret < 0:
2453 raise ValueError("Could not get floating point field value.")
2454 return value
14001277 2455
ec8c88d7
JG
2456 """
2457 Set a floating point field's value.
2458 """
14001277
JG
2459 @value.setter
2460 def value(self, value):
821ca76c
JG
2461 if not isinstance(value, int) and not isinstance(value, float):
2462 raise TypeError("Value must be either a float or an int")
2463
14001277 2464 ret = _bt_ctf_field_floating_point_set_value(self._f, float(value))
ec8c88d7
JG
2465 if ret < 0:
2466 raise ValueError("Could not set floating point field value.")
2467
14001277 2468 class StructureField(Field):
ec8c88d7
JG
2469 """
2470 Get the structure's field corresponding to the provided field name.
2471 """
14001277
JG
2472 def field(self, field_name):
2473 native_instance = _bt_ctf_field_structure_get_field(self._f, str(field_name))
ec8c88d7
JG
2474 if native_instance is None:
2475 raise ValueError("Invalid field_name provided.")
2476 return CTFWriter.Field._create_field_from_native_instance(native_instance)
2477
14001277 2478 class VariantField(Field):
ec8c88d7
JG
2479 """
2480 Return the variant's selected field. The "tag" field is the selector enum field.
2481 """
14001277 2482 def field(self, tag):
ec8c88d7
JG
2483 native_instance = _bt_ctf_field_variant_get_field(self._f, tag._f)
2484 if native_instance is None:
2485 raise ValueError("Invalid tag provided.")
2486 return CTFWriter.Field._create_field_from_native_instance(native_instance)
2487
14001277 2488 class ArrayField(Field):
ec8c88d7
JG
2489 """
2490 Return the array's field at position "index".
2491 """
14001277 2492 def field(self, index):
ec8c88d7
JG
2493 native_instance = _bt_ctf_field_array_get_field(self._f, index)
2494 if native_instance is None:
2495 raise IndexError("Invalid index provided.")
2496 return CTFWriter.Field._create_field_from_native_instance(native_instance)
2497
14001277
JG
2498 class SequenceField(Field):
2499 """
2500 Get the sequence's length field (IntegerField).
2501 """
2502 @property
2503 def length(self):
821ca76c
JG
2504 native_instance = _bt_ctf_field_sequence_get_length(self._f)
2505 if native_instance is None:
2506 length = -1
2507 return CTFWriter.Field._create_field_from_native_instance(native_instance)
14001277 2508
ec8c88d7
JG
2509 """
2510 Set the sequence's length field (IntegerField).
2511 """
14001277
JG
2512 @length.setter
2513 def length(self, length_field):
8cea25b5 2514 if not isinstance(length_field, CTFWriter.IntegerField):
ec8c88d7 2515 raise TypeError("Invalid length field.")
b4b5e4b5
JG
2516 if length_field.declaration.signed:
2517 raise TypeError("Sequence field length must be unsigned")
8cea25b5 2518 ret = _bt_ctf_field_sequence_set_length(self._f, length_field._f)
ec8c88d7
JG
2519 if ret < 0:
2520 raise ValueError("Could not set sequence length.")
2521
2522 """
2523 Return the sequence's field at position "index".
2524 """
14001277 2525 def field(self, index):
ec8c88d7
JG
2526 native_instance = _bt_ctf_field_sequence_get_field(self._f, index)
2527 if native_instance is None:
2528 raise ValueError("Could not get sequence element at index.")
2529 return CTFWriter.Field._create_field_from_native_instance(native_instance)
2530
14001277
JG
2531 class StringField(Field):
2532 """
2533 Get a string field's value.
2534 """
2535 @property
2536 def value(self):
821ca76c 2537 return _bt_ctf_field_string_get_value(self._f)
14001277 2538
ec8c88d7
JG
2539 """
2540 Set a string field's value.
2541 """
14001277
JG
2542 @value.setter
2543 def value(self, value):
2544 ret = _bt_ctf_field_string_set_value(self._f, str(value))
ec8c88d7
JG
2545 if ret < 0:
2546 raise ValueError("Could not set string field value.")
2547
2548 class EventClass:
2549 """
2550 Create a new event class of the given name.
2551 """
2552 def __init__(self, name):
2553 self._ec = _bt_ctf_event_class_create(name)
2554 if self._ec is None:
2555 raise ValueError("Event class creation failed.")
2556
2557 def __del__(self):
2558 _bt_ctf_event_class_put(self._ec)
2559
2560 """
2561 Add a field of type "field_type" to the event class.
2562 """
2563 def add_field(self, field_type, field_name):
14001277 2564 ret = _bt_ctf_event_class_add_field(self._ec, field_type._ft, str(field_name))
ec8c88d7
JG
2565 if ret < 0:
2566 raise ValueError("Could not add field to event class.")
2567
38f28df6
JG
2568 """
2569 Get the event class' name.
2570 """
2571 @property
2572 def name(self):
2573 name = _bt_ctf_event_class_get_name(self._ec)
2574 if name is None:
2575 raise TypeError("Could not get EventClass name")
2576 return name
2577
2578 """
2579 Get the event class' id. Returns a negative value if unset.
2580 """
2581 @property
2582 def id(self):
2583 id = _bt_ctf_event_class_get_id(self._ec)
2584 if id < 0:
f6c2aa83 2585 raise TypeError("Could not get EventClass id")
38f28df6
JG
2586 return id
2587
2588 """
2589 Set the event class' id. Throws a TypeError if the event class
2590 is already registered to a stream class.
2591 """
2592 @id.setter
2593 def id(self, id):
2594 ret = _bt_ctf_event_class_set_id(self._ec, id)
2595 if ret < 0:
2596 raise TypeError("Can't change an Event Class's id after it has been assigned to a stream class")
2597
2598 """
2599 Get the event class' stream class. Returns None if unset.
2600 """
2601 @property
2602 def stream_class(self):
2603 stream_class_native = _bt_ctf_event_class_get_stream_class(self._ec)
2604 if stream_class_native is None:
2605 return None
2606 stream_class = CTFWriter.StreamClass.__new__(CTFWriter.StreamClass)
2607 stream_class._sc = stream_class_native
2608 return stream_class
2609
2610 """
2611 Generator returning the event class' fields as tuples of (field name, field declaration).
2612 """
2613 @property
2614 def fields(self):
2615 count = _bt_ctf_event_class_get_field_count(self._ec)
2616 if count < 0:
2617 raise TypeError("Could not get EventClass' field count")
2618
2619 for i in range(count):
2620 field_name = _bt_python_ctf_event_class_get_field_name(self._ec, i)
2621 if field_name is None:
2622 raise TypeError("Could not get EventClass' field name at index {}".format(i))
2623
2624 field_type_native = _bt_python_ctf_event_class_get_field_type(self._ec, i)
2625 if field_type_native is None:
2626 raise TypeError("Could not get EventClass' field type at index {}".format(i))
2627
2628 field_type = CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2629 yield (field_name, field_type)
2630
2631 """
2632 Get a field declaration by name (FieldDeclaration).
2633 """
2634 def get_field_by_name(self, name):
2635 field_type_native = _bt_ctf_event_class_get_field_by_name(self._ec, name)
2636 if field_type_native is None:
2637 raise TypeError("Could not find EventClass field with name {}".format(name))
2638 return CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2639
ec8c88d7
JG
2640 class Event:
2641 """
2642 Create a new event of the given event class.
2643 """
2644 def __init__(self, event_class):
2645 if not isinstance(event_class, CTFWriter.EventClass):
2646 raise TypeError("Invalid event_class argument.")
2647
2648 self._e = _bt_ctf_event_create(event_class._ec)
2649 if self._e is None:
2650 raise ValueError("Event creation failed.")
2651
2652 def __del__(self):
2653 _bt_ctf_event_put(self._e)
2654
2655 """
38f28df6 2656 Get the event's class.
ec8c88d7 2657 """
38f28df6
JG
2658 @property
2659 def event_class(self):
2660 event_class_native = _bt_ctf_event_get_class(self._e)
2661 if event_class_native is None:
2662 return None
2663 event_class = CTFWriter.EventClass.__new__(CTFWriter.EventClass)
2664 event_class._ec = event_class_native
2665 return event_class
2666
2667 """
2668 Get a clock from event. Returns None if the event's class
2669 is not registered to a stream class.
2670 """
2671 def clock(self):
2672 clock_instance = _bt_ctf_event_get_clock(self._e)
2673 if clock_instance is None:
2674 return None
2675 clock = CTFWriter.Clock.__new__(CTFWriter.Clock)
2676 clock._c = clock_instance
2677 return clock
ec8c88d7
JG
2678
2679 """
14001277 2680 Get a field from event.
ec8c88d7 2681 """
14001277
JG
2682 def payload(self, field_name):
2683 native_instance = _bt_ctf_event_get_payload(self._e, str(field_name))
ec8c88d7
JG
2684 if native_instance is None:
2685 raise ValueError("Could not get event payload.")
2686 return CTFWriter.Field._create_field_from_native_instance(native_instance)
2687
38f28df6
JG
2688 """
2689 Set a manually created field as an event's payload.
2690 """
2691 def set_payload(self, field_name, value_field):
2692 if not isinstance(value, CTFWriter.Field):
2693 raise TypeError("Invalid value type.")
2694 ret = _bt_ctf_event_set_payload(self._e, str(field_name), value_field._f)
2695 if ret < 0:
2696 raise ValueError("Could not set event field payload.")
2697
ec8c88d7
JG
2698 class StreamClass:
2699 """
2700 Create a new stream class of the given name.
2701 """
2702 def __init__(self, name):
2703 self._sc = _bt_ctf_stream_class_create(name)
2704 if self._sc is None:
2705 raise ValueError("Stream class creation failed.")
2706
2707 def __del__(self):
2708 _bt_ctf_stream_class_put(self._sc)
2709
f6c2aa83
JG
2710 """
2711 Get a stream class' name.
2712 """
2713 @property
2714 def name(self):
2715 name = _bt_ctf_stream_class_get_name(self._sc)
2716 if name is None:
2717 raise TypeError("Could not get StreamClass name")
2718 return name
2719
14001277
JG
2720 """
2721 Get a stream class' clock.
2722 """
2723 @property
2724 def clock(self):
f6c2aa83
JG
2725 clock_instance = _bt_ctf_stream_class_get_clock(self._sc)
2726 if clock_instance is None:
2727 return None
2728 clock = CTFWriter.Clock.__new__(CTFWriter.Clock)
2729 clock._c = clock_instance
2730 return clock
14001277 2731
ec8c88d7
JG
2732 """
2733 Assign a clock to a stream class.
2734 """
14001277
JG
2735 @clock.setter
2736 def clock(self, clock):
ec8c88d7
JG
2737 if not isinstance(clock, CTFWriter.Clock):
2738 raise TypeError("Invalid clock type.")
2739
2740 ret = _bt_ctf_stream_class_set_clock(self._sc, clock._c)
2741 if ret < 0:
2742 raise ValueError("Could not set stream class clock.")
2743
f6c2aa83
JG
2744 """
2745 Get a stream class' id.
2746 """
2747 @property
2748 def id(self):
2749 ret = _bt_ctf_stream_class_get_id(self._sc)
2750 if ret < 0:
2751 raise TypeError("Could not get StreamClass id")
2752 return ret
2753
2754 """
2755 Assign an id to a stream class.
2756 """
2757 @id.setter
2758 def id(self, id):
2759 ret = _bt_ctf_stream_class_set_id(self._sc, id)
2760 if ret < 0:
2761 raise TypeError("Could not set stream class id.")
2762
2763 """
2764 Generator returning the stream class' event classes.
2765 """
2766 @property
2767 def event_classes(self):
2768 count = _bt_ctf_stream_class_get_event_class_count(self._sc)
2769 if count < 0:
2770 raise TypeError("Could not get StreamClass' event class count")
2771
2772 for i in range(count):
2773 event_class_native = _bt_ctf_stream_class_get_event_class(self._sc, i)
2774 if event_class_native is None:
2775 raise TypeError("Could not get StreamClass' event class at index {}".format(i))
2776
2777 event_class = CTFWriter.EventClass.__new__(CTFWriter.EventClass)
2778 event_class._ec = event_class_native
2779 yield event_class
2780
ec8c88d7
JG
2781 """
2782 Add an event class to a stream class. New events can be added even after a
14001277 2783 stream has been instantiated and events have been appended. However, a stream
a5e4f94c
JG
2784 will not accept events of a class that has not been added to the stream
2785 class beforehand.
ec8c88d7
JG
2786 """
2787 def add_event_class(self, event_class):
2788 if not isinstance(event_class, CTFWriter.EventClass):
2789 raise TypeError("Invalid event_class type.")
2790
2791 ret = _bt_ctf_stream_class_add_event_class(self._sc, event_class._ec)
2792 if ret < 0:
2793 raise ValueError("Could not add event class.")
2794
7df927c7
JG
2795 """
2796 Get the StreamClass' packet context type (StructureFieldDeclaration)
2797 """
2798 @property
2799 def packet_context_type(self):
2800 field_type_native = _bt_ctf_stream_class_get_packet_context_type(self._sc)
2801 if field_type_native is None:
2802 raise ValueError("Invalid StreamClass")
2803 field_type = CTFWriter.FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
2804 return field_type
2805
2806 """
2807 Set a StreamClass' packet context type. Must be of type
2808 StructureFieldDeclaration.
2809 """
2810 @packet_context_type.setter
2811 def packet_context_type(self, field_type):
2812 if not isinstance(field_type, CTFWriter.StructureFieldDeclaration):
2813 raise TypeError("field_type argument must be of type StructureFieldDeclaration.")
2814 ret = _bt_ctf_stream_class_set_packet_context_type(self._sc, field_type._ft)
2815 if ret < 0:
2816 raise ValueError("Failed to set packet context type.")
2817
ec8c88d7
JG
2818 class Stream:
2819 """
2820 Create a stream of the given class.
2821 """
2822 def __init__(self, stream_class):
2823 if not isinstance(stream_class, CTFWriter.StreamClass):
2d221c9d 2824 raise TypeError("Invalid stream_class argument must be of type StreamClass.")
ec8c88d7
JG
2825
2826 self._s = _bt_ctf_stream_create(stream_class._sc)
2827 if self._s is None:
2828 raise ValueError("Stream creation failed.")
2829
2830 def __del__(self):
2831 _bt_ctf_stream_put(self._s)
2832
708e628a
JG
2833 """
2834 Get a stream's discarded event count.
2835 """
2836 @property
2837 def discarded_events(self):
2838 ret, count = _bt_ctf_stream_get_discarded_events_count(self._s)
2839 if ret < 0:
2840 raise ValueError("Could not get the stream's discarded events count")
2841 return count
2842
ec8c88d7
JG
2843 """
2844 Increase the current packet's discarded event count.
2845 """
2846 def append_discarded_events(self, event_count):
92757c30 2847 _bt_ctf_stream_append_discarded_events(self._s, event_count)
ec8c88d7
JG
2848
2849 """
2850 Append "event" to the stream's current packet. The stream's associated clock
2851 will be sampled during this call. The event shall not be modified after
2852 being appended to a stream.
2853 """
2854 def append_event(self, event):
2855 ret = _bt_ctf_stream_append_event(self._s, event._e)
2856 if ret < 0:
2857 raise ValueError("Could not append event to stream.")
2858
7df927c7
JG
2859 """
2860 Get a Stream's packet context field (a StructureField).
2861 """
2862 @property
2863 def packet_context(self):
2864 native_field = _bt_ctf_stream_get_packet_context(self._s)
2865 if native_field is None:
2866 raise ValueError("Invalid Stream.")
2867 return CTFWriter.Field._create_field_from_native_instance(native_field)
2868
2869 """
2870 Set a Stream's packet context field (must be a StructureField).
2871 """
2872 @packet_context.setter
2873 def packet_context(self, field):
2874 if not isinstance(field, CTFWriter.StructureField):
2875 raise TypeError("Argument field must be of type StructureField")
2876 ret = _bt_ctf_stream_set_packet_context(self._s, field._f)
2877 if ret < 0:
2878 raise ValueError("Invalid packet context field.")
2879
ec8c88d7
JG
2880 """
2881 The stream's current packet's events will be flushed to disk. Events
2882 subsequently appended to the stream will be added to a new packet.
2883 """
2884 def flush(self):
2885 ret = _bt_ctf_stream_flush(self._s)
2886 if ret < 0:
2887 raise ValueError("Could not flush stream.")
2888
2889 class Writer:
2890 """
2891 Create a new writer that will produce a trace in the given path.
2892 """
2893 def __init__(self, path):
2894 self._w = _bt_ctf_writer_create(path)
2895 if self._w is None:
2896 raise ValueError("Writer creation failed.")
2897
2898 def __del__(self):
2899 _bt_ctf_writer_put(self._w)
2900
2901 """
2902 Create a new stream instance and register it to the writer.
2903 """
2904 def create_stream(self, stream_class):
2905 if not isinstance(stream_class, CTFWriter.StreamClass):
2906 raise TypeError("Invalid stream_class type.")
2907
2908 stream = CTFWriter.Stream.__new__(CTFWriter.Stream)
2909 stream._s = _bt_ctf_writer_create_stream(self._w, stream_class._sc)
2910 return stream
2911
2912 """
2913 Add an environment field to the trace.
2914 """
2915 def add_environment_field(self, name, value):
14001277 2916 ret = _bt_ctf_writer_add_environment_field(self._w, str(name), str(value))
ec8c88d7
JG
2917 if ret < 0:
2918 raise ValueError("Could not add environment field to trace.")
2919
2920 """
2921 Add a clock to the trace. Clocks assigned to stream classes must be
2922 registered to the writer.
2923 """
2924 def add_clock(self, clock):
2925 ret = _bt_ctf_writer_add_clock(self._w, clock._c)
2926 if ret < 0:
2927 raise ValueError("Could not add clock to Writer.")
2928
2929 """
2930 Get the trace's TSDL meta-data.
2931 """
14001277
JG
2932 @property
2933 def metadata(self):
ec8c88d7
JG
2934 return _bt_ctf_writer_get_metadata_string(self._w)
2935
2936 """
2937 Flush the trace's metadata to the metadata file.
2938 """
2939 def flush_metadata(self):
2940 _bt_ctf_writer_flush_metadata(self._w)
2941
14001277
JG
2942 """
2943 Get the trace's byte order. Must be a constant from the ByteOrder
2944 class.
2945 """
2946 @property
2947 def byte_order(self):
2948 raise NotImplementedError("Getter not implemented.")
2949
ec8c88d7
JG
2950 """
2951 Set the trace's byte order. Must be a constant from the ByteOrder
2952 class. Defaults to BYTE_ORDER_NATIVE, the host machine's endianness.
2953 """
14001277
JG
2954 @byte_order.setter
2955 def byte_order(self, byte_order):
ec8c88d7
JG
2956 ret = _bt_ctf_writer_set_byte_order(self._w, byte_order)
2957 if ret < 0:
2958 raise ValueError("Could not set trace's byte order.")
2959
2960%}
This page took 0.168805 seconds and 4 git commands to generate.