Fix: update context types for Python bindings
[lttng-tools.git] / extras / bindings / swig / python / lttng.i.in
CommitLineData
36907cb5
DS
1%define DOCSTRING
2"LTTNG_VERSION_STR
3
4The LTTng project aims at providing highly efficient tracing tools for Linux.
5It's tracers help tracking down performance issues and debugging problems involving
6multiple concurrent processes and threads. Tracing across multiple systems is also possible."
7%enddef
8
9%module(docstring=DOCSTRING) lttng
10
11%include "typemaps.i"
bc3bdada 12%include "stdint.i"
36907cb5
DS
13%include "pyabc.i"
14%{
15#define SWIG_FILE_WITH_INIT
16#include <lttng/lttng.h>
17%}
18
6c7ee73e
JG
19%{
20#if PY_MAJOR_VERSION >= 3
21// The PyInt and PyLong types were unified as of Python 3
22// This makes the typemap code useable with both Python 2 and 3.
23#define PyInt_AsSsize_t PyLong_AsSsize_t
24#endif
25%}
26
36907cb5
DS
27typedef unsigned int uint32_t;
28typedef int int32_t;
29typedef unsigned long long uint64_t;
30typedef long pid_t;
31
32
33// =============================================
34// ENUMS
35// These are directly taken from lttng.h.
36// Any change to these enums must also be
37// made here.
38// =============================================
39
40%rename("DOMAIN_KERNEL") LTTNG_DOMAIN_KERNEL;
41%rename("DOMAIN_UST") LTTNG_DOMAIN_UST;
42enum lttng_domain_type {
43 LTTNG_DOMAIN_KERNEL = 1,
44 LTTNG_DOMAIN_UST = 2,
45};
46
fe1b18eb
JR
47%rename("BUFFER_PER_PID") LTTNG_BUFFER_PER_PID;
48%rename("BUFFER_PER_UID") LTTNG_BUFFER_PER_UID;
49%rename("BUFFER_GLOBAL") LTTNG_BUFFER_GLOBAL;
50enum lttng_buffer_type {
51 LTTNG_BUFFER_PER_PID,
52 LTTNG_BUFFER_PER_UID,
53 LTTNG_BUFFER_GLOBAL,
54};
55
36907cb5
DS
56%rename("EVENT_ALL") LTTNG_EVENT_ALL;
57%rename("EVENT_TRACEPOINT") LTTNG_EVENT_TRACEPOINT;
58%rename("EVENT_PROBE") LTTNG_EVENT_PROBE;
59%rename("EVENT_FUNCTION")LTTNG_EVENT_FUNCTION;
60%rename("EVENT_FUNCTION_ENTRY") LTTNG_EVENT_FUNCTION_ENTRY;
61%rename("EVENT_NOOP") LTTNG_EVENT_NOOP;
62%rename("EVENT_SYSCALL") LTTNG_EVENT_SYSCALL;
63enum lttng_event_type {
64 LTTNG_EVENT_ALL = -1,
65 LTTNG_EVENT_TRACEPOINT = 0,
66 LTTNG_EVENT_PROBE = 1,
67 LTTNG_EVENT_FUNCTION = 2,
68 LTTNG_EVENT_FUNCTION_ENTRY = 3,
69 LTTNG_EVENT_NOOP = 4,
70 LTTNG_EVENT_SYSCALL = 5,
71};
72
73%rename("EVENT_LOGLEVEL_ALL") LTTNG_EVENT_LOGLEVEL_ALL;
74%rename("EVENT_LOGLEVEL_RANGE") LTTNG_EVENT_LOGLEVEL_RANGE;
75%rename("EVENT_LOGLEVEL_SINGLE") LTTNG_EVENT_LOGLEVEL_SINGLE;
76enum lttng_loglevel_type {
77 LTTNG_EVENT_LOGLEVEL_ALL = 0,
78 LTTNG_EVENT_LOGLEVEL_RANGE = 1,
79 LTTNG_EVENT_LOGLEVEL_SINGLE = 2,
80};
81
82%rename("LOGLEVEL_EMERG") LTTNG_LOGLEVEL_EMERG;
83%rename("LOGLEVEL_ALERT") LTTNG_LOGLEVEL_ALERT;
84%rename("LOGLEVEL_CRIT") LTTNG_LOGLEVEL_CRIT;
85%rename("LOGLEVEL_ERR") LTTNG_LOGLEVEL_ERR;
86%rename("LOGLEVEL_WARNING") LTTNG_LOGLEVEL_WARNING;
87%rename("LOGLEVEL_NOTICE") LTTNG_LOGLEVEL_NOTICE;
88%rename("LOGLEVEL_INFO") LTTNG_LOGLEVEL_INFO;
89%rename("LOGLEVEL_DEBUG_SYSTEM") LTTNG_LOGLEVEL_DEBUG_SYSTEM;
90%rename("LOGLEVEL_DEBUG_PROGRAM") LTTNG_LOGLEVEL_DEBUG_PROGRAM;
91%rename("LOGLEVEL_DEBUG_PROCESS") LTTNG_LOGLEVEL_DEBUG_PROCESS;
92%rename("LOGLEVEL_DEBUG_MODULE") LTTNG_LOGLEVEL_DEBUG_MODULE;
93%rename("LOGLEVEL_DEBUG_UNIT") LTTNG_LOGLEVEL_DEBUG_UNIT;
94%rename("LOGLEVEL_DEBUG_FUNCTION") LTTNG_LOGLEVEL_DEBUG_FUNCTION;
95%rename("LOGLEVEL_DEBUG_LINE") LTTNG_LOGLEVEL_DEBUG_LINE;
96%rename("LOGLEVEL_DEBUG") LTTNG_LOGLEVEL_DEBUG;
97enum lttng_loglevel {
98 LTTNG_LOGLEVEL_EMERG = 0,
99 LTTNG_LOGLEVEL_ALERT = 1,
100 LTTNG_LOGLEVEL_CRIT = 2,
101 LTTNG_LOGLEVEL_ERR = 3,
102 LTTNG_LOGLEVEL_WARNING = 4,
103 LTTNG_LOGLEVEL_NOTICE = 5,
104 LTTNG_LOGLEVEL_INFO = 6,
105 LTTNG_LOGLEVEL_DEBUG_SYSTEM = 7,
106 LTTNG_LOGLEVEL_DEBUG_PROGRAM = 8,
107 LTTNG_LOGLEVEL_DEBUG_PROCESS = 9,
108 LTTNG_LOGLEVEL_DEBUG_MODULE = 10,
109 LTTNG_LOGLEVEL_DEBUG_UNIT = 11,
110 LTTNG_LOGLEVEL_DEBUG_FUNCTION = 12,
111 LTTNG_LOGLEVEL_DEBUG_LINE = 13,
112 LTTNG_LOGLEVEL_DEBUG = 14,
113};
114
115%rename("EVENT_SPLICE") LTTNG_EVENT_SPLICE;
116%rename("EVENT_MMAP") LTTNG_EVENT_MMAP;
117enum lttng_event_output {
118 LTTNG_EVENT_SPLICE = 0,
119 LTTNG_EVENT_MMAP = 1,
120};
121
122%rename("EVENT_CONTEXT_PID") LTTNG_EVENT_CONTEXT_PID;
123%rename("EVENT_CONTEXT_PERF_COUNTER") LTTNG_EVENT_CONTEXT_PERF_COUNTER;
124%rename("EVENT_CONTEXT_PROCNAME") LTTNG_EVENT_CONTEXT_PROCNAME;
125%rename("EVENT_CONTEXT_PRIO") LTTNG_EVENT_CONTEXT_PRIO;
126%rename("EVENT_CONTEXT_NICE") LTTNG_EVENT_CONTEXT_NICE;
127%rename("EVENT_CONTEXT_VPID") LTTNG_EVENT_CONTEXT_VPID;
128%rename("EVENT_CONTEXT_TID") LTTNG_EVENT_CONTEXT_TID;
129%rename("EVENT_CONTEXT_VTID") LTTNG_EVENT_CONTEXT_VTID;
130%rename("EVENT_CONTEXT_PPID") LTTNG_EVENT_CONTEXT_PPID;
131%rename("EVENT_CONTEXT_VPPID") LTTNG_EVENT_CONTEXT_VPPID;
132%rename("EVENT_CONTEXT_PTHREAD_ID") LTTNG_EVENT_CONTEXT_PTHREAD_ID;
5211dfc7
CB
133%rename("EVENT_CONTEXT_HOSTNAME") LTTNG_EVENT_CONTEXT_HOSTNAME;
134%rename("EVENT_CONTEXT_IP") LTTNG_EVENT_CONTEXT_IP;
135%rename("EVENT_CONTEXT_PERF_CPU_COUNTER") LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER;
136%rename("EVENT_CONTEXT_PERF_THREAD_COUNTER") LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER;
137%rename("EVENT_CONTEXT_APP_CONTEXT") LTTNG_EVENT_CONTEXT_APP_CONTEXT;
138%rename("EVENT_CONTEXT_INTERRUPTIBLE") LTTNG_EVENT_CONTEXT_INTERRUPTIBLE;
139%rename("EVENT_CONTEXT_PREEMPTIBLE") LTTNG_EVENT_CONTEXT_PREEMPTIBLE;
140%rename("EVENT_CONTEXT_NEED_RESCHEDULE") LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE;
141%rename("EVENT_CONTEXT_MIGRATABLE") LTTNG_EVENT_CONTEXT_MIGRATABLE;
36907cb5
DS
142enum lttng_event_context_type {
143 LTTNG_EVENT_CONTEXT_PID = 0,
144 LTTNG_EVENT_CONTEXT_PERF_COUNTER = 1,
145 LTTNG_EVENT_CONTEXT_PROCNAME = 2,
146 LTTNG_EVENT_CONTEXT_PRIO = 3,
147 LTTNG_EVENT_CONTEXT_NICE = 4,
148 LTTNG_EVENT_CONTEXT_VPID = 5,
149 LTTNG_EVENT_CONTEXT_TID = 6,
150 LTTNG_EVENT_CONTEXT_VTID = 7,
151 LTTNG_EVENT_CONTEXT_PPID = 8,
152 LTTNG_EVENT_CONTEXT_VPPID = 9,
153 LTTNG_EVENT_CONTEXT_PTHREAD_ID = 10,
5211dfc7
CB
154 LTTNG_EVENT_CONTEXT_HOSTNAME = 11,
155 LTTNG_EVENT_CONTEXT_IP = 12,
156 LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER = 13,
157 LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER = 14,
158 LTTNG_EVENT_CONTEXT_APP_CONTEXT = 15,
159 LTTNG_EVENT_CONTEXT_INTERRUPTIBLE = 16,
160 LTTNG_EVENT_CONTEXT_PREEMPTIBLE = 17,
161 LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE = 18,
162 LTTNG_EVENT_CONTEXT_MIGRATABLE = 19,
36907cb5
DS
163};
164
36907cb5
DS
165
166
167
168// =============================================
169// TYPEMAPS
170// =============================================
171
172//list_sessions
173%typemap(argout) struct lttng_session **sessions{
174
175 int l = PyInt_AsSsize_t($result);
176 if (l >= 0)
177 {
178 PyObject *sessions = PyList_New(0);
179 int i;
180 for(i=0; i<l; i++)
181 {
182 PyObject *tmp = PyTuple_New(4);
183 PyObject *name = PyString_FromString((*$1)[i].name);
184 PyObject *path = PyString_FromString((*$1)[i].path);
185 PyObject *enabled = PyInt_FromSize_t((*$1)[i].enabled);
186 PyObject *padding = PyString_FromString((*$1)[i].padding);
187
188 PyTuple_SetItem(tmp, 0, name);
189 PyTuple_SetItem(tmp, 1, path);
190 PyTuple_SetItem(tmp, 2, enabled);
191 PyTuple_SetItem(tmp, 3, padding);
192 PyList_Append(sessions, tmp);
193 }
194 $result = sessions;
195 }
196}
197%typemap(in,numinputs=0) struct lttng_session **sessions (struct lttng_session *temp){
198 $1=&temp;
199}
200
201//list_domains
202%typemap(argout) struct lttng_domain **domains{
203
204 int l = PyInt_AsSsize_t($result);
205 if (l >= 0)
206 {
207 PyObject *dom = PyList_New(0);
208 int i;
209 for(i=0; i<l; i++)
210 {
fe1b18eb 211 PyObject *tmp = PyTuple_New(6);
36907cb5 212 PyObject *type = PyInt_FromSize_t((*$1)[i].type);
fe1b18eb 213 PyObject *buf_type = PyInt_FromSize_t((*$1)[i].buf_type);
36907cb5
DS
214 PyObject *execname = PyString_FromString((*$1)[i].attr.exec_name);
215 PyObject *pid = PyInt_FromSize_t((*$1)[i].attr.pid);
216 PyObject *padding = PyString_FromString((*$1)[i].padding);
217 PyObject *attrpadding = PyString_FromString((*$1)[i].attr.padding);
218
219 PyTuple_SetItem(tmp, 0, type);
fe1b18eb
JR
220 PyTuple_SetItem(tmp, 1, buf_type);
221 PyTuple_SetItem(tmp, 2, padding);
222 PyTuple_SetItem(tmp, 3, pid);
223 PyTuple_SetItem(tmp, 4, execname);
224 PyTuple_SetItem(tmp, 5, attrpadding);
36907cb5
DS
225 PyList_Append(dom, tmp);
226 }
227 $result = dom;
228 }
229}
230%typemap(in,numinputs=0) struct lttng_domain **domains (struct lttng_domain *temp){
231 $1=&temp;
232}
233
234//list_channels
235%typemap(argout) struct lttng_channel **channels{
236
237 int l = PyInt_AsSsize_t($result);
238 if (l >= 0)
239 {
240 PyObject *chan = PyList_New(0);
241 int i;
242 for(i=0; i<l; i++)
243 {
244 PyObject *tmp = PyTuple_New(4);
245 PyObject *name = PyString_FromString((*$1)[i].name);
246 PyObject *enabled = PyInt_FromSize_t((*$1)[i].enabled);
247 PyObject *padding = PyString_FromString((*$1)[i].padding);
248
249 PyObject *attrtmp = PyTuple_New(7);
250 PyObject *overwrite = PyInt_FromLong((*$1)[i].attr.overwrite);
251 PyObject *subbuf = PyInt_FromSize_t((*$1)[i].attr.subbuf_size);
252 PyObject *num = PyInt_FromSize_t((*$1)[i].attr.num_subbuf);
253 PyObject *switchtimer = PyInt_FromSize_t((*$1)[i].attr.switch_timer_interval);
254 PyObject *readtimer = PyInt_FromSize_t((*$1)[i].attr.read_timer_interval);
255 PyObject *output = PyInt_FromSize_t((*$1)[i].attr.output);
256 PyObject *attrpad = PyString_FromString((*$1)[i].attr.padding);
257
258 PyTuple_SetItem(attrtmp, 0, overwrite);
259 PyTuple_SetItem(attrtmp, 1, subbuf);
260 PyTuple_SetItem(attrtmp, 2, num);
261 PyTuple_SetItem(attrtmp, 3, switchtimer);
262 PyTuple_SetItem(attrtmp, 4, readtimer);
263 PyTuple_SetItem(attrtmp, 5, output);
264 PyTuple_SetItem(attrtmp, 6, attrpad);
265
266 PyTuple_SetItem(tmp, 0, name);
267 PyTuple_SetItem(tmp, 1, enabled);
268 PyTuple_SetItem(tmp, 2, padding);
269 PyTuple_SetItem(tmp, 3, attrtmp);
270 PyList_Append(chan, tmp);
271 }
272 $result = chan;
273 }
274}
275%typemap(in,numinputs=0) struct lttng_channel **channels (struct lttng_channel *temp){
276 $1=&temp;
277}
278
279//list_events & list_tracepoints
280%typemap(argout) struct lttng_event **events{
281
282 int l = PyInt_AsSsize_t($result);
283 if (l >= 0)
284 {
285 PyObject *events = PyList_New(0);
286 int i;
287 for(i=0; i<l; i++)
288 {
289 PyObject *tmp = PyTuple_New(10);
290 PyObject *name = PyString_FromString((*$1)[i].name);
291 PyObject *type = PyInt_FromSize_t((*$1)[i].type);
292 PyObject *logleveltype = PyInt_FromSize_t((*$1)[i].loglevel_type);
293 PyObject *loglevel = PyInt_FromLong((*$1)[i].loglevel);
294 PyObject *enabled = PyInt_FromLong((*$1)[i].enabled);
295 PyObject *pid = PyInt_FromSize_t((*$1)[i].pid);
296 PyObject *padding = PyString_FromString((*$1)[i].padding);
297 PyObject *attrpadding = PyString_FromString((*$1)[i].attr.padding);
298
299 PyObject *probe = PyTuple_New(4);
300 PyObject *addr = PyInt_FromSize_t((*$1)[i].attr.probe.addr);
301 PyObject *offset = PyInt_FromSize_t((*$1)[i].attr.probe.offset);
302 PyObject *symbolname = PyString_FromString((*$1)[i].attr.probe.symbol_name);
303 PyObject *probepad = PyString_FromString((*$1)[i].attr.probe.padding);
304
305 PyObject *function = PyTuple_New(2);
306 PyObject *f_symbolname = PyString_FromString((*$1)[i].attr.ftrace.symbol_name);
307 PyObject *f_pad = PyString_FromString((*$1)[i].attr.ftrace.padding);
308
309 PyTuple_SetItem(function, 0, f_symbolname);
310 PyTuple_SetItem(function, 1, f_pad);
311
312 PyTuple_SetItem(probe, 0, addr);
313 PyTuple_SetItem(probe, 1, offset);
314 PyTuple_SetItem(probe, 2, symbolname);
315 PyTuple_SetItem(probe, 3, probepad);
316
317 PyTuple_SetItem(tmp, 0, name);
318 PyTuple_SetItem(tmp, 1, type);
319 PyTuple_SetItem(tmp, 2, logleveltype);
320 PyTuple_SetItem(tmp, 3, loglevel);
321 PyTuple_SetItem(tmp, 4, enabled);
322 PyTuple_SetItem(tmp, 5, pid);
323 PyTuple_SetItem(tmp, 6, padding);
324 PyTuple_SetItem(tmp, 7, probe);
325 PyTuple_SetItem(tmp, 8, function);
326 PyTuple_SetItem(tmp, 9, attrpadding);
327 PyList_Append(events, tmp);
328 }
329 $result = events;
330 }
331}
332%typemap(in,numinputs=0) struct lttng_event **events (struct lttng_event *temp){
333 $1=&temp;
334}
335
336
337
338// =============================================
339// FUNCTIONS
340// =============================================
341
342%rename("create") lttng_create_session(const char *name, const char *path);
9e52b0d8 343%rename("create_snapshot") lttng_create_session_snapshot(const char *name, const char *snapshot_url);
36907cb5
DS
344%rename("destroy") lttng_destroy_session(const char *name);
345%rename("_lttng_create_handle") lttng_create_handle(const char *session_name, struct lttng_domain *domain);
346%rename("_lttng_destroy_handle") lttng_destroy_handle(struct lttng_handle *handle);
347%rename("_lttng_list_sessions") lttng_list_sessions(struct lttng_session **sessions);
348%rename("_lttng_list_domains") lttng_list_domains(const char *session_name, struct lttng_domain **domains);
349%rename("_lttng_list_channels") lttng_list_channels(struct lttng_handle *handle,struct lttng_channel **channels);
350%rename("_lttng_list_events") lttng_list_events(struct lttng_handle *handle, const char *channel_name, struct lttng_event **events);
351%rename("_lttng_list_tracepoints") lttng_list_tracepoints(struct lttng_handle *handle, struct lttng_event **events);
352%rename("session_daemon_alive") lttng_session_daemon_alive(void);
353%rename("set_tracing_group") lttng_set_tracing_group(const char *name);
354%rename("strerror") lttng_strerror(int code);
355%rename("_lttng_register_consumer") lttng_register_consumer(struct lttng_handle *handle, const char *socket_path);
356%rename("start") lttng_start_tracing(const char *session_name);
357%rename("stop") lttng_stop_tracing(const char *session_name);
358%rename("_lttng_add_context") lttng_add_context(struct lttng_handle *handle, struct lttng_event_context *ctx, const char *event_name, const char *channel_name);
359%rename("_lttng_enable_event") lttng_enable_event(struct lttng_handle *handle, struct lttng_event *ev, const char *channel_name);
360%rename("_lttng_enable_channel") lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *chan);
361%rename("_lttng_disable_event") lttng_disable_event(struct lttng_handle *handle, const char *name, const char *channel_name);
362%rename("_lttng_disable_channel") lttng_disable_channel(struct lttng_handle *handle, const char *name);
36907cb5
DS
363%rename("channel_set_default_attr") lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr);
364
365//Redefined functions
366struct lttng_handle *lttng_create_handle(const char *session_name,
367 struct lttng_domain *domain);
368void lttng_destroy_handle(struct lttng_handle *handle);
369int lttng_list_channels(struct lttng_handle *handle,struct lttng_channel **channels);
370int lttng_list_events(struct lttng_handle *handle,
371 const char *channel_name, struct lttng_event **events);
372int lttng_list_tracepoints(struct lttng_handle *handle, struct lttng_event **events);
373int lttng_add_context(struct lttng_handle *handle, struct lttng_event_context *ctx,
374 const char *event_name, const char *channel_name);
375int lttng_enable_event(struct lttng_handle *handle,
376 struct lttng_event *ev, const char *channel_name);
377int lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *chan);
378int lttng_disable_event(struct lttng_handle *handle,
379 const char *name, const char *channel_name);
380int lttng_disable_channel(struct lttng_handle *handle, const char *name);
36907cb5
DS
381int lttng_register_consumer(struct lttng_handle *handle, const char *socket_path);
382int lttng_list_sessions(struct lttng_session **sessions);
383int lttng_list_domains(const char *session_name, struct lttng_domain **domains);
384
385//Functions not needing redefinition
386%feature("docstring")"create(str name, str path) -> int
387
388Create a new tracing session using name and path.
9e52b0d8 389Returns 0 on success or a negative error code."
36907cb5
DS
390int lttng_create_session(const char *name, const char *path);
391
9e52b0d8
MD
392%feature("docstring")"create_snapshot(str name, str snapshot_url) -> int
393
394Create a new tracing session using name and snapshot_url in snapshot
395mode (flight recorder).
396Returns 0 on success or a negative error code."
397int lttng_create_session_snapshot(const char *name, const char *path);
36907cb5
DS
398
399%feature("docstring")"destroy(str name) -> int
400
401Tear down tracing session using name.
9e52b0d8 402Returns 0 on success or a negative error code."
36907cb5
DS
403int lttng_destroy_session(const char *name);
404
405
406%feature("docstring")"session_daemon_alive() -> int
407
408Check if session daemon is alive.
409Return 1 if alive or 0 if not.
410On error returns a negative value."
411int lttng_session_daemon_alive(void);
412
413
414%feature("docstring")"set_tracing_group(str name) -> int
415
416Sets the tracing_group variable with name.
417This function allocates memory pointed to by tracing_group.
418On success, returns 0, on error, returns -1 (null name) or -ENOMEM."
419int lttng_set_tracing_group(const char *name);
420
421
422%feature("docstring")"strerror(int code) -> char
423
424Returns a human readable string describing
425the error code (a negative value)."
426const char *lttng_strerror(int code);
427
428
429%feature("docstring")"start(str session_name) -> int
430
431Start tracing for all traces of the session.
432Returns size of returned session payload data or a negative error code."
433int lttng_start_tracing(const char *session_name);
434
435
436%feature("docstring")"stop(str session_name) -> int
437
438Stop tracing for all traces of the session.
439Returns size of returned session payload data or a negative error code."
440int lttng_stop_tracing(const char *session_name);
441
442
443%feature("docstring")"channel_set_default_attr(Domain domain, ChannelAttr attr)
444
445Set default channel attributes.
446If either or both of the arguments are null, attr content is zeroe'd."
447void lttng_channel_set_default_attr(struct lttng_domain *domain, struct lttng_channel_attr *attr);
448
449
450// =============================================
451// Python redefinition of some functions
452// (List and Handle-related)
453// =============================================
454
455%feature("docstring")""
456%pythoncode %{
457
458def list_sessions():
459 """
460 list_sessions() -> dict
461
462 Ask the session daemon for all available sessions.
463 Returns a dict of Session instances, the key is the name;
464 on error, returns a negative value.
465 """
466
467 ses_list = _lttng_list_sessions()
468 if type(ses_list) is int:
469 return ses_list
470
471 sessions = {}
472
473 for ses_elements in ses_list:
474 ses = Session()
475 ses.name = ses_elements[0]
476 ses.path = ses_elements[1]
477 ses.enabled = ses_elements[2]
478 ses.padding = ses_elements[3]
479
480 sessions[ses.name] = ses
481
482 return sessions
483
484
485def list_domains(session_name):
486 """
487 list_domains(str session_name) -> list
488
489 Ask the session daemon for all available domains of a session.
490 Returns a list of Domain instances;
491 on error, returns a negative value.
492 """
493
494 dom_list = _lttng_list_domains(session_name)
495 if type(dom_list) is int:
496 return dom_list
497
498 domains = []
499
500 for dom_elements in dom_list:
501 dom = Domain()
502 dom.type = dom_elements[0]
fe1b18eb
JR
503 dom.buf_type = dom_elements[1]
504 dom.paddinf = dom_elements[2]
505 dom.attr.pid = dom_elements[3]
506 dom.attr.exec_name = dom_elements[4]
507 dom.attr.padding = dom_elements[5]
36907cb5
DS
508
509 domains.append(dom)
510
511 return domains
512
513
514def list_channels(handle):
515 """
516 list_channels(Handle handle) -> dict
517
518 Ask the session daemon for all available channels of a session.
519 Returns a dict of Channel instances, the key is the name;
520 on error, returns a negative value.
521 """
522
523 try:
524 chan_list = _lttng_list_channels(handle._h)
525 except AttributeError:
526 raise TypeError("in method 'list_channels', argument 1 must be a Handle instance")
527
528 if type(chan_list) is int:
529 return chan_list
530
531 channels = {}
532
533 for channel_elements in chan_list:
534 chan = Channel()
535 chan.name = channel_elements[0]
536 chan.enabled = channel_elements[1]
537 chan.padding = channel_elements[2]
538 chan.attr.overwrite = channel_elements[3][0]
539 chan.attr.subbuf_size = channel_elements[3][1]
540 chan.attr.num_subbuf = channel_elements[3][2]
541 chan.attr.switch_timer_interval = channel_elements[3][3]
542 chan.attr.read_timer_interval = channel_elements[3][4]
543 chan.attr.output = channel_elements[3][5]
544 chan.attr.padding = channel_elements[3][6]
545
546 channels[chan.name] = chan
547
548 return channels
549
550
551def list_events(handle, channel_name):
552 """
553 list_events(Handle handle, str channel_name) -> dict
554
555 Ask the session daemon for all available events of a session channel.
556 Returns a dict of Event instances, the key is the name;
557 on error, returns a negative value.
558 """
559
560 try:
561 ev_list = _lttng_list_events(handle._h, channel_name)
562 except AttributeError:
563 raise TypeError("in method 'list_events', argument 1 must be a Handle instance")
564
565 if type(ev_list) is int:
566 return ev_list
567
568 events = {}
569
570 for ev_elements in ev_list:
571 ev = Event()
572 ev.name = ev_elements[0]
573 ev.type = ev_elements[1]
574 ev.loglevel_type = ev_elements[2]
575 ev.loglevel = ev_elements[3]
576 ev.enabled = ev_elements[4]
577 ev.pid = ev_elements[5]
578 ev.attr.padding = ev_elements[6]
579 ev.attr.probe.addr = ev_elements[7][0]
580 ev.attr.probe.offset = ev_elements[7][1]
581 ev.attr.probe.symbol_name = ev_elements[7][2]
582 ev.attr.probe.padding = ev_elements[7][3]
583 ev.attr.ftrace.symbol_name = ev_elements[8][0]
584 ev.attr.ftrace.padding = ev_elements[8][1]
585 ev.attr.padding = ev_elements[9]
586
587 events[ev.name] = ev
588
589 return events
590
591
592def list_tracepoints(handle):
593 """
594 list_tracepoints(Handle handle) -> dict
595
596 Returns a dict of Event instances, the key is the name;
597 on error, returns a negative value.
598 """
599
600 try:
601 ev_list = _lttng_list_tracepoints(handle._h)
602 except AttributeError:
603 raise TypeError("in method 'list_tracepoints', argument 1 must be a Handle instance")
604
605 if type(ev_list) is int:
606 return ev_list
607
608 events = {}
609
610 for ev_elements in ev_list:
611 ev = Event()
612 ev.name = ev_elements[0]
613 ev.type = ev_elements[1]
614 ev.loglevel_type = ev_elements[2]
615 ev.loglevel = ev_elements[3]
616 ev.enabled = ev_elements[4]
617 ev.pid = ev_elements[5]
618 ev.attr.padding = ev_elements[6]
619 ev.attr.probe.addr = ev_elements[7][0]
620 ev.attr.probe.offset = ev_elements[7][1]
621 ev.attr.probe.symbol_name = ev_elements[7][2]
622 ev.attr.probe.padding = ev_elements[7][3]
623 ev.attr.ftrace.symbol_name = ev_elements[8][0]
624 ev.attr.ftrace.padding = ev_elements[8][1]
625 ev.attr.padding = ev_elements[9]
626
627 events[ev.name] = ev
628
629 return events
630
631
632def register_consumer(handle, socket_path):
633 """
634 register_consumer(Handle handle, str socket_path) -> int
635
636 Register an outside consumer.
637 Returns size of returned session payload data or a negative error code.
638 """
639
640 try:
641 return _lttng_register_consumer(handle._h, socket_path)
642 except AttributeError:
643 raise TypeError("in method 'register_consumer', argument 1 must be a Handle instance")
644
645
646def add_context(handle, event_context, event_name, channel_name):
647 """
648 add_context(Handle handle, EventContext ctx,
649 str event_name, str channel_name) -> int
650
651 Add context to event and/or channel.
652 If event_name is None, the context is applied to all events of the channel.
653 If channel_name is None, a lookup of the event's channel is done.
654 If both are None, the context is applied to all events of all channels.
655 Returns the size of the returned payload data or a negative error code.
656 """
657
658 try:
659 return _lttng_add_context(handle._h, event_context, event_name, channel_name)
660 except AttributeError:
661 raise TypeError("in method 'add_context', argument 1 must be a Handle instance")
662
663
664def enable_event(handle, event, channel_name):
665 """
666 enable_event(Handle handle, Event event,
667 str channel_name) -> int
668
669 Enable event(s) for a channel.
670 If no event name is specified, all events are enabled.
671 If no channel name is specified, the default 'channel0' is used.
672 Returns size of returned session payload data or a negative error code.
673 """
674
675 try:
676 return _lttng_enable_event(handle._h, event, channel_name)
677 except AttributeError:
678 raise TypeError("in method 'enable_event', argument 1 must be a Handle instance")
679
680
681def enable_channel(handle, channel):
682 """
683 enable_channel(Handle handle, Channel channel -> int
684
685 Enable channel per domain
686 Returns size of returned session payload data or a negative error code.
687 """
688
689 try:
690 return _lttng_enable_channel(handle._h, channel)
691 except AttributeError:
692 raise TypeError("in method 'enable_channel', argument 1 must be a Handle instance")
693
694
695def disable_event(handle, name, channel_name):
696 """
697 disable_event(Handle handle, str name, str channel_name) -> int
698
699 Disable event(s) of a channel and domain.
700 If no event name is specified, all events are disabled.
701 If no channel name is specified, the default 'channel0' is used.
702 Returns size of returned session payload data or a negative error code
703 """
704
705 try:
706 return _lttng_disable_event(handle._h, name, channel_name)
707 except AttributeError:
708 raise TypeError("in method 'disable_event', argument 1 must be a Handle instance")
709
710
711def disable_channel(handle, name):
712 """
713 disable_channel(Handle handle, str name) -> int
714
715 All tracing will be stopped for registered events of the channel.
716 Returns size of returned session payload data or a negative error code.
717 """
718
719 try:
720 return _lttng_disable_channel(handle._h, name)
721 except AttributeError:
722 raise TypeError("in method 'disable_channel', argument 1 must be a Handle instance")
36907cb5
DS
723%}
724
725
726// =============================================
727// Handle class
728// Used to prevent freeing unallocated memory
729// =============================================
730
731%feature("docstring")""
732%feature("autodoc", "1");
733
734%pythoncode %{
735class Handle:
9c2fd06d 736 """
36907cb5
DS
737 Manages a handle.
738 Takes two arguments: (str session_name, Domain domain)
739 """
740
741 __frozen = False
742
743 def __init__(self, session_name, domain):
744 if type(session_name) is not str:
745 raise TypeError("in method '__init__', argument 2 of type 'str'")
746 if type(domain) is not Domain and domain is not None:
747 raise TypeError("in method '__init__', argument 3 of type 'lttng.Domain'")
748
749 self._sname = session_name
750 if domain is None:
751 self._domtype = None
752 else:
753 self._domtype = domain.type
754 self._h = _lttng_create_handle(session_name, domain)
755 self.__frozen = True
756
757 def __del__(self):
758 _lttng_destroy_handle(self._h)
759
760 def __repr__(self):
761 if self._domtype == 1:
762 domstr = "DOMAIN_KERNEL"
763 elif self._domtype == 2:
764 domstr = "DOMAIN_UST"
765 else:
766 domstr = self._domtype
767
768 return "lttng.Handle; session('{}'), domain.type({})".format(
769 self._sname, domstr)
770
771 def __setattr__(self, attr, val):
772 if self.__frozen:
773 raise NotImplementedError("cannot modify attributes")
774 else:
775 self.__dict__[attr] = val
776%}
777
778
779// =============================================
780// STRUCTURES
781// These are directly taken from lttng.h.
782// Any change to these structures must also be
783// made here.
784// =============================================
785
786%rename("Domain") lttng_domain;
787%rename("EventContext") lttng_event_context;
788%rename("Event") lttng_event;
36907cb5
DS
789%rename("ChannelAttr") lttng_channel_attr;
790%rename("Channel") lttng_channel;
791%rename("Session") lttng_session;
792
793struct lttng_domain{
794 enum lttng_domain_type type;
fe1b18eb 795 enum lttng_buffer_type buf_type;
36907cb5
DS
796 char padding[LTTNG_DOMAIN_PADDING1];
797
798 union {
799 pid_t pid;
800 char exec_name[NAME_MAX];
801 char padding[LTTNG_DOMAIN_PADDING2];
802 } attr;
803
804 %extend {
805 char *__repr__() {
806 static char temp[256];
fe1b18eb
JR
807 static char domain_type[25];
808 static char buffer_type[25];
36907cb5
DS
809 switch ( $self->type ) {
810 case 1:
fe1b18eb 811 sprintf(domain_type, "type(DOMAIN_KERNEL)");
36907cb5
DS
812 break;
813 case 2:
fe1b18eb 814 sprintf(domain_type, "type(DOMAIN_UST)");
36907cb5
DS
815 break;
816 default:
fe1b18eb 817 sprintf(domain_type, "type(%i)", $self->type);
36907cb5
DS
818 break;
819 }
fe1b18eb
JR
820
821 switch ( $self->buf_type ) {
822 case LTTNG_BUFFER_PER_UID:
823 sprintf(buffer_type, "buf_type(BUFFER_PER_UID)");
824 break;
825 case LTTNG_BUFFER_PER_PID:
826 sprintf(buffer_type, "buf_type(BUFFER_PER_PID)");
827 break;
828 case LTTNG_BUFFER_GLOBAL:
829 sprintf(buffer_type, "buf_type(BUFFER_GLOBAL)");
830 break;
831 default:
832 sprintf(buffer_type, "buf_type(%i)", $self->buf_type);
833 break;
834 }
835
836 sprintf(temp, "lttng.Domain; %s, %s",
837 domain_type,
838 buffer_type
839 );
36907cb5
DS
840 return &temp[0];
841 }
842 }
843};
844
845struct lttng_event_context {
846 enum lttng_event_context_type ctx;
847 char padding[LTTNG_EVENT_CONTEXT_PADDING1];
848
849 union {
850 struct lttng_event_perf_counter_ctx perf_counter;
851 char padding[LTTNG_EVENT_CONTEXT_PADDING2];
852 } u;
853
854 %extend {
855 char *__repr__() {
856 static char temp[256];
857 switch ( $self->ctx ) {
858 case 0:
859 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PID)");
860 break;
861 case 1:
862 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_COUNTER)");
863 break;
864 case 2:
865 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PROCNAME)");
866 break;
867 case 3:
868 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PRIO)");
869 break;
870 case 4:
871 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_NICE)");
872 break;
873 case 5:
874 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VPID)");
875 break;
876 case 6:
877 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_TID)");
878 break;
879 case 7:
880 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VTID)");
881 break;
882 case 8:
883 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PPID)");
884 break;
885 case 9:
886 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_VPPID)");
887 break;
888 case 10:
889 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PTHREAD_ID)");
890 break;
5211dfc7
CB
891 case 11:
892 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_HOSTNAME)");
893 break;
894 case 12:
895 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_IP)");
896 break;
897 case 13:
898 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_CPU_COUNTER)");
899 break;
900 case 14:
901 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PERF_THREAD_COUNTER)");
902 break;
903 case 15:
904 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_APP_CONTEXT)");
905 break;
906 case 16:
907 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_INTERRUPTIBLE)");
908 break;
909 case 17:
910 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_PREEMPTIBLE)");
911 break;
912 case 18:
913 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_NEED_RESCHEDULE)");
914 break;
915 case 19:
916 sprintf(temp, "lttng.EventContext; ctx(EVENT_CONTEXT_MIGRATABLE)");
917 break;
36907cb5
DS
918 default:
919 sprintf(temp, "lttng.EventContext; type(%i)", $self->ctx);
920 break;
921 }
922 return &temp[0];
923 }
924 }
925};
926
b6648478
JG
927struct lttng_event_probe_attr {
928 uint64_t addr;
929 uint64_t offset;
930 char symbol_name[LTTNG_SYMBOL_NAME_LEN];
931 char padding[LTTNG_EVENT_PROBE_PADDING1];
932};
36907cb5 933
b6648478
JG
934struct lttng_event_function_attr {
935 char symbol_name[LTTNG_SYMBOL_NAME_LEN];
936 char padding[LTTNG_EVENT_FUNCTION_PADDING1];
937};
36907cb5 938
b6648478
JG
939struct lttng_event {
940 enum lttng_event_type type;
941 char name[LTTNG_SYMBOL_NAME_LEN];
36907cb5 942
b6648478
JG
943 enum lttng_loglevel_type loglevel_type;
944 int loglevel;
945
946 int32_t enabled;
947 pid_t pid;
948
949 char padding[LTTNG_EVENT_PADDING1];
950
951 union {
952 struct lttng_event_probe_attr probe;
953 struct lttng_event_function_attr ftrace;
954
955 char padding[LTTNG_EVENT_PADDING2];
956 } attr;
957
958 %extend {
959 char *__repr__() {
960 static char temp[512];
961 char evtype[50];
962 char logtype[50];
963
964 switch ( $self->type ) {
965 case -1:
966 sprintf(evtype, "EVENT_ALL");
967 break;
968 case 0:
969 sprintf(evtype, "EVENT_TRACEPOINT");
970 break;
971 case 1:
972 sprintf(evtype, "EVENT_PROBE");
973 break;
974 case 2:
975 sprintf(evtype, "EVENT_FUNCTION");
976 break;
977 case 3:
978 sprintf(evtype, "EVENT_FUNCTION_ENTRY");
979 break;
980 case 4:
981 sprintf(evtype, "EVENT_NOOP");
982 break;
983 case 5:
984 sprintf(evtype, "EVENT_SYSCALL");
985 break;
986 default:
987 sprintf(evtype, "%i", $self->type);
988 break;
989 }
990
991 switch ( $self->loglevel_type ) {
992 case 0:
993 sprintf(logtype, "EVENT_LOGLEVEL_ALL");
994 break;
995 case 1:
996 sprintf(logtype, "EVENT_LOGLEVEL_RANGE");
997 break;
998 case 2:
999 sprintf(logtype, "EVENT_LOGLEVEL_SINGLE");
1000 break;
1001 default:
1002 sprintf(logtype, "%i", $self->loglevel_type);
1003 break;
1004 }
1005
1006 sprintf(temp, "lttng.Event; name('%s'), type(%s), "
1007 "loglevel_type(%s), loglevel(%i), "
1008 "enabled(%s), pid(%i)",
1009 $self->name, evtype, logtype, $self->loglevel,
1010 $self->enabled ? "True" : "False", $self->pid);
1011 return &temp[0];
36907cb5
DS
1012 }
1013 }
b6648478
JG
1014};
1015
b6648478
JG
1016struct lttng_channel_attr {
1017 int overwrite;
1018 uint64_t subbuf_size;
1019 uint64_t num_subbuf;
1020 unsigned int switch_timer_interval;
1021 unsigned int read_timer_interval;
1022 enum lttng_event_output output;
1023
1024 char padding[LTTNG_CHANNEL_ATTR_PADDING1];
1025
1026 %extend {
1027 char *__repr__() {
1028 static char temp[256];
1029 char evout[25];
1030
1031 switch ( $self->output ) {
1032 case 0:
1033 sprintf(evout, "EVENT_SPLICE");
1034 break;
1035 case 1:
1036 sprintf(evout, "EVENT_MMAP");
1037 break;
1038 default:
1039 sprintf(evout, "%i", $self->output);
1040 break;
1041 }
bc3bdada
JG
1042 sprintf(temp, "lttng.ChannelAttr; overwrite(%i), subbuf_size(%"PRIu64"), "
1043 "num_subbuf(%"PRIu64"), switch_timer_interval(%u), "
b6648478
JG
1044 "read_timer_interval(%u), output(%s)",
1045 $self->overwrite, $self->subbuf_size, $self->num_subbuf,
1046 $self->switch_timer_interval, $self->read_timer_interval,
1047 evout);
1048 return &temp[0];
1049 }
dcac8046 1050 }
b6648478
JG
1051};
1052
1053struct lttng_channel {
1054 char name[LTTNG_SYMBOL_NAME_LEN];
1055 uint32_t enabled;
1056 struct lttng_channel_attr attr;
1057 char padding[LTTNG_CHANNEL_PADDING1];
36907cb5 1058
b6648478
JG
1059 %extend {
1060 char *__repr__() {
1061 static char temp[512];
bbf3690b 1062 snprintf(temp, sizeof(temp), "lttng.Channel; name('%s'), enabled(%s)",
b6648478
JG
1063 $self->name, $self->enabled ? "True" : "False");
1064 return &temp[0];
1065 }
36907cb5 1066 }
b6648478 1067};
dcac8046 1068
b6648478
JG
1069struct lttng_session {
1070 char name[NAME_MAX];
1071 char path[PATH_MAX];
1072 uint32_t enabled;
1073 char padding[LTTNG_SESSION_PADDING1];
1074
1075 %extend {
1076 char *__repr__() {
bbf3690b
JG
1077 static char temp[PATH_MAX + NAME_MAX + 512];
1078 snprintf(temp, sizeof(temp), "lttng.Session; name('%s'), path('%s'), enabled(%s)",
b6648478
JG
1079 $self->name, $self->path,
1080 $self->enabled ? "True" : "False");
1081 return &temp[0];
1082 }
1083 }
1084};
This page took 0.078835 seconds and 4 git commands to generate.