Return event fields by field name
[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);
563%rename("_bt_ctf_get_encoding") bt_ctf_get_encoding(const struct bt_declaration *field);
564%rename("_bt_ctf_get_array_len") bt_ctf_get_array_len(const struct bt_declaration *field);
565%rename("_bt_ctf_get_uint64") bt_ctf_get_uint64(const struct bt_definition *field);
566%rename("_bt_ctf_get_int64") bt_ctf_get_int64(const struct bt_definition *field);
567%rename("_bt_ctf_get_char_array") bt_ctf_get_char_array(const struct bt_definition *field);
568%rename("_bt_ctf_get_string") bt_ctf_get_string(const struct bt_definition *field);
24a3136a
DS
569%rename("_bt_ctf_field_get_error") bt_ctf_field_get_error(void);
570%rename("_bt_ctf_get_decl_event_name") bt_ctf_get_decl_event_name(const struct
571 bt_ctf_event_decl *event);
572%rename("_bt_ctf_get_decl_field_name") bt_ctf_get_decl_field_name(
573 const struct bt_ctf_field_decl *field);
f01efa78 574%rename("_bt_ctf_get_decl_from_def") bt_ctf_get_decl_from_def(
2c0df204 575 const struct bt_definition *field);
24a3136a 576
2c0df204 577const struct bt_definition *bt_ctf_get_top_level_scope(const struct bt_ctf_event *ctf_event,
24a3136a
DS
578 enum bt_ctf_scope scope);
579const char *bt_ctf_event_name(const struct bt_ctf_event *ctf_event);
580uint64_t bt_ctf_get_timestamp(const struct bt_ctf_event *ctf_event);
581uint64_t bt_ctf_get_cycles(const struct bt_ctf_event *ctf_event);
2c0df204
XH
582const struct bt_definition *bt_ctf_get_field(const struct bt_ctf_event *ctf_event,
583 const struct bt_definition *scope,
24a3136a 584 const char *field);
2c0df204
XH
585const struct bt_definition *bt_ctf_get_index(const struct bt_ctf_event *ctf_event,
586 const struct bt_definition *field,
24a3136a 587 unsigned int index);
2c0df204
XH
588const char *bt_ctf_field_name(const struct bt_definition *field);
589enum ctf_type_id bt_ctf_field_type(const struct bt_declaration *field);
590int bt_ctf_get_int_signedness(const struct bt_declaration *field);
591int bt_ctf_get_int_base(const struct bt_declaration *field);
592int bt_ctf_get_int_byte_order(const struct bt_declaration *field);
593ssize_t bt_ctf_get_int_len(const struct bt_declaration *field);
594enum ctf_string_encoding bt_ctf_get_encoding(const struct bt_declaration *field);
595int bt_ctf_get_array_len(const struct bt_declaration *field);
596uint64_t bt_ctf_get_uint64(const struct bt_definition *field);
597int64_t bt_ctf_get_int64(const struct bt_definition *field);
598char *bt_ctf_get_char_array(const struct bt_definition *field);
599char *bt_ctf_get_string(const struct bt_definition *field);
24a3136a
DS
600int bt_ctf_field_get_error(void);
601const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event);
602const char *bt_ctf_get_decl_field_name(const struct bt_ctf_field_decl *field);
2c0df204 603const struct bt_declaration *bt_ctf_get_decl_from_def(const struct bt_definition *field);
24a3136a
DS
604
605%pythoncode%{
606
607class ctf:
608
609 #enum equivalent, accessible constants
610 #These are taken directly from ctf/events.h
611 #All changes to enums must also be made here
612 class type_id:
613 UNKNOWN = 0
614 INTEGER = 1
615 FLOAT = 2
616 ENUM = 3
617 STRING = 4
618 STRUCT = 5
619 UNTAGGED_VARIANT = 6
620 VARIANT = 7
621 ARRAY = 8
622 SEQUENCE = 9
623 NR_CTF_TYPES = 10
624
625 class scope:
626 TRACE_PACKET_HEADER = 0
627 STREAM_PACKET_CONTEXT = 1
628 STREAM_EVENT_HEADER = 2
629 STREAM_EVENT_CONTEXT = 3
630 EVENT_CONTEXT = 4
631 EVENT_FIELDS = 5
632
633 class string_encoding:
634 NONE = 0
635 UTF8 = 1
636 ASCII = 2
637 UNKNOWN = 3
638
639 class Iterator(Iterator, object):
640 """
641 Allocate a CTF trace collection iterator.
642
643 begin_pos and end_pos are optional parameters to specify the
644 position at which the trace collection should be seeked upon
645 iterator creation, and the position at which iteration will
646 start returning "EOF".
647
648 By default, if begin_pos is None, a SEEK_CUR is performed at
649 creation. By default, if end_pos is None, a SEEK_END (end of
650 trace) is the EOF criterion.
651
652 Only one iterator can be created against a context. If more than one
653 iterator is being created for the same context, the second creation
654 will return None. The previous iterator must be destroyed before
655 creation of the new iterator for this function to succeed.
656 """
657
658 def __new__(cls, context, begin_pos = None, end_pos = None):
659 # __new__ is used to control the return value
660 # as the ctf.Iterator class should return None
661 # if bt_ctf_iter_create returns NULL
662
663 if begin_pos is None:
664 bp = None
665 else:
666 bp = begin_pos._pos
667 if end_pos is None:
668 ep = None
669 else:
670 ep = end_pos._pos
671 try:
672 it = _bt_ctf_iter_create(context._c, bp, ep)
673 except AttributeError:
674 raise TypeError("in __init__, "
675 "argument 2 must be a Context instance")
676 if it is None:
677 return None
678
679 ret_class = super(ctf.Iterator, cls).__new__(cls)
680 ret_class._i = it
681 return ret_class
682
683 def __init__(self, context, begin_pos = None, end_pos = None):
684 Iterator.__init__(self, None, None, None,
685 _bt_ctf_get_iter(self._i))
686
687 def __del__(self):
688 _bt_ctf_iter_destroy(self._i)
689
690 def read_event(self):
691 """
692 Read the iterator's current event data.
693 Return current event on success, None on end of trace.
694 """
695 ret = _bt_ctf_iter_read_event(self._i)
696 if ret is None:
697 return ret
698 ev = ctf.Event.__new__(ctf.Event)
699 ev._e = ret
700 return ev
701
702
703 class Event(object):
704 """
705 This class represents an event from the trace.
706 It is obtained with read_event() from ctf.Iterator.
707 Do not instantiate.
708 """
709
710 def __init__(self):
711 raise NotImplementedError("ctf.Event cannot be instantiated")
712
713 def get_top_level_scope(self, scope):
714 """
715 Return a definition of the top-level scope
716 Top-level scopes are defined in ctf.scope.
717 In order to get a field or a field list, the user needs to pass a
718 scope as argument, this scope can be a top-level scope or a scope
719 relative to an arbitrary field. This function provides the mapping
720 between the scope and the actual definition of top-level scopes.
721 On error return None.
722 """
723 evDef = ctf.Definition.__new__(ctf.Definition)
724 evDef._d = _bt_ctf_get_top_level_scope(self._e, scope)
725 if evDef._d is None:
726 return None
727 return evDef
728
729 def get_name(self):
730 """Return the name of the event or None on error."""
731 return _bt_ctf_event_name(self._e)
732
733 def get_cycles(self):
734 """
735 Return the timestamp of the event as written in
736 the packet (in cycles) or -1ULL on error.
737 """
738 return _bt_ctf_get_cycles(self._e)
739
740 def get_timestamp(self):
741 """
742 Return the timestamp of the event offsetted with the
743 system clock source or -1ULL on error.
744 """
745 return _bt_ctf_get_timestamp(self._e)
746
7a30a668
XH
747 def get_field_with_scope(self, scope, field):
748 """
749 Return the definition of a specific field.
750 Return None on error.
751 """
24a3136a
DS
752 evDef = ctf.Definition.__new__(ctf.Definition)
753 try:
754 evDef._d = _bt_ctf_get_field(self._e, scope._d, field)
755 except AttributeError:
756 raise TypeError("in get_field, argument 2 must be a "
757 "Definition (scope) instance")
7a30a668
XH
758 if evDef._d is None:
759 return None
760 evDef._s = scope
24a3136a
DS
761 return evDef
762
7a30a668
XH
763 def get_field(self, field):
764 """
765 Return the definition of fields by a name
766 Return None on error
767 """
768 eventScope = self.get_top_level_scope(ctf.scope.EVENT_FIELDS)
769 streamScope = self.get_top_level_scope(ctf.scope.STREAM_EVENT_CONTEXT)
770 fields_by_name = []
771
772 if eventScope is not None:
773 evDef = self.get_field_with_scope(eventScope, field)
774 if evDef is not None:
775 fields_by_name.append(evDef)
776
777 if streamScope is not None:
778 evDef = self.get_field_with_scope(streamScope, field)
779 if evDef is not None:
780 fields_by_name.append(evDef);
781
782 if not fields_by_name:
783 return None
784 return fields_by_name
785
786 def get_field_list_with_scope(self, scope):
24a3136a 787 """
7a30a668 788 Return a list of Definitions associated with the scope
24a3136a
DS
789 Return None on error.
790 """
791 try:
792 field_lc = _bt_python_field_listcaller(self._e, scope._d)
793 except AttributeError:
794 raise TypeError("in get_field_list, argument 2 must be a "
795 "Definition (scope) instance")
796
797 if field_lc is None:
798 return None
799
800 def_list = []
801 i = 0
802 while True:
803 tmp = ctf.Definition.__new__(ctf.Definition)
804 tmp._d = _bt_python_field_one_from_list(field_lc, i)
805
806 if tmp._d is None:
807 #Last item of list is None, assured in
808 #_bt_python_field_listcaller
809 break
810
7a30a668 811 tmp._s = scope
24a3136a
DS
812 def_list.append(tmp)
813 i += 1
814 return def_list
815
7a30a668
XH
816 def get_field_list(self):
817 """Return a list of Definitions or None on error."""
818 eventScope = self.get_top_level_scope(ctf.scope.EVENT_FIELDS)
819 streamScope = self.get_top_level_scope(ctf.scope.STREAM_EVENT_CONTEXT)
820
821 def_list = []
822 if eventScope is not None:
823 event_field_list = self.get_field_list_with_scope(eventScope)
824 if event_field_list is not None:
825 def_list = event_field_list
826
827 if streamScope is not None:
828 event_field_list = self.get_field_list_with_scope(streamScope)
829 if event_field_list is not None:
830 def_list.extend(event_field_list)
831
832 if not def_list:
833 return None
834 return def_list
835
24a3136a
DS
836 def get_index(self, field, index):
837 """
838 If the field is an array or a sequence, return the element
839 at position index, otherwise return None
840 """
841 evDef = ctf.Definition.__new__(ctf.Definition)
842 try:
843 evDef._d = _bt_ctf_get_index(self._e, field._d, index)
844 except AttributeError:
845 raise TypeError("in get_index, argument 2 must be a "
846 "Definition (field) instance")
847
848 if evDef._d is None:
849 return None
850 return evDef
851
852 def get_handle(self):
853 """
854 Get the TraceHandle associated with an event
855 Return None on error
856 """
857 ret = _bt_ctf_event_get_handle_id(self._e)
858 if ret < 0:
859 return None
860
861 th = TraceHandle.__new__(TraceHandle)
862 th._id = ret
863 return th
864
865 def get_context(self):
866 """
867 Get the context associated with an event.
868 Return None on error.
869 """
870 ctx = Context()
871 ctx._c = _bt_ctf_event_get_context(self._e);
872 if ctx._c is None:
873 return None
874 else:
875 return ctx
876
877
878 class Definition(object):
879 """Definition class. Do not instantiate."""
880
881 def __init__(self):
882 raise NotImplementedError("ctf.Definition cannot be instantiated")
883
884 def __repr__(self):
288209fb 885 return "Babeltrace Definition: name('{0}'), type({1})".format(
24a3136a
DS
886 self.field_name(), self.field_type())
887
888 def field_name(self):
889 """Return the name of a field or None on error."""
890 return _bt_ctf_field_name(self._d)
891
892 def field_type(self):
893 """Return the type of a field or -1 if unknown."""
f01efa78 894 return _bt_ctf_field_type(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
895
896 def get_int_signedness(self):
897 """
898 Return the signedness of an integer:
899 0 if unsigned; 1 if signed; -1 on error.
900 """
f01efa78 901 return _bt_ctf_get_int_signedness(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
902
903 def get_int_base(self):
904 """Return the base of an int or a negative value on error."""
f01efa78 905 return _bt_ctf_get_int_base(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
906
907 def get_int_byte_order(self):
908 """
909 Return the byte order of an int or a negative
910 value on error.
911 """
f01efa78 912 return _bt_ctf_get_int_byte_order(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
913
914 def get_int_len(self):
915 """
916 Return the size, in bits, of an int or a negative
917 value on error.
918 """
135c8f9c 919 return _bt_ctf_get_int_len(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
920
921 def get_encoding(self):
922 """
923 Return the encoding of an int or a string.
924 Return a negative value on error.
925 """
f01efa78 926 return _bt_ctf_get_encoding(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
927
928 def get_array_len(self):
929 """
930 Return the len of an array or a negative
931 value on error.
932 """
f01efa78 933 return _bt_ctf_get_array_len(_bt_ctf_get_decl_from_def(self._d))
24a3136a
DS
934
935 def get_uint64(self):
936 """
937 Return the value associated with the field.
938 If the field does not exist or is not of the type requested,
939 the value returned is undefined. To check if an error occured,
940 use the ctf.field_error() function after accessing a field.
941 """
942 return _bt_ctf_get_uint64(self._d)
943
944 def get_int64(self):
945 """
946 Return the value associated with the field.
947 If the field does not exist or is not of the type requested,
948 the value returned is undefined. To check if an error occured,
949 use the ctf.field_error() function after accessing a field.
950 """
951 return _bt_ctf_get_int64(self._d)
952
953 def get_char_array(self):
954 """
955 Return the value associated with the field.
956 If the field does not exist or is not of the type requested,
957 the value returned is undefined. To check if an error occured,
958 use the ctf.field_error() function after accessing a field.
959 """
960 return _bt_ctf_get_char_array(self._d)
961
962 def get_str(self):
963 """
964 Return the value associated with the field.
965 If the field does not exist or is not of the type requested,
966 the value returned is undefined. To check if an error occured,
967 use the ctf.field_error() function after accessing a field.
968 """
969 return _bt_ctf_get_string(self._d)
970
7a30a668
XH
971 def get_scope(self):
972 """Return the scope of a field or None on error."""
973 return self._s
24a3136a
DS
974
975 class EventDecl(object):
976 """Event declaration class. Do not instantiate."""
977
978 def __init__(self):
979 raise NotImplementedError("ctf.EventDecl cannot be instantiated")
980
981 def __repr__(self):
288209fb 982 return "Babeltrace EventDecl: name {0}".format(self.get_name())
24a3136a
DS
983
984 def get_name(self):
985 """Return the name of the event or None on error"""
986 return _bt_ctf_get_decl_event_name(self._d)
987
988 def get_decl_fields(self, scope):
989 """
990 Return a list of ctf.FieldDecl
991 Return None on error.
992 """
993 ptr_list = _by_python_field_decl_listcaller(self._d, scope)
994
995 if ptr_list is None:
996 return None
997
998 decl_list = []
999 i = 0
1000 while True:
1001 tmp = ctf.FieldDecl.__new__(ctf.FieldDecl)
1002 tmp._d = _bt_python_field_decl_one_from_list(
1003 ptr_list, i)
1004
1005 if tmp._d is None:
1006 #Last item of list is None
1007 break
1008
1009 decl_list.append(tmp)
1010 i += 1
1011 return decl_list
1012
1013
1014 class FieldDecl(object):
1015 """Field declaration class. Do not instantiate."""
1016
1017 def __init__(self):
1018 raise NotImplementedError("ctf.FieldDecl cannot be instantiated")
1019
1020 def __repr__(self):
288209fb 1021 return "Babeltrace FieldDecl: name {0}".format(self.get_name())
24a3136a
DS
1022
1023 def get_name(self):
1024 """Return the name of a FieldDecl or None on error"""
1025 return _bt_ctf_get_decl_field_name(self._d)
1026
1027
1028 @staticmethod
1029 def field_error():
1030 """
1031 Return the last error code encountered while
1032 accessing a field and reset the error flag.
1033 Return 0 if no error, a negative value otherwise.
1034 """
1035 return _bt_ctf_field_get_error()
1036
1037 @staticmethod
1038 def get_event_decl_list(trace_handle, context):
1039 """
1040 Return a list of ctf.EventDecl
1041 Return None on error.
1042 """
1043 try:
1044 handle_id = trace_handle._id
1045 except AttributeError:
1046 raise TypeError("in get_event_decl_list, "
1047 "argument 1 must be a TraceHandle instance")
1048 try:
1049 ptr_list = _bt_python_event_decl_listcaller(handle_id, context._c)
1050 except AttributeError:
1051 raise TypeError("in get_event_decl_list, "
1052 "argument 2 must be a Context instance")
1053
1054 if ptr_list is None:
1055 return None
1056
1057 decl_list = []
1058 i = 0
1059 while True:
1060 tmp = ctf.EventDecl.__new__(ctf.EventDecl)
1061 tmp._d = _bt_python_decl_one_from_list(ptr_list, i)
1062
1063 if tmp._d is None:
1064 #Last item of list is None
1065 break
1066
1067 decl_list.append(tmp)
1068 i += 1
1069 return decl_list
1070
1071%}
1072
1073
1074
1075// =================================================================
1076// NEW FUNCTIONS
1077// File and list-related
1078// python-complements.h
1079// =================================================================
1080
1081%include python-complements.c
1082
1083%pythoncode %{
1084
1085class File(object):
1086 """
1087 Open a file for babeltrace.
1088
1089 file_path is a string containing the path or None to use the
1090 standard output in writing mode.
1091
1092 The mode can be 'r', 'w' or 'a' for reading (default), writing or
1093 appending. The file will be created if it doesn't exist when
1094 opened for writing or appending; it will be truncated when opened
1095 for writing. Add a 'b' to the mode for binary files. Add a '+'
1096 to the mode to allow simultaneous reading and writing.
1097 """
1098
1099 def __new__(cls, file_path, mode='r'):
1100 # __new__ is used to control the return value
1101 # as the File class should return None
1102 # if _bt_file_open returns NULL
1103
1104 # Type check
1105 if file_path is not None and type(file_path) is not str:
1106 raise TypeError("in method __init__, argument 2 of type 'str'")
1107 if type(mode) is not str:
1108 raise TypeError("in method __init__, argument 3 of type 'str'")
1109
1110 # Opening file
1111 file_ptr = _bt_file_open(file_path, mode)
1112 if file_ptr is None:
1113 return None
1114
1115 # Class instantiation
1116 file_inst = super(File, cls).__new__(cls)
1117 file_inst._file = file_ptr
1118 return file_inst
1119
1120 def __init__(self, file_path, mode='r'):
1121 self._opened = True
1122 self._use_stdout = False
1123
1124 if file_path is None:
1125 # use stdout
1126 file_path = "stdout"
1127 mode = 'w'
1128 self._use_stdout = True
1129
1130 self._file_path = file_path
1131 self._mode = mode
1132
1133 def __del__(self):
1134 self.close()
1135
1136 def __repr__(self):
1137 if self._opened:
1138 stat = 'opened'
1139 else:
1140 stat = 'closed'
288209fb 1141 return "{0} babeltrace File; file_path('{1}'), mode('{2}')".format(
24a3136a
DS
1142 stat, self._file_path, self._mode)
1143
1144 def close(self):
1145 """Close the file. Is also called using del."""
1146 if self._opened and not self._use_stdout:
1147 _bt_file_close(self._file)
1148 self._opened = False
1149%}
This page took 0.065693 seconds and 4 git commands to generate.