2 * Copyright (C) 2012 Danny Serres <danny.serres@efficios.com>
4 * SPDX-License-Identifier: GPL-2.0-only
11 The LTTng project aims at providing highly efficient tracing tools for Linux.
12 It's tracers help tracking down performance issues and debugging problems involving
13 multiple concurrent processes and threads. Tracing across multiple systems is also possible."
16 %module(docstring=DOCSTRING) lttng
22 #define SWIG_FILE_WITH_INIT
23 #include <lttng/lttng.h>
27 #if PY_MAJOR_VERSION >= 3
28 // The PyInt and PyLong types were unified as of Python 3
29 // This makes the typemap code useable with both Python 2 and 3.
30 #define PyInt_AsSsize_t PyLong_AsSsize_t
33 // Avoid -Wmissing-declarations warning.
34 PyObject *SWIG_init(void);
36 // Avoid -Wmissing-prototypes warning with SWIG 3.0.10.
37 #if SWIG_VERSION < 0x30012
38 static size_t SWIG_strnlen(const char* s, size_t maxlen);
42 typedef unsigned int uint32_t;
44 typedef unsigned long long uint64_t;
48 // =============================================
50 // These are directly taken from lttng.h.
51 // Any change to these enums must also be
53 // =============================================
55 %rename("DOMAIN_KERNEL") LTTNG_DOMAIN_KERNEL;
56 %rename("DOMAIN_UST") LTTNG_DOMAIN_UST;
57 enum lttng_domain_type {
58 LTTNG_DOMAIN_KERNEL = 1,
62 %rename("BUFFER_PER_PID") LTTNG_BUFFER_PER_PID;
63 %rename("BUFFER_PER_UID") LTTNG_BUFFER_PER_UID;
64 %rename("BUFFER_GLOBAL") LTTNG_BUFFER_GLOBAL;
65 enum lttng_buffer_type {
71 %rename("EVENT_ALL") LTTNG_EVENT_ALL;
72 %rename("EVENT_TRACEPOINT") LTTNG_EVENT_TRACEPOINT;
73 %rename("EVENT_PROBE") LTTNG_EVENT_PROBE;
74 %rename("EVENT_FUNCTION")LTTNG_EVENT_FUNCTION;
75 %rename("EVENT_FUNCTION_ENTRY") LTTNG_EVENT_FUNCTION_ENTRY;
76 %rename("EVENT_NOOP") LTTNG_EVENT_NOOP;
77 %rename("EVENT_SYSCALL") LTTNG_EVENT_SYSCALL;
78 enum lttng_event_type {
80 LTTNG_EVENT_TRACEPOINT = 0,
81 LTTNG_EVENT_PROBE = 1,
82 LTTNG_EVENT_FUNCTION = 2,
83 LTTNG_EVENT_FUNCTION_ENTRY = 3,
85 LTTNG_EVENT_SYSCALL = 5,
88 %rename("EVENT_LOGLEVEL_ALL") LTTNG_EVENT_LOGLEVEL_ALL;
89 %rename("EVENT_LOGLEVEL_RANGE") LTTNG_EVENT_LOGLEVEL_RANGE;
90 %rename("EVENT_LOGLEVEL_SINGLE") LTTNG_EVENT_LOGLEVEL_SINGLE;
91 enum lttng_loglevel_type {
92 LTTNG_EVENT_LOGLEVEL_ALL = 0,
93 LTTNG_EVENT_LOGLEVEL_RANGE = 1,
94 LTTNG_EVENT_LOGLEVEL_SINGLE = 2,
97 %rename("LOGLEVEL_EMERG") LTTNG_LOGLEVEL_EMERG;
98 %rename("LOGLEVEL_ALERT") LTTNG_LOGLEVEL_ALERT;
99 %rename("LOGLEVEL_CRIT") LTTNG_LOGLEVEL_CRIT;
100 %rename("LOGLEVEL_ERR") LTTNG_LOGLEVEL_ERR;
101 %rename("LOGLEVEL_WARNING") LTTNG_LOGLEVEL_WARNING;
102 %rename("LOGLEVEL_NOTICE") LTTNG_LOGLEVEL_NOTICE;
103 %rename("LOGLEVEL_INFO") LTTNG_LOGLEVEL_INFO;
104 %rename("LOGLEVEL_DEBUG_SYSTEM") LTTNG_LOGLEVEL_DEBUG_SYSTEM;
105 %rename("LOGLEVEL_DEBUG_PROGRAM") LTTNG_LOGLEVEL_DEBUG_PROGRAM;
106 %rename("LOGLEVEL_DEBUG_PROCESS") LTTNG_LOGLEVEL_DEBUG_PROCESS;
107 %rename("LOGLEVEL_DEBUG_MODULE") LTTNG_LOGLEVEL_DEBUG_MODULE;
108 %rename("LOGLEVEL_DEBUG_UNIT") LTTNG_LOGLEVEL_DEBUG_UNIT;
109 %rename("LOGLEVEL_DEBUG_FUNCTION") LTTNG_LOGLEVEL_DEBUG_FUNCTION;
110 %rename("LOGLEVEL_DEBUG_LINE") LTTNG_LOGLEVEL_DEBUG_LINE;
111 %rename("LOGLEVEL_DEBUG") LTTNG_LOGLEVEL_DEBUG;
112 enum lttng_loglevel {
113 LTTNG_LOGLEVEL_EMERG = 0,
114 LTTNG_LOGLEVEL_ALERT = 1,
115 LTTNG_LOGLEVEL_CRIT = 2,
116 LTTNG_LOGLEVEL_ERR = 3,
117 LTTNG_LOGLEVEL_WARNING = 4,
118 LTTNG_LOGLEVEL_NOTICE = 5,
119 LTTNG_LOGLEVEL_INFO = 6,
120 LTTNG_LOGLEVEL_DEBUG_SYSTEM = 7,
121 LTTNG_LOGLEVEL_DEBUG_PROGRAM = 8,
122 LTTNG_LOGLEVEL_DEBUG_PROCESS = 9,
123 LTTNG_LOGLEVEL_DEBUG_MODULE = 10,
124 LTTNG_LOGLEVEL_DEBUG_UNIT = 11,
125 LTTNG_LOGLEVEL_DEBUG_FUNCTION = 12,
126 LTTNG_LOGLEVEL_DEBUG_LINE = 13,
127 LTTNG_LOGLEVEL_DEBUG = 14,
130 %rename("EVENT_SPLICE") LTTNG_EVENT_SPLICE;
131 %rename("EVENT_MMAP") LTTNG_EVENT_MMAP;
132 enum lttng_event_output {
133 LTTNG_EVENT_SPLICE = 0,
134 LTTNG_EVENT_MMAP = 1,
137 %rename("EVENT_CONTEXT_PID") LTTNG_EVENT_CONTEXT_PID;
138 %rename("EVENT_CONTEXT_PERF_COUNTER") LTTNG_EVENT_CONTEXT_PERF_COUNTER;
139 %rename("EVENT_CONTEXT_PROCNAME") LTTNG_EVENT_CONTEXT_PROCNAME;
140 %rename("EVENT_CONTEXT_PRIO") LTTNG_EVENT_CONTEXT_PRIO;
141 %rename("EVENT_CONTEXT_NICE") LTTNG_EVENT_CONTEXT_NICE;
142 %rename("EVENT_CONTEXT_VPID") LTTNG_EVENT_CONTEXT_VPID;
143 %rename("EVENT_CONTEXT_TID") LTTNG_EVENT_CONTEXT_TID;
144 %rename("EVENT_CONTEXT_VTID") LTTNG_EVENT_CONTEXT_VTID;
145 %rename("EVENT_CONTEXT_PPID") LTTNG_EVENT_CONTEXT_PPID;
146 %rename("EVENT_CONTEXT_VPPID") LTTNG_EVENT_CONTEXT_VPPID;
147 %rename("EVENT_CONTEXT_PTHREAD_ID") LTTNG_EVENT_CONTEXT_PTHREAD_ID;
148 %rename("EVENT_CONTEXT_HOSTNAME") LTTNG_EVENT_CONTEXT_HOSTNAME;
149 %rename("EVENT_CONTEXT_IP") LTTNG_EVENT_CONTEXT_IP;
150 %rename("EVENT_CONTEXT_PERF_CPU_COUNTER") LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER;
151 %rename("EVENT_CONTEXT_PERF_THREAD_COUNTER") LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER;
152 %rename("EVENT_CONTEXT_APP_CONTEXT") LTTNG_EVENT_CONTEXT_APP_CONTEXT;
153 %rename("EVENT_CONTEXT_INTERRUPTIBLE") LTTNG_EVENT_CONTEXT_INTERRUPTIBLE;
154 %rename("EVENT_CONTEXT_PREEMPTIBLE") LTTNG_EVENT_CONTEXT_PREEMPTIBLE;
155 %rename("EVENT_CONTEXT_NEED_RESCHEDULE") LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE;
156 %rename("EVENT_CONTEXT_MIGRATABLE") LTTNG_EVENT_CONTEXT_MIGRATABLE;
157 enum lttng_event_context_type {
158 LTTNG_EVENT_CONTEXT_PID = 0,
159 LTTNG_EVENT_CONTEXT_PERF_COUNTER = 1,
160 LTTNG_EVENT_CONTEXT_PROCNAME = 2,
161 LTTNG_EVENT_CONTEXT_PRIO = 3,
162 LTTNG_EVENT_CONTEXT_NICE = 4,
163 LTTNG_EVENT_CONTEXT_VPID = 5,
164 LTTNG_EVENT_CONTEXT_TID = 6,
165 LTTNG_EVENT_CONTEXT_VTID = 7,
166 LTTNG_EVENT_CONTEXT_PPID = 8,
167 LTTNG_EVENT_CONTEXT_VPPID = 9,
168 LTTNG_EVENT_CONTEXT_PTHREAD_ID = 10,
169 LTTNG_EVENT_CONTEXT_HOSTNAME = 11,
170 LTTNG_EVENT_CONTEXT_IP = 12,
171 LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER = 13,
172 LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER = 14,
173 LTTNG_EVENT_CONTEXT_APP_CONTEXT = 15,
174 LTTNG_EVENT_CONTEXT_INTERRUPTIBLE = 16,
175 LTTNG_EVENT_CONTEXT_PREEMPTIBLE = 17,
176 LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE = 18,
177 LTTNG_EVENT_CONTEXT_MIGRATABLE = 19,
183 // =============================================
185 // =============================================
188 %typemap(argout) struct lttng_session **sessions{
190 int l = PyInt_AsSsize_t($result);
193 PyObject *sessions = PyList_New(0);
197 PyObject *tmp = PyTuple_New(4);
198 PyObject *name = PyString_FromString((*$1)[i].name);
199 PyObject *path = PyString_FromString((*$1)[i].path);
200 PyObject *enabled = PyInt_FromSize_t((*$1)[i].enabled);
202 PyTuple_SetItem(tmp, 0, name);
203 PyTuple_SetItem(tmp, 1, path);
204 PyTuple_SetItem(tmp, 2, enabled);
205 PyList_Append(sessions, tmp);
210 %typemap(in,numinputs=0) struct lttng_session **sessions (struct lttng_session *temp){
215 %typemap(argout) struct lttng_domain **domains{
217 int l = PyInt_AsSsize_t($result);
220 PyObject *dom = PyList_New(0);
224 PyObject *tmp = PyTuple_New(6);
225 PyObject *type = PyInt_FromSize_t((*$1)[i].type);
226 PyObject *buf_type = PyInt_FromSize_t((*$1)[i].buf_type);
227 PyObject *execname = PyString_FromString((*$1)[i].attr.exec_name);
228 PyObject *pid = PyInt_FromSize_t((*$1)[i].attr.pid);
229 PyObject *padding = PyString_FromString((*$1)[i].padding);
230 PyObject *attrpadding = PyString_FromString((*$1)[i].attr.padding);
232 PyTuple_SetItem(tmp, 0, type);
233 PyTuple_SetItem(tmp, 1, buf_type);
234 PyTuple_SetItem(tmp, 2, padding);
235 PyTuple_SetItem(tmp, 3, pid);
236 PyTuple_SetItem(tmp, 4, execname);
237 PyTuple_SetItem(tmp, 5, attrpadding);
238 PyList_Append(dom, tmp);
243 %typemap(in,numinputs=0) struct lttng_domain **domains (struct lttng_domain *temp){
248 %typemap(argout) struct lttng_channel **channels{
250 int l = PyInt_AsSsize_t($result);
253 PyObject *chan = PyList_New(0);
257 PyObject *tmp = PyTuple_New(4);
258 PyObject *name = PyString_FromString((*$1)[i].name);
259 PyObject *enabled = PyInt_FromSize_t((*$1)[i].enabled);
260 PyObject *padding = PyString_FromString((*$1)[i].padding);
262 PyObject *attrtmp = PyTuple_New(7);
263 PyObject *overwrite = PyInt_FromLong((*$1)[i].attr.overwrite);
264 PyObject *subbuf = PyInt_FromSize_t((*$1)[i].attr.subbuf_size);
265 PyObject *num = PyInt_FromSize_t((*$1)[i].attr.num_subbuf);
266 PyObject *switchtimer = PyInt_FromSize_t((*$1)[i].attr.switch_timer_interval);
267 PyObject *readtimer = PyInt_FromSize_t((*$1)[i].attr.read_timer_interval);
268 PyObject *output = PyInt_FromSize_t((*$1)[i].attr.output);
269 PyObject *attrpad = PyString_FromString((*$1)[i].attr.padding);
271 PyTuple_SetItem(attrtmp, 0, overwrite);
272 PyTuple_SetItem(attrtmp, 1, subbuf);
273 PyTuple_SetItem(attrtmp, 2, num);
274 PyTuple_SetItem(attrtmp, 3, switchtimer);
275 PyTuple_SetItem(attrtmp, 4, readtimer);
276 PyTuple_SetItem(attrtmp, 5, output);
277 PyTuple_SetItem(attrtmp, 6, attrpad);
279 PyTuple_SetItem(tmp, 0, name);
280 PyTuple_SetItem(tmp, 1, enabled);
281 PyTuple_SetItem(tmp, 2, padding);
282 PyTuple_SetItem(tmp, 3, attrtmp);
283 PyList_Append(chan, tmp);
288 %typemap(in,numinputs=0) struct lttng_channel **channels (struct lttng_channel *temp){
292 //list_events & list_tracepoints
293 %typemap(argout) struct lttng_event **events{
295 int l = PyInt_AsSsize_t($result);
298 PyObject *events = PyList_New(0);
302 PyObject *tmp = PyTuple_New(10);
303 PyObject *name = PyString_FromString((*$1)[i].name);
304 PyObject *type = PyInt_FromSize_t((*$1)[i].type);
305 PyObject *logleveltype = PyInt_FromSize_t((*$1)[i].loglevel_type);
306 PyObject *loglevel = PyInt_FromLong((*$1)[i].loglevel);
307 PyObject *enabled = PyInt_FromLong((*$1)[i].enabled);
308 PyObject *pid = PyInt_FromSize_t((*$1)[i].pid);
309 PyObject *padding = PyString_FromString((*$1)[i].padding);
310 PyObject *attrpadding = PyString_FromString((*$1)[i].attr.padding);
312 PyObject *probe = PyTuple_New(4);
313 PyObject *addr = PyInt_FromSize_t((*$1)[i].attr.probe.addr);
314 PyObject *offset = PyInt_FromSize_t((*$1)[i].attr.probe.offset);
315 PyObject *symbolname = PyString_FromString((*$1)[i].attr.probe.symbol_name);
316 PyObject *probepad = PyString_FromString((*$1)[i].attr.probe.padding);
318 PyObject *function = PyTuple_New(2);
319 PyObject *f_symbolname = PyString_FromString((*$1)[i].attr.ftrace.symbol_name);
320 PyObject *f_pad = PyString_FromString((*$1)[i].attr.ftrace.padding);
322 PyTuple_SetItem(function, 0, f_symbolname);
323 PyTuple_SetItem(function, 1, f_pad);
325 PyTuple_SetItem(probe, 0, addr);
326 PyTuple_SetItem(probe, 1, offset);
327 PyTuple_SetItem(probe, 2, symbolname);
328 PyTuple_SetItem(probe, 3, probepad);
330 PyTuple_SetItem(tmp, 0, name);
331 PyTuple_SetItem(tmp, 1, type);
332 PyTuple_SetItem(tmp, 2, logleveltype);
333 PyTuple_SetItem(tmp, 3, loglevel);
334 PyTuple_SetItem(tmp, 4, enabled);
335 PyTuple_SetItem(tmp, 5, pid);
336 PyTuple_SetItem(tmp, 6, padding);
337 PyTuple_SetItem(tmp, 7, probe);
338 PyTuple_SetItem(tmp, 8, function);
339 PyTuple_SetItem(tmp, 9, attrpadding);
340 PyList_Append(events, tmp);
345 %typemap(in,numinputs=0) struct lttng_event **events (struct lttng_event *temp){
351 // =============================================
353 // =============================================
355 %rename("create") lttng_create_session(const char *name, const char *path);
356 %rename("create_snapshot") lttng_create_session_snapshot(const char *name, const char *snapshot_url);
357 %rename("destroy") lttng_destroy_session(const char *name);
358 %rename("_lttng_create_handle") lttng_create_handle(const char *session_name, struct lttng_domain *domain);
359 %rename("_lttng_destroy_handle") lttng_destroy_handle(struct lttng_handle *handle);
360 %rename("_lttng_list_sessions") lttng_list_sessions(struct lttng_session **sessions);
361 %rename("_lttng_list_domains") lttng_list_domains(const char *session_name, struct lttng_domain **domains);
362 %rename("_lttng_list_channels") lttng_list_channels(struct lttng_handle *handle,struct lttng_channel **channels);
363 %rename("_lttng_list_events") lttng_list_events(struct lttng_handle *handle, const char *channel_name, struct lttng_event **events);
364 %rename("_lttng_list_tracepoints") lttng_list_tracepoints(struct lttng_handle *handle, struct lttng_event **events);
365 %rename("session_daemon_alive") lttng_session_daemon_alive(void);
366 %rename("set_tracing_group") lttng_set_tracing_group(const char *name);
367 %rename("strerror") lttng_strerror(int code);
368 %rename("_lttng_register_consumer") lttng_register_consumer(struct lttng_handle *handle, const char *socket_path);
369 %rename("start") lttng_start_tracing(const char *session_name);
370 %rename("stop") lttng_stop_tracing(const char *session_name);
371 %rename("_lttng_add_context") lttng_add_context(struct lttng_handle *handle, struct lttng_event_context *ctx, const char *event_name, const char *channel_name);
372 %rename("_lttng_enable_event") lttng_enable_event(struct lttng_handle *handle, struct lttng_event *ev, const char *channel_name);
373 %rename("_lttng_enable_channel") lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *chan);
374 %rename("_lttng_disable_event") lttng_disable_event(struct lttng_handle *handle, const char *name, const char *channel_name);
375 %rename("_lttng_disable_channel") lttng_disable_channel(struct lttng_handle *handle, const char *name);
376 %rename("channel_set_default_attr") lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr);
378 //Redefined functions
379 struct lttng_handle *lttng_create_handle(const char *session_name,
380 struct lttng_domain *domain);
381 void lttng_destroy_handle(struct lttng_handle *handle);
382 int lttng_list_channels(struct lttng_handle *handle,struct lttng_channel **channels);
383 int lttng_list_events(struct lttng_handle *handle,
384 const char *channel_name, struct lttng_event **events);
385 int lttng_list_tracepoints(struct lttng_handle *handle, struct lttng_event **events);
386 int lttng_add_context(struct lttng_handle *handle, struct lttng_event_context *ctx,
387 const char *event_name, const char *channel_name);
388 int lttng_enable_event(struct lttng_handle *handle,
389 struct lttng_event *ev, const char *channel_name);
390 int lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *chan);
391 int lttng_disable_event(struct lttng_handle *handle,
392 const char *name, const char *channel_name);
393 int lttng_disable_channel(struct lttng_handle *handle, const char *name);
394 int lttng_register_consumer(struct lttng_handle *handle, const char *socket_path);
395 int lttng_list_sessions(struct lttng_session **sessions);
396 int lttng_list_domains(const char *session_name, struct lttng_domain **domains);
398 //Functions not needing redefinition
399 %feature("docstring")"create(str name, str path) -> int
401 Create a new tracing session using name and path.
402 Returns 0 on success or a negative error code."
403 int lttng_create_session(const char *name, const char *path);
405 %feature("docstring")"create_snapshot(str name, str snapshot_url) -> int
407 Create a new tracing session using name and snapshot_url in snapshot
408 mode (flight recorder).
409 Returns 0 on success or a negative error code."
410 int lttng_create_session_snapshot(const char *name, const char *path);
412 %feature("docstring")"destroy(str name) -> int
414 Tear down tracing session using name.
415 Returns 0 on success or a negative error code."
416 int lttng_destroy_session(const char *name);
419 %feature("docstring")"session_daemon_alive() -> int
421 Check if session daemon is alive.
422 Return 1 if alive or 0 if not.
423 On error returns a negative value."
424 int lttng_session_daemon_alive(void);
427 %feature("docstring")"set_tracing_group(str name) -> int
429 Sets the tracing_group variable with name.
430 This function allocates memory pointed to by tracing_group.
431 On success, returns 0, on error, returns -1 (null name) or -ENOMEM."
432 int lttng_set_tracing_group(const char *name);
435 %feature("docstring")"strerror(int code) -> char
437 Returns a human readable string describing
438 the error code (a negative value)."
439 const char *lttng_strerror(int code);
442 %feature("docstring")"start(str session_name) -> int
444 Start tracing for all traces of the session.
445 Returns size of returned session payload data or a negative error code."
446 int lttng_start_tracing(const char *session_name);
449 %feature("docstring")"stop(str session_name) -> int
451 Stop tracing for all traces of the session.
452 Returns size of returned session payload data or a negative error code."
453 int lttng_stop_tracing(const char *session_name);
456 %feature("docstring")"channel_set_default_attr(Domain domain, ChannelAttr attr)
458 Set default channel attributes.
459 If either or both of the arguments are null, attr content is zeroe'd."
460 void lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr);
463 // =============================================
464 // Python redefinition of some functions
465 // (List and Handle-related)
466 // =============================================
468 %feature("docstring")""
473 list_sessions() -> dict
475 Ask the session daemon for all available sessions.
476 Returns a dict of Session instances, the key is the name;
477 on error, returns a negative value.
480 ses_list = _lttng_list_sessions()
481 if type(ses_list) is int:
486 for ses_elements in ses_list:
488 ses.name = ses_elements[0]
489 ses.path = ses_elements[1]
490 ses.enabled = ses_elements[2]
491 ses.padding = ses_elements[3]
493 sessions[ses.name] = ses
498 def list_domains(session_name):
500 list_domains(str session_name) -> list
502 Ask the session daemon for all available domains of a session.
503 Returns a list of Domain instances;
504 on error, returns a negative value.
507 dom_list = _lttng_list_domains(session_name)
508 if type(dom_list) is int:
513 for dom_elements in dom_list:
515 dom.type = dom_elements[0]
516 dom.buf_type = dom_elements[1]
517 dom.paddinf = dom_elements[2]
518 dom.attr.pid = dom_elements[3]
519 dom.attr.exec_name = dom_elements[4]
520 dom.attr.padding = dom_elements[5]
527 def list_channels(handle):
529 list_channels(Handle handle) -> dict
531 Ask the session daemon for all available channels of a session.
532 Returns a dict of Channel instances, the key is the name;
533 on error, returns a negative value.
537 chan_list = _lttng_list_channels(handle._h)
538 except AttributeError:
539 raise TypeError("in method 'list_channels', argument 1 must be a Handle instance")
541 if type(chan_list) is int:
546 for channel_elements in chan_list:
548 chan.name = channel_elements[0]
549 chan.enabled = channel_elements[1]
550 chan.padding = channel_elements[2]
551 chan.attr.overwrite = channel_elements[3][0]
552 chan.attr.subbuf_size = channel_elements[3][1]
553 chan.attr.num_subbuf = channel_elements[3][2]
554 chan.attr.switch_timer_interval = channel_elements[3][3]
555 chan.attr.read_timer_interval = channel_elements[3][4]
556 chan.attr.output = channel_elements[3][5]
557 chan.attr.padding = channel_elements[3][6]
559 channels[chan.name] = chan
564 def list_events(handle, channel_name):
566 list_events(Handle handle, str channel_name) -> dict
568 Ask the session daemon for all available events of a session channel.
569 Returns a dict of Event instances, the key is the name;
570 on error, returns a negative value.
574 ev_list = _lttng_list_events(handle._h, channel_name)
575 except AttributeError:
576 raise TypeError("in method 'list_events', argument 1 must be a Handle instance")
578 if type(ev_list) is int:
583 for ev_elements in ev_list:
585 ev.name = ev_elements[0]
586 ev.type = ev_elements[1]
587 ev.loglevel_type = ev_elements[2]
588 ev.loglevel = ev_elements[3]
589 ev.enabled = ev_elements[4]
590 ev.pid = ev_elements[5]
591 ev.attr.padding = ev_elements[6]
592 ev.attr.probe.addr = ev_elements[7][0]
593 ev.attr.probe.offset = ev_elements[7][1]
594 ev.attr.probe.symbol_name = ev_elements[7][2]
595 ev.attr.probe.padding = ev_elements[7][3]
596 ev.attr.ftrace.symbol_name = ev_elements[8][0]
597 ev.attr.ftrace.padding = ev_elements[8][1]
598 ev.attr.padding = ev_elements[9]
605 def list_tracepoints(handle):
607 list_tracepoints(Handle handle) -> dict
609 Returns a dict of Event instances, the key is the name;
610 on error, returns a negative value.
614 ev_list = _lttng_list_tracepoints(handle._h)
615 except AttributeError:
616 raise TypeError("in method 'list_tracepoints', argument 1 must be a Handle instance")
618 if type(ev_list) is int:
623 for ev_elements in ev_list:
625 ev.name = ev_elements[0]
626 ev.type = ev_elements[1]
627 ev.loglevel_type = ev_elements[2]
628 ev.loglevel = ev_elements[3]
629 ev.enabled = ev_elements[4]
630 ev.pid = ev_elements[5]
631 ev.attr.padding = ev_elements[6]
632 ev.attr.probe.addr = ev_elements[7][0]
633 ev.attr.probe.offset = ev_elements[7][1]
634 ev.attr.probe.symbol_name = ev_elements[7][2]
635 ev.attr.probe.padding = ev_elements[7][3]
636 ev.attr.ftrace.symbol_name = ev_elements[8][0]
637 ev.attr.ftrace.padding = ev_elements[8][1]
638 ev.attr.padding = ev_elements[9]
645 def register_consumer(handle, socket_path):
647 register_consumer(Handle handle, str socket_path) -> int
649 Register an outside consumer.
650 Returns size of returned session payload data or a negative error code.
654 return _lttng_register_consumer(handle._h, socket_path)
655 except AttributeError:
656 raise TypeError("in method 'register_consumer', argument 1 must be a Handle instance")
659 def add_context(handle, event_context, event_name, channel_name):
661 add_context(Handle handle, EventContext ctx,
662 str event_name, str channel_name) -> int
664 Add context to event and/or channel.
665 If event_name is None, the context is applied to all events of the channel.
666 If channel_name is None, a lookup of the event's channel is done.
667 If both are None, the context is applied to all events of all channels.
668 Returns the size of the returned payload data or a negative error code.
672 return _lttng_add_context(handle._h, event_context, event_name, channel_name)
673 except AttributeError:
674 raise TypeError("in method 'add_context', argument 1 must be a Handle instance")
677 def enable_event(handle, event, channel_name):
679 enable_event(Handle handle, Event event,
680 str channel_name) -> int
682 Enable event(s) for a channel.
683 If no event name is specified, all events are enabled.
684 If no channel name is specified, the default 'channel0' is used.
685 Returns size of returned session payload data or a negative error code.
689 return _lttng_enable_event(handle._h, event, channel_name)
690 except AttributeError:
691 raise TypeError("in method 'enable_event', argument 1 must be a Handle instance")
694 def enable_channel(handle, channel):
696 enable_channel(Handle handle, Channel channel -> int
698 Enable channel per domain
699 Returns size of returned session payload data or a negative error code.
703 return _lttng_enable_channel(handle._h, channel)
704 except AttributeError:
705 raise TypeError("in method 'enable_channel', argument 1 must be a Handle instance")
708 def disable_event(handle, name, channel_name):
710 disable_event(Handle handle, str name, str channel_name) -> int
712 Disable event(s) of a channel and domain.
713 If no event name is specified, all events are disabled.
714 If no channel name is specified, the default 'channel0' is used.
715 Returns size of returned session payload data or a negative error code
719 return _lttng_disable_event(handle._h, name, channel_name)
720 except AttributeError:
721 raise TypeError("in method 'disable_event', argument 1 must be a Handle instance")
724 def disable_channel(handle, name):
726 disable_channel(Handle handle, str name) -> int
728 All tracing will be stopped for registered events of the channel.
729 Returns size of returned session payload data or a negative error code.
733 return _lttng_disable_channel(handle._h, name)
734 except AttributeError:
735 raise TypeError("in method 'disable_channel', argument 1 must be a Handle instance")
739 // =============================================
741 // Used to prevent freeing unallocated memory
742 // =============================================
744 %feature("docstring")""
745 %feature("autodoc", "1");
751 Takes two arguments: (str session_name, Domain domain)
756 def __init__(self, session_name, domain):
757 if type(session_name) is not str:
758 raise TypeError("in method '__init__', argument 2 of type 'str'")
759 if type(domain) is not Domain and domain is not None:
760 raise TypeError("in method '__init__', argument 3 of type 'lttng.Domain'")
762 self._sname = session_name
766 self._domtype = domain.type
767 self._h = _lttng_create_handle(session_name, domain)
771 _lttng_destroy_handle(self._h)
774 if self._domtype == 1:
775 domstr = "DOMAIN_KERNEL"
776 elif self._domtype == 2:
777 domstr = "DOMAIN_UST"
779 domstr = self._domtype
781 return "lttng.Handle; session('{}'), domain.type({})".format(
784 def __setattr__(self, attr, val):
786 raise NotImplementedError("cannot modify attributes")
788 self.__dict__[attr] = val
792 // =============================================
794 // These are directly taken from lttng.h.
795 // Any change to these structures must also be
797 // =============================================
799 %rename("Domain") lttng_domain;
800 %rename("EventContext") lttng_event_context;
801 %rename("Event") lttng_event;
802 %rename("ChannelAttr") lttng_channel_attr;
803 %rename("Channel") lttng_channel;
804 %rename("Session") lttng_session;
807 enum lttng_domain_type type;
808 enum lttng_buffer_type buf_type;
809 char padding[LTTNG_DOMAIN_PADDING1];
813 char exec_name[NAME_MAX];
814 char padding[LTTNG_DOMAIN_PADDING2];
819 static char temp[256];
820 static char domain_type[25];
821 static char buffer_type[25];
822 switch ( $self->type ) {
824 sprintf(domain_type, "type(DOMAIN_KERNEL)");
827 sprintf(domain_type, "type(DOMAIN_UST)");
830 sprintf(domain_type, "type(%i)", $self->type);
834 switch ( $self->buf_type ) {
835 case LTTNG_BUFFER_PER_UID:
836 sprintf(buffer_type, "buf_type(BUFFER_PER_UID)");
838 case LTTNG_BUFFER_PER_PID:
839 sprintf(buffer_type, "buf_type(BUFFER_PER_PID)");
841 case LTTNG_BUFFER_GLOBAL:
842 sprintf(buffer_type, "buf_type(BUFFER_GLOBAL)");
845 sprintf(buffer_type, "buf_type(%i)", $self->buf_type);
849 sprintf(temp, "lttng.Domain; %s, %s",
858 struct lttng_event_context {
859 enum lttng_event_context_type ctx;
860 char padding[LTTNG_EVENT_CONTEXT_PADDING1];
863 struct lttng_event_perf_counter_ctx perf_counter;
864 char padding[LTTNG_EVENT_CONTEXT_PADDING2];
869 static char temp[256];
870 switch ( $self->ctx ) {
872 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PID)");
875 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_COUNTER)");
878 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PROCNAME)");
881 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PRIO)");
884 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_NICE)");
887 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VPID)");
890 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_TID)");
893 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VTID)");
896 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PPID)");
899 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VPPID)");
902 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PTHREAD_ID)");
905 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_HOSTNAME)");
908 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_IP)");
911 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_CPU_COUNTER)");
914 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_THREAD_COUNTER)");
917 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_APP_CONTEXT)");
920 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_INTERRUPTIBLE)");
923 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PREEMPTIBLE)");
926 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_NEED_RESCHEDULE)");
929 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_MIGRATABLE)");
932 sprintf(temp, "lttng.EventContext; type(%i)", $self->ctx);
940 struct lttng_event_probe_attr {
943 char symbol_name[LTTNG_SYMBOL_NAME_LEN];
944 char padding[LTTNG_EVENT_PROBE_PADDING1];
947 struct lttng_event_function_attr {
948 char symbol_name[LTTNG_SYMBOL_NAME_LEN];
949 char padding[LTTNG_EVENT_FUNCTION_PADDING1];
953 enum lttng_event_type type;
954 char name[LTTNG_SYMBOL_NAME_LEN];
956 enum lttng_loglevel_type loglevel_type;
962 char padding[LTTNG_EVENT_PADDING1];
965 struct lttng_event_probe_attr probe;
966 struct lttng_event_function_attr ftrace;
968 char padding[LTTNG_EVENT_PADDING2];
973 static char temp[512];
977 switch ( $self->type ) {
979 sprintf(evtype, "EVENT_ALL");
982 sprintf(evtype, "EVENT_TRACEPOINT");
985 sprintf(evtype, "EVENT_PROBE");
988 sprintf(evtype, "EVENT_FUNCTION");
991 sprintf(evtype, "EVENT_FUNCTION_ENTRY");
994 sprintf(evtype, "EVENT_NOOP");
997 sprintf(evtype, "EVENT_SYSCALL");
1000 sprintf(evtype, "%i", $self->type);
1004 switch ( $self->loglevel_type ) {
1006 sprintf(logtype, "EVENT_LOGLEVEL_ALL");
1009 sprintf(logtype, "EVENT_LOGLEVEL_RANGE");
1012 sprintf(logtype, "EVENT_LOGLEVEL_SINGLE");
1015 sprintf(logtype, "%i", $self->loglevel_type);
1019 sprintf(temp, "lttng.Event; name('%s'), type(%s), "
1020 "loglevel_type(%s), loglevel(%i), "
1021 "enabled(%s), pid(%i)",
1022 $self->name, evtype, logtype, $self->loglevel,
1023 $self->enabled ? "True" : "False", $self->pid);
1029 struct lttng_channel_attr {
1031 uint64_t subbuf_size;
1032 uint64_t num_subbuf;
1033 unsigned int switch_timer_interval;
1034 unsigned int read_timer_interval;
1035 enum lttng_event_output output;
1037 char padding[LTTNG_CHANNEL_ATTR_PADDING1];
1041 static char temp[256];
1044 switch ( $self->output ) {
1046 sprintf(evout, "EVENT_SPLICE");
1049 sprintf(evout, "EVENT_MMAP");
1052 sprintf(evout, "%i", $self->output);
1055 sprintf(temp, "lttng.ChannelAttr; overwrite(%i), subbuf_size(%"PRIu64"), "
1056 "num_subbuf(%"PRIu64"), switch_timer_interval(%u), "
1057 "read_timer_interval(%u), output(%s)",
1058 $self->overwrite, $self->subbuf_size, $self->num_subbuf,
1059 $self->switch_timer_interval, $self->read_timer_interval,
1066 struct lttng_channel {
1067 char name[LTTNG_SYMBOL_NAME_LEN];
1069 struct lttng_channel_attr attr;
1070 char padding[LTTNG_CHANNEL_PADDING1];
1074 static char temp[512];
1075 snprintf(temp, sizeof(temp), "lttng.Channel; name('%s'), enabled(%s)",
1076 $self->name, $self->enabled ? "True" : "False");
1082 struct lttng_session {
1083 char name[NAME_MAX];
1084 char path[PATH_MAX];
1086 uint32_t snapshot_mode;
1087 unsigned int live_timer_interval;
1089 char padding[LTTNG_SESSION_PADDING1];
1095 static char temp[PATH_MAX + NAME_MAX + 512];
1096 snprintf(temp, sizeof(temp), "lttng.Session; name('%s'), path('%s'), enabled(%s)",
1097 $self->name, $self->path,
1098 $self->enabled ? "True" : "False");