Support getting the value of enums
[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>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 */
20
21
22%define DOCSTRING
23"BABELTRACE_VERSION_STR
24
25Babeltrace is a trace viewer and converter reading and writing the
26Common Trace Format (CTF). Its main use is to pretty-print CTF
27traces into a human-readable text output.
28
29To use this module, the first step is to create a Context and add a
30trace to it."
31%enddef
32
33%module(docstring=DOCSTRING) babeltrace
34
35%include "typemaps.i"
36%{
37#define SWIG_FILE_WITH_INIT
38#include <babeltrace/babeltrace.h>
39#include <babeltrace/babeltrace-internal.h>
40#include <babeltrace/trace-handle.h>
41#include <babeltrace/trace-handle-internal.h>
42#include <babeltrace/context.h>
43#include <babeltrace/context-internal.h>
44#include <babeltrace/iterator.h>
45#include <babeltrace/iterator-internal.h>
46#include <babeltrace/format.h>
47#include <babeltrace/list.h>
24a3136a
DS
48#include <babeltrace/types.h>
49#include <babeltrace/ctf/iterator.h>
50#include "python-complements.h"
51%}
52
53typedef unsigned long long uint64_t;
54typedef long long int64_t;
55typedef int bt_intern_str;
56
57/* =================================================================
58 CONTEXT.H, CONTEXT-INTERNAL.H
59 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
60*/
61
62%rename("_bt_context_create") bt_context_create(void);
63%rename("_bt_context_add_trace") bt_context_add_trace(
64 struct bt_context *ctx, const char *path, const char *format,
2c0df204
XH
65 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
66 struct bt_mmap_stream_list *stream_list, FILE *metadata);
24a3136a
DS
67%rename("_bt_context_remove_trace") bt_context_remove_trace(
68 struct bt_context *ctx, int trace_id);
69%rename("_bt_context_get") bt_context_get(struct bt_context *ctx);
70%rename("_bt_context_put") bt_context_put(struct bt_context *ctx);
71%rename("_bt_ctf_event_get_context") bt_ctf_event_get_context(
72 const struct bt_ctf_event *event);
73
74struct bt_context *bt_context_create(void);
75int bt_context_add_trace(struct bt_context *ctx, const char *path, const char *format,
2c0df204
XH
76 void (*packet_seek)(struct bt_stream_pos *pos, size_t index, int whence),
77 struct bt_mmap_stream_list *stream_list, FILE *metadata);
24a3136a
DS
78void bt_context_remove_trace(struct bt_context *ctx, int trace_id);
79void bt_context_get(struct bt_context *ctx);
80void bt_context_put(struct bt_context *ctx);
81struct bt_context *bt_ctf_event_get_context(const struct bt_ctf_event *event);
82
83// class Context to prevent direct access to struct bt_context
84%pythoncode%{
85class Context:
86 """
87 The context represents the object in which a trace_collection is
88 open. As long as this structure is allocated, the trace_collection
89 is open and the traces it contains can be read and seeked by the
90 iterators and callbacks.
91 """
92
93 def __init__(self):
94 self._c = _bt_context_create()
95
96 def __del__(self):
97 _bt_context_put(self._c)
98
99 def add_trace(self, path, format_str,
100 packet_seek=None, stream_list=None, metadata=None):
101 """
102 Add a trace by path to the context.
103
104 Open a trace.
105
106 path is the path to the trace, it is not recursive.
107 If "path" is None, stream_list is used instead as a list
108 of mmap streams to open for the trace.
109
110 format is a string containing the format name in which the trace was
111 produced.
112
113 packet_seek is not implemented for Python. Should be left None to
114 use the default packet_seek handler provided by the trace format.
115
116 stream_list is a linked list of streams, it is used to open a trace
117 where the trace data is located in memory mapped areas instead of
118 trace files, this argument should be None when path is not None.
119
120 The metadata parameter acts as a metadata override when not None,
121 otherwise the format handles the metadata opening.
122
123 Return: the corresponding TraceHandle on success or None on error.
124 """
125 if metadata is not None:
126 metadata = metadata._file
127
128 ret = _bt_context_add_trace(self._c, path, format_str, packet_seek,
129 stream_list, metadata)
130 if ret < 0:
131 return None
132
133 th = TraceHandle.__new__(TraceHandle)
134 th._id = ret
135 return th
136
137 def add_traces_recursive(self, path, format_str):
138 """
139 Open a trace recursively.
140
141 Find each trace present in the subdirectory starting from the given
142 path, and add them to the context.
143
144 Return a dict of TraceHandle instances (the full path is the key).
145 Return None on error.
146 """
147
148 import os
149
150 trace_handles = {}
151
152 noTrace = True
153 error = False
154
155 for fullpath, dirs, files in os.walk(path):
156 if "metadata" in files:
157 trace_handle = self.add_trace(fullpath, format_str)
158 if trace_handle is None:
159 error = True
160 continue
161
162 trace_handles[fullpath] = trace_handle
163 noTrace = False
164
165 if noTrace and error:
166 return None
167 return trace_handles
168
169 def remove_trace(self, trace_handle):
170 """
171 Remove a trace from the context.
172 Effectively closing the trace.
173 """
174 try:
175 _bt_context_remove_trace(self._c, trace_handle._id)
176 except AttributeError:
177 raise TypeError("in remove_trace, "
178 "argument 2 must be a TraceHandle instance")
179%}
180
181
182
183/* =================================================================
184 FORMAT.H, REGISTRY
185 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
186*/
187
188%rename("lookup_format") bt_lookup_format(bt_intern_str qname);
189%rename("_bt_print_format_list") bt_fprintf_format_list(FILE *fp);
190%rename("register_format") bt_register_format(struct format *format);
cc26a15a 191%rename("unregister_format") bt_unregister_format(struct bt_format *format);
24a3136a
DS
192
193extern struct format *bt_lookup_format(bt_intern_str qname);
194extern void bt_fprintf_format_list(FILE *fp);
2c0df204 195extern int bt_register_format(struct bt_format *format);
cc26a15a 196extern void bt_unregister_format(struct bt_format *format);
24a3136a 197
24a3136a
DS
198%pythoncode %{
199
200def print_format_list(babeltrace_file):
201 """
202 Print a list of available formats to file.
203
204 babeltrace_file must be a File instance opened in write mode.
205 """
206 try:
207 if babeltrace_file._file is not None:
208 _bt_print_format_list(babeltrace_file._file)
209 except AttributeError:
210 raise TypeError("in print_format_list, "
211 "argument 1 must be a File instance")
212
213%}
214
215
216/* =================================================================
217 ITERATOR.H, ITERATOR-INTERNAL.H
218 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
219*/
220
221%rename("_bt_iter_create") bt_iter_create(struct bt_context *ctx,
222 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
223%rename("_bt_iter_destroy") bt_iter_destroy(struct bt_iter *iter);
224%rename("_bt_iter_next") bt_iter_next(struct bt_iter *iter);
225%rename("_bt_iter_get_pos") bt_iter_get_pos(struct bt_iter *iter);
226%rename("_bt_iter_free_pos") bt_iter_free_pos(struct bt_iter_pos *pos);
227%rename("_bt_iter_set_pos") bt_iter_set_pos(struct bt_iter *iter,
228 const struct bt_iter_pos *pos);
229%rename("_bt_iter_create_time_pos") bt_iter_create_time_pos(struct bt_iter *iter,
230 uint64_t timestamp);
231
232struct bt_iter *bt_iter_create(struct bt_context *ctx,
233 const struct bt_iter_pos *begin_pos, const struct bt_iter_pos *end_pos);
234void bt_iter_destroy(struct bt_iter *iter);
235int bt_iter_next(struct bt_iter *iter);
236struct bt_iter_pos *bt_iter_get_pos(struct bt_iter *iter);
237void bt_iter_free_pos(struct bt_iter_pos *pos);
238int bt_iter_set_pos(struct bt_iter *iter, const struct bt_iter_pos *pos);
239struct bt_iter_pos *bt_iter_create_time_pos(struct bt_iter *iter, uint64_t timestamp);
240
241%rename("_bt_iter_pos") bt_iter_pos;
242%rename("SEEK_TIME") BT_SEEK_TIME;
243%rename("SEEK_RESTORE") BT_SEEK_RESTORE;
244%rename("SEEK_CUR") BT_SEEK_CUR;
245%rename("SEEK_BEGIN") BT_SEEK_BEGIN;
ef42f9eb 246%rename("SEEK_LAST") BT_SEEK_LAST;
24a3136a
DS
247
248// This struct is taken from iterator.h
249// All changes to the struct must also be made here
250struct bt_iter_pos {
251 enum {
252 BT_SEEK_TIME, /* uses u.seek_time */
253 BT_SEEK_RESTORE, /* uses u.restore */
254 BT_SEEK_CUR,
255 BT_SEEK_BEGIN,
ef42f9eb 256 BT_SEEK_LAST
24a3136a
DS
257 } type;
258 union {
259 uint64_t seek_time;
260 struct bt_saved_pos *restore;
261 } u;
262};
263
264
265%pythoncode%{
266
267class IterPos:
268 """This class represents the position where to set an iterator."""
269
270 __can_access = False
271
272 def __init__(self, seek_type, seek_time = None):
273 """
274 seek_type represents the type of seek to use.
275 seek_time is the timestamp to seek to when using SEEK_TIME, it
276 is expressed in nanoseconds
277 Only use SEEK_RESTORE on IterPos obtained from the get_pos function
278 in Iter class.
279 """
280
281 self._pos = _bt_iter_pos()
282 self._pos.type = seek_type
283 if seek_time and seek_type == SEEK_TIME:
284 self._pos.u.seek_time = seek_time
285 self.__can_access = True
286
287 def __del__(self):
288 if not self.__can_access:
289 _bt_iter_free_pos(self._pos)
290
291 def _get_type(self):
292 if not __can_access:
293 raise AttributeError("seek_type is not available")
294 return self._pos.type
295
296 def _set_type(self, seek_type):
297 if not __can_access:
298 raise AttributeError("seek_type is not available")
299 self._pos.type = seek_type
300
301 def _get_time(self):
302 if not __can_access:
303 raise AttributeError("seek_time is not available")
304
305 elif self._pos.type is not SEEK_TIME:
306 raise TypeError("seek_type is not SEEK_TIME")
307
308 return self._pos.u.seek_time
309
310 def _set_time(self, time):
311 if not __can_access:
312 raise AttributeError("seek_time is not available")
313
314 elif self._pos.type is not SEEK_TIME:
315 raise TypeError("seek_type is not SEEK_TIME")
316
317 self._pos.u.seek_time = time
318
319 def _get_pos(self):
320 return self._pos
321
322
323 seek_type = property(_get_type, _set_type)
324 seek_time = property(_get_time, _set_time)
325
326
327class Iterator:
328
329 __with_init = False
330
331 def __init__(self, context, begin_pos = None, end_pos = None, _no_init = None):
332 """
333 Allocate a trace collection iterator.
334
335 begin_pos and end_pos are optional parameters to specify the
336 position at which the trace collection should be seeked upon
337 iterator creation, and the position at which iteration will
338 start returning "EOF".
339
340 By default, if begin_pos is None, a BT_SEEK_CUR is performed at
341 creation. By default, if end_pos is None, a BT_SEEK_END (end of
342 trace) is the EOF criterion.
343 """
344 if _no_init is None:
345 if begin_pos is None:
346 bp = None
347 else:
348 try:
349 bp = begin_pos._pos
350 except AttributeError:
351 raise TypeError("in __init__, "
352 "argument 3 must be a IterPos instance")
353
354 if end_pos is None:
355 ep = None
356 else:
357 try:
358 ep = end_pos._pos
359 except AttributeError:
360 raise TypeError("in __init__, "
361 "argument 4 must be a IterPos instance")
362
363 try:
364 self._bi = _bt_iter_create(context._c, bp, ep)
365 except AttributeError:
366 raise TypeError("in __init__, "
367 "argument 2 must be a Context instance")
368
369 self.__with_init = True
370
371 else:
372 self._bi = _no_init
373
374 def __del__(self):
375 if self.__with_init:
376 _bt_iter_destroy(self._bi)
377
378 def next(self):
379 """
380 Move trace collection position to the next event.
381 Returns 0 on success, a negative value on error.
382 """
383 return _bt_iter_next(self._bi)
384
385 def get_pos(self):
386 """Return a IterPos class of the current iterator position."""
387 ret = IterPos(0)
388 ret.__can_access = False
389 ret._pos = _bt_iter_get_pos(self._bi)
390 return ret
391
392 def set_pos(self, pos):
393 """
394 Move the iterator to a given position.
395
396 On error, the stream_heap is reinitialized and returned empty.
397 Return 0 for success.
398 Return EOF if the position requested is after the last event of the
399 trace collection.
400 Return -EINVAL when called with invalid parameter.
401 Return -ENOMEM if the stream_heap could not be properly initialized.
402 """
403 try:
404 return _bt_iter_set_pos(self._bi, pos._pos)
405 except AttributeError:
406 raise TypeError("in set_pos, "
407 "argument 2 must be a IterPos instance")
408
409 def create_time_pos(self, timestamp):
410 """
411 Create a position based on time
412 This function allocates and returns a new IterPos to be able to
413 restore an iterator position based on a timestamp.
414 """
415
416 if timestamp < 0:
417 raise TypeError("timestamp must be an unsigned int")
418
419 ret = IterPos(0)
420 ret.__can_access = False
421 ret._pos = _bt_iter_create_time_pos(self._bi, timestamp)
422 return ret
423%}
424
425
426/* =================================================================
427 CLOCK-TYPE.H
428 ¯¯¯¯¯¯¯¯¯¯¯¯
429 *** Enum copied from clock-type.h­
430 All changes must also be made here
431*/
432%rename("CLOCK_CYCLES") BT_CLOCK_CYCLES;
433%rename("CLOCK_REAL") BT_CLOCK_REAL;
434
435enum bt_clock_type {
436 BT_CLOCK_CYCLES = 0,
437 BT_CLOCK_REAL
438};
439
440/* =================================================================
441 TRACE-HANDLE.H, TRACE-HANDLE-INTERNAL.H
442 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
443*/
444
445%rename("_bt_trace_handle_create") bt_trace_handle_create(struct bt_context *ctx);
446%rename("_bt_trace_handle_destroy") bt_trace_handle_destroy(struct bt_trace_handle *bt);
447struct bt_trace_handle *bt_trace_handle_create(struct bt_context *ctx);
448void bt_trace_handle_destroy(struct bt_trace_handle *bt);
449
450%rename("_bt_trace_handle_get_path") bt_trace_handle_get_path(struct bt_context *ctx,
451 int handle_id);
452%rename("_bt_trace_handle_get_timestamp_begin") bt_trace_handle_get_timestamp_begin(
453 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
454%rename("_bt_trace_handle_get_timestamp_end") bt_trace_handle_get_timestamp_end(
455 struct bt_context *ctx, int handle_id, enum bt_clock_type type);
24a3136a
DS
456const char *bt_trace_handle_get_path(struct bt_context *ctx, int handle_id);
457uint64_t bt_trace_handle_get_timestamp_begin(struct bt_context *ctx, int handle_id,
458 enum bt_clock_type type);
459uint64_t bt_trace_handle_get_timestamp_end(struct bt_context *ctx, int handle_id,
460 enum bt_clock_type type);
461
462%rename("_bt_ctf_event_get_handle_id") bt_ctf_event_get_handle_id(
463 const struct bt_ctf_event *event);
464int bt_ctf_event_get_handle_id(const struct bt_ctf_event *event);
465
466
467%pythoncode%{
468
469class TraceHandle(object):
470 """
471 The TraceHandle allows the user to manipulate a trace file directly.
472 It is a unique identifier representing a trace file.
473 Do not instantiate.
474 """
475
476 def __init__(self):
477 raise NotImplementedError("TraceHandle cannot be instantiated")
478
479 def __repr__(self):
288209fb 480 return "Babeltrace TraceHandle: trace_id('{0}')".format(self._id)
24a3136a
DS
481
482 def get_id(self):
483 """Return the TraceHandle id."""
484 return self._id
485
486 def get_path(self, context):
487 """Return the path of a TraceHandle."""
488 try:
489 return _bt_trace_handle_get_path(context._c, self._id)
490 except AttributeError:
491 raise TypeError("in get_path, "
492 "argument 2 must be a Context instance")
493
494 def get_timestamp_begin(self, context, clock_type):
495 """Return the creation time of the buffers of a trace."""
496 try:
497 return _bt_trace_handle_get_timestamp_begin(
498 context._c, self._id,clock_type)
499 except AttributeError:
500 raise TypeError("in get_timestamp_begin, "
501 "argument 2 must be a Context instance")
502
503 def get_timestamp_end(self, context, clock_type):
504 """Return the destruction timestamp of the buffers of a trace."""
505 try:
506 return _bt_trace_handle_get_timestamp_end(
507 context._c, self._id, clock_type)
508 except AttributeError:
509 raise TypeError("in get_timestamp_end, "
510 "argument 2 must be a Context instance")
511
512%}
513
514
515
516// =================================================================
517// CTF
518// =================================================================
519
520/* =================================================================
521 ITERATOR.H, EVENTS.H
522 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
523*/
524
525//Iterator
526%rename("_bt_ctf_iter_create") bt_ctf_iter_create(struct bt_context *ctx,
527 const struct bt_iter_pos *begin_pos,
528 const struct bt_iter_pos *end_pos);
529%rename("_bt_ctf_get_iter") bt_ctf_get_iter(struct bt_ctf_iter *iter);
530%rename("_bt_ctf_iter_destroy") bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
531%rename("_bt_ctf_iter_read_event") bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
532
533struct bt_ctf_iter *bt_ctf_iter_create(struct bt_context *ctx,
534 const struct bt_iter_pos *begin_pos,
535 const struct bt_iter_pos *end_pos);
536struct bt_iter *bt_ctf_get_iter(struct bt_ctf_iter *iter);
537void bt_ctf_iter_destroy(struct bt_ctf_iter *iter);
538struct bt_ctf_event *bt_ctf_iter_read_event(struct bt_ctf_iter *iter);
539
540
541//Events
542
543%rename("_bt_ctf_get_top_level_scope") bt_ctf_get_top_level_scope(const struct
544 bt_ctf_event *event, enum bt_ctf_scope scope);
545%rename("_bt_ctf_event_name") bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
546%rename("_bt_ctf_get_timestamp") bt_ctf_get_timestamp(
547 const struct bt_ctf_event *ctf_event);
548%rename("_bt_ctf_get_cycles") bt_ctf_get_cycles(
549 const struct bt_ctf_event *ctf_event);
550
551%rename("_bt_ctf_get_field") bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
2c0df204 552 const struct bt_definition *scope, const char *field);
24a3136a 553%rename("_bt_ctf_get_index") bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
2c0df204
XH
554 const struct bt_definition *field, unsigned int index);
555%rename("_bt_ctf_field_name") bt_ctf_field_name(const struct bt_definition *field);
556%rename("_bt_ctf_field_type") bt_ctf_field_type(const struct bt_declaration *field);
24a3136a 557%rename("_bt_ctf_get_int_signedness") bt_ctf_get_int_signedness(
2c0df204
XH
558 const struct bt_declaration *field);
559%rename("_bt_ctf_get_int_base") bt_ctf_get_int_base(const struct bt_declaration *field);
24a3136a 560%rename("_bt_ctf_get_int_byte_order") bt_ctf_get_int_byte_order(
2c0df204
XH
561 const struct bt_declaration *field);
562%rename("_bt_ctf_get_int_len") bt_ctf_get_int_len(const struct bt_declaration *field);
4191bcd2
XH
563%rename("_bt_ctf_get_enum_int") bt_ctf_get_enum_int(const struct bt_definition *field);
564%rename("_bt_ctf_get_enum_str") bt_ctf_get_enum_str(const struct bt_definition *field);
2c0df204
XH
565%rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct bt_declaration *field);
566%rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct bt_declaration *field);
567%rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct bt_definition *field);
568%rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct bt_definition *field);
569%rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field);
570%rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field);
24a3136a
DS
571%rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void);
572%rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct
573 bt_ctf_event_decl *event);
574%rename("_bt_ctf_get_decl_field_name") bt_ctf_get_decl_field_name(
575 const struct bt_ctf_field_decl *field);
f01efa78 576%rename("_bt_ctf_get_decl_from_def") bt_ctf_get_decl_from_def(
2c0df204 577 const struct bt_definition *field);
24a3136a 578
2c0df204 579const struct bt_definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event,
24a3136a
DS
580 enum bt_ctf_scope scope);
581const char *bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
582uint64_t bt_ctf_get_timestamp(const struct bt_ctf_event *ctf_event);
583uint64_t bt_ctf_get_cycles(const struct bt_ctf_event *ctf_event);
2c0df204
XH
584const struct bt_definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
585 const struct bt_definition *scope,
24a3136a 586 const char *field);
2c0df204
XH
587const struct bt_definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
588 const struct bt_definition *field,
24a3136a 589 unsigned int index);
2c0df204
XH
590const char *bt_ctf_field_name(const struct bt_definition *field);
591enum ctf_type_id bt_ctf_field_type(const struct bt_declaration *field);
592int bt_ctf_get_int_signedness(const struct bt_declaration *field);
593int bt_ctf_get_int_base(const struct bt_declaration *field);
594int bt_ctf_get_int_byte_order(const struct bt_declaration *field);
595ssize_t bt_ctf_get_int_len(const struct bt_declaration *field);
4191bcd2
XH
596const struct bt_definition *bt_ctf_get_enum_int(const struct bt_definition *field);
597const char *bt_ctf_get_enum_str(const struct bt_definition *field);
2c0df204
XH
598enum ctf_string_encoding bt_ctf_get_encoding(const struct bt_declaration *field);
599int bt_ctf_get_array_len(const struct bt_declaration *field);
600uint64_t bt_ctf_get_uint64(const struct bt_definition *field);
601int64_t bt_ctf_get_int64(const struct bt_definition *field);
602char *bt_ctf_get_char_array(const struct bt_definition *field);
603char *bt_ctf_get_string(const struct bt_definition *field);
24a3136a
DS
604int bt_ctf_field_get_error(void);
605const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event);
606const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field);
2c0df204 607const struct bt_declaration *bt_ctf_get_decl_from_def(const struct bt_definition *field);
24a3136a
DS
608
609%pythoncode%{
610
611class ctf:
612
613 #enum equivalent, accessible constants
614 #These are taken directly from ctf/events.h
615 #All changes to enums must also be made here
616 class type_id:
617 UNKNOWN = 0
618 INTEGER = 1
619 FLOAT = 2
620 ENUM = 3
621 STRING = 4
622 STRUCT = 5
623 UNTAGGED_VARIANT = 6
624 VARIANT = 7
625 ARRAY = 8
626 SEQUENCE = 9
627 NR_CTF_TYPES = 10
628
629 class scope:
630 TRACE_PACKET_HEADER = 0
631 STREAM_PACKET_CONTEXT = 1
632 STREAM_EVENT_HEADER = 2
633 STREAM_EVENT_CONTEXT = 3
634 EVENT_CONTEXT = 4
635 EVENT_FIELDS = 5
636
637 class string_encoding:
638 NONE = 0
639 UTF8 = 1
640 ASCII = 2
641 UNKNOWN = 3
642
643 class Iterator(Iterator, object):
644 """
645 Allocate a CTF trace collection iterator.
646
647 begin_pos and end_pos are optional parameters to specify the
648 position at which the trace collection should be seeked upon
649 iterator creation, and the position at which iteration will
650 start returning "EOF".
651
652 By default, if begin_pos is None, a SEEK_CUR is performed at
653 creation. By default, if end_pos is None, a SEEK_END (end of
654 trace) is the EOF criterion.
655
656 Only one iterator can be created against a context. If more than one
657 iterator is being created for the same context, the second creation
658 will return None. The previous iterator must be destroyed before
659 creation of the new iterator for this function to succeed.
660 """
661
662 def __new__(cls, context, begin_pos = None, end_pos = None):
663 # __new__ is used to control the return value
664 # as the ctf.Iterator class should return None
665 # if bt_ctf_iter_create returns NULL
666
667 if begin_pos is None:
668 bp = None
669 else:
670 bp = begin_pos._pos
671 if end_pos is None:
672 ep = None
673 else:
674 ep = end_pos._pos
675 try:
676 it = _bt_ctf_iter_create(context._c, bp, ep)
677 except AttributeError:
678 raise TypeError("in __init__, "
679 "argument 2 must be a Context instance")
680 if it is None:
681 return None
682
683 ret_class = super(ctf.Iterator, cls).__new__(cls)
684 ret_class._i = it
685 return ret_class
686
687 def __init__(self, context, begin_pos = None, end_pos = None):
688 Iterator.__init__(self, None, None, None,
689 _bt_ctf_get_iter(self._i))
690
691 def __del__(self):
692 _bt_ctf_iter_destroy(self._i)
693
694 def read_event(self):
695 """
696 Read the iterator's current event data.
697 Return current event on success, None on end of trace.
698 """
699 ret = _bt_ctf_iter_read_event(self._i)
700 if ret is None:
701 return ret
702 ev = ctf.Event.__new__(ctf.Event)
703 ev._e = ret
704 return ev
705
706
707 class Event(object):
708 """
709 This class represents an event from the trace.
710 It is obtained with read_event() from ctf.Iterator.
711 Do not instantiate.
712 """
713
714 def __init__(self):
715 raise NotImplementedError("ctf.Event cannot be instantiated")
716
717 def get_top_level_scope(self, scope):
718 """
719 Return a definition of the top-level scope
720 Top-level scopes are defined in ctf.scope.
721 In order to get a field or a field list, the user needs to pass a
722 scope as argument, this scope can be a top-level scope or a scope
723 relative to an arbitrary field. This function provides the mapping
724 between the scope and the actual definition of top-level scopes.
725 On error return None.
726 """
727 evDef = ctf.Definition.__new__(ctf.Definition)
728 evDef._d = _bt_ctf_get_top_level_scope(self._e, scope)
729 if evDef._d is None:
730 return None
731 return evDef
732
733 def get_name(self):
734 """Return the name of the event or None on error."""
735 return _bt_ctf_event_name(self._e)
736
737 def get_cycles(self):
738 """
739 Return the timestamp of the event as written in
740 the packet (in cycles) or -1ULL on error.
741 """
742 return _bt_ctf_get_cycles(self._e)
743
744 def get_timestamp(self):
745 """
746 Return the timestamp of the event offsetted with the
747 system clock source or -1ULL on error.
748 """
749 return _bt_ctf_get_timestamp(self._e)
750
7a30a668
XH
751 def get_field_with_scope(self, scope, field):
752 """
753 Return the definition of a specific field.
754 Return None on error.
755 """
24a3136a
DS
756 evDef = ctf.Definition.__new__(ctf.Definition)
757 try:
758 evDef._d = _bt_ctf_get_field(self._e, scope._d, field)
759 except AttributeError:
760 raise TypeError("in get_field, argument 2 must be a "
761 "Definition (scope) instance")
7a30a668
XH
762 if evDef._d is None:
763 return None
764 evDef._s = scope
24a3136a
DS
765 return evDef
766
7a30a668
XH
767 def get_field(self, field):
768 """
769 Return the definition of fields by a name
770 Return None on error
771 """
772 eventScope = self.get_top_level_scope(ctf.scope.EVENT_FIELDS)
773 streamScope = self.get_top_level_scope(ctf.scope.STREAM_EVENT_CONTEXT)
774 fields_by_name = []
775
776 if eventScope is not None:
777 evDef = self.get_field_with_scope(eventScope, field)
778 if evDef is not None:
779 fields_by_name.append(evDef)
780
781 if streamScope is not None:
782 evDef = self.get_field_with_scope(streamScope, field)
783 if evDef is not None:
784 fields_by_name.append(evDef);
785
786 if not fields_by_name:
787 return None
788 return fields_by_name
789
790 def get_field_list_with_scope(self, scope):
24a3136a 791 """
7a30a668 792 Return a list of Definitions associated with the scope
24a3136a
DS
793 Return None on error.
794 """
795 try:
796 field_lc = _bt_python_field_listcaller(self._e, scope._d)
797 except AttributeError:
798 raise TypeError("in get_field_list, argument 2 must be a "
799 "Definition (scope) instance")
800
801 if field_lc is None:
802 return None
803
804 def_list = []
805 i = 0
806 while True:
807 tmp = ctf.Definition.__new__(ctf.Definition)
808 tmp._d = _bt_python_field_one_from_list(field_lc, i)
809
810 if tmp._d is None:
811 #Last item of list is None, assured in
812 #_bt_python_field_listcaller
813 break
814
7a30a668 815 tmp._s = scope
24a3136a
DS
816 def_list.append(tmp)
817 i += 1
818 return def_list
819
7a30a668
XH
820 def get_field_list(self):
821 """Return a list of Definitions or None on error."""
822 eventScope = self.get_top_level_scope(ctf.scope.EVENT_FIELDS)
823 streamScope = self.get_top_level_scope(ctf.scope.STREAM_EVENT_CONTEXT)
824
825 def_list = []
826 if eventScope is not None:
827 event_field_list = self.get_field_list_with_scope(eventScope)
828 if event_field_list is not None:
829 def_list = event_field_list
830
831 if streamScope is not None:
832 event_field_list = self.get_field_list_with_scope(streamScope)
833 if event_field_list is not None:
834 def_list.extend(event_field_list)
835
836 if not def_list:
837 return None
838 return def_list
839
24a3136a
DS
840 def get_index(self, field, index):
841 """
842 If the field is an array or a sequence, return the element
843 at position index, otherwise return None
844 """
845 evDef = ctf.Definition.__new__(ctf.Definition)
846 try:
847 evDef._d = _bt_ctf_get_index(self._e, field._d, index)
848 except AttributeError:
849 raise TypeError("in get_index, argument 2 must be a "
850 "Definition (field) instance")
851
852 if evDef._d is None:
853 return None
854 return evDef
855
856 def get_handle(self):
857 """
858 Get the TraceHandle associated with an event
859 Return None on error
860 """
861 ret = _bt_ctf_event_get_handle_id(self._e)
862 if ret < 0:
863 return None
864
865 th = TraceHandle.__new__(TraceHandle)
866 th._id = ret
867 return th
868
869 def get_context(self):
870 """
871 Get the context associated with an event.
872 Return None on error.
873 """
874 ctx = Context()
875 ctx._c = _bt_ctf_event_get_context(self._e);
876 if ctx._c is None:
877 return None
878 else:
879 return ctx
880
881
882 class Definition(object):
883 """Definition class. Do not instantiate."""
884
885 def __init__(self):
886 raise NotImplementedError("ctf.Definition cannot be instantiated")
887
888 def __repr__(self):
288209fb 889 return "Babeltrace Definition: name('{0}'), type({1})".format(
24a3136a
DS
890 self.field_name(), self.field_type())
891
892 def field_name(self):
893 """Return the name of a field or None on error."""
894 return _bt_ctf_field_name(self._d)
895
896 def field_type(self):
897 """Return the type of a field or -1 if unknown."""
f01efa78 898 return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
899
900 def get_int_signedness(self):
901 """
902 Return the signedness of an integer:
903 0 if unsigned; 1 if signed; -1 on error.
904 """
f01efa78 905 return _bt_ctf_get_int_signedness(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
906
907 def get_int_base(self):
908 """Return the base of an int or a negative value on error."""
f01efa78 909 return _bt_ctf_get_int_base(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
910
911 def get_int_byte_order(self):
912 """
913 Return the byte order of an int or a negative
914 value on error.
915 """
f01efa78 916 return _bt_ctf_get_int_byte_order(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
917
918 def get_int_len(self):
919 """
920 Return the size, in bits, of an int or a negative
921 value on error.
922 """
135c8f9c 923 return _bt_ctf_get_int_len(_bt_ctf_get_decl_from_def(self._d))
24a3136a 924
4191bcd2
XH
925 def get_enum_str(self):
926 """
927 Return the string matching the current enumeration.
928 Return None on error.
929 """
930 return _bt_ctf_get_enum_str(self._d)
931
24a3136a
DS
932 def get_encoding(self):
933 """
934 Return the encoding of an int or a string.
935 Return a negative value on error.
936 """
f01efa78 937 return _bt_ctf_get_encoding(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
938
939 def get_array_len(self):
940 """
941 Return the len of an array or a negative
942 value on error.
943 """
f01efa78 944 return _bt_ctf_get_array_len(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
945
946 def get_uint64(self):
947 """
948 Return the value associated with the field.
949 If the field does not exist or is not of the type requested,
950 the value returned is undefined. To check if an error occured,
951 use the ctf.field_error() function after accessing a field.
952 """
953 return _bt_ctf_get_uint64(self._d)
954
955 def get_int64(self):
956 """
957 Return the value associated with the field.
958 If the field does not exist or is not of the type requested,
959 the value returned is undefined. To check if an error occured,
960 use the ctf.field_error() function after accessing a field.
961 """
962 return _bt_ctf_get_int64(self._d)
963
964 def get_char_array(self):
965 """
966 Return the value associated with the field.
967 If the field does not exist or is not of the type requested,
968 the value returned is undefined. To check if an error occured,
969 use the ctf.field_error() function after accessing a field.
970 """
971 return _bt_ctf_get_char_array(self._d)
972
973 def get_str(self):
974 """
975 Return the value associated with the field.
976 If the field does not exist or is not of the type requested,
977 the value returned is undefined. To check if an error occured,
978 use the ctf.field_error() function after accessing a field.
979 """
980 return _bt_ctf_get_string(self._d)
981
7a30a668
XH
982 def get_scope(self):
983 """Return the scope of a field or None on error."""
984 return self._s
24a3136a
DS
985
986 class EventDecl(object):
987 """Event declaration class. Do not instantiate."""
988
989 def __init__(self):
990 raise NotImplementedError("ctf.EventDecl cannot be instantiated")
991
992 def __repr__(self):
288209fb 993 return "Babeltrace EventDecl: name {0}".format(self.get_name())
24a3136a
DS
994
995 def get_name(self):
996 """Return the name of the event or None on error"""
997 return _bt_ctf_get_decl_event_name(self._d)
998
999 def get_decl_fields(self, scope):
1000 """
1001 Return a list of ctf.FieldDecl
1002 Return None on error.
1003 """
1004 ptr_list = _by_python_field_decl_listcaller(self._d, scope)
1005
1006 if ptr_list is None:
1007 return None
1008
1009 decl_list = []
1010 i = 0
1011 while True:
1012 tmp = ctf.FieldDecl.__new__(ctf.FieldDecl)
1013 tmp._d = _bt_python_field_decl_one_from_list(
1014 ptr_list, i)
1015
1016 if tmp._d is None:
1017 #Last item of list is None
1018 break
1019
1020 decl_list.append(tmp)
1021 i += 1
1022 return decl_list
1023
1024
1025 class FieldDecl(object):
1026 """Field declaration class. Do not instantiate."""
1027
1028 def __init__(self):
1029 raise NotImplementedError("ctf.FieldDecl cannot be instantiated")
1030
1031 def __repr__(self):
288209fb 1032 return "Babeltrace FieldDecl: name {0}".format(self.get_name())
24a3136a
DS
1033
1034 def get_name(self):
1035 """Return the name of a FieldDecl or None on error"""
1036 return _bt_ctf_get_decl_field_name(self._d)
1037
1038
1039 @staticmethod
1040 def field_error():
1041 """
1042 Return the last error code encountered while
1043 accessing a field and reset the error flag.
1044 Return 0 if no error, a negative value otherwise.
1045 """
1046 return _bt_ctf_field_get_error()
1047
1048 @staticmethod
1049 def get_event_decl_list(trace_handle, context):
1050 """
1051 Return a list of ctf.EventDecl
1052 Return None on error.
1053 """
1054 try:
1055 handle_id = trace_handle._id
1056 except AttributeError:
1057 raise TypeError("in get_event_decl_list, "
1058 "argument 1 must be a TraceHandle instance")
1059 try:
1060 ptr_list = _bt_python_event_decl_listcaller(handle_id, context._c)
1061 except AttributeError:
1062 raise TypeError("in get_event_decl_list, "
1063 "argument 2 must be a Context instance")
1064
1065 if ptr_list is None:
1066 return None
1067
1068 decl_list = []
1069 i = 0
1070 while True:
1071 tmp = ctf.EventDecl.__new__(ctf.EventDecl)
1072 tmp._d = _bt_python_decl_one_from_list(ptr_list, i)
1073
1074 if tmp._d is None:
1075 #Last item of list is None
1076 break
1077
1078 decl_list.append(tmp)
1079 i += 1
1080 return decl_list
1081
1082%}
1083
1084
1085
1086// =================================================================
1087// NEW FUNCTIONS
1088// File and list-related
1089// python-complements.h
1090// =================================================================
1091
1092%include python-complements.c
1093
1094%pythoncode %{
1095
1096class File(object):
1097 """
1098 Open a file for babeltrace.
1099
1100 file_path is a string containing the path or None to use the
1101 standard output in writing mode.
1102
1103 The mode can be 'r', 'w' or 'a' for reading (default), writing or
1104 appending. The file will be created if it doesn't exist when
1105 opened for writing or appending; it will be truncated when opened
1106 for writing. Add a 'b' to the mode for binary files. Add a '+'
1107 to the mode to allow simultaneous reading and writing.
1108 """
1109
1110 def __new__(cls, file_path, mode='r'):
1111 # __new__ is used to control the return value
1112 # as the File class should return None
1113 # if _bt_file_open returns NULL
1114
1115 # Type check
1116 if file_path is not None and type(file_path) is not str:
1117 raise TypeError("in method __init__, argument 2 of type 'str'")
1118 if type(mode) is not str:
1119 raise TypeError("in method __init__, argument 3 of type 'str'")
1120
1121 # Opening file
1122 file_ptr = _bt_file_open(file_path, mode)
1123 if file_ptr is None:
1124 return None
1125
1126 # Class instantiation
1127 file_inst = super(File, cls).__new__(cls)
1128 file_inst._file = file_ptr
1129 return file_inst
1130
1131 def __init__(self, file_path, mode='r'):
1132 self._opened = True
1133 self._use_stdout = False
1134
1135 if file_path is None:
1136 # use stdout
1137 file_path = "stdout"
1138 mode = 'w'
1139 self._use_stdout = True
1140
1141 self._file_path = file_path
1142 self._mode = mode
1143
1144 def __del__(self):
1145 self.close()
1146
1147 def __repr__(self):
1148 if self._opened:
1149 stat = 'opened'
1150 else:
1151 stat = 'closed'
288209fb 1152 return "{0} babeltrace File; file_path('{1}'), mode('{2}')".format(
24a3136a
DS
1153 stat, self._file_path, self._mode)
1154
1155 def close(self):
1156 """Close the file. Is also called using del."""
1157 if self._opened and not self._use_stdout:
1158 _bt_file_close(self._file)
1159 self._opened = False
1160%}
This page took 0.066307 seconds and 4 git commands to generate.