Mi enable-channel command: support and validation
[lttng-tools.git] / src / common / mi-lttng.c
CommitLineData
c7e35b03
JR
1/*
2 * Copyright (C) 2014 - Jonathan Rajotte <jonathan.r.julien@gmail.com>
3 * - Olivier Cotte <olivier.cotte@polymtl.ca>
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License, version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 51
16 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
5e18ec73 19
c7e35b03
JR
20#include <include/config.h>
21#include <common/config/config.h>
c7e35b03
JR
22#include "mi-lttng.h"
23
5e18ec73
JR
24#include <assert.h>
25
c7e35b03
JR
26/* Strings related to command */
27const char * const mi_lttng_element_command = "command";
37d03ff7 28const char * const mi_lttng_element_command_name = "name";
c7e35b03
JR
29const char * const mi_lttng_element_command_version = "version";
30const char * const mi_lttng_element_command_list = "list";
1734c658
JRJ
31const char * const mi_lttng_element_command_save = "save";
32const char * const mi_lttng_element_command_load = "load";
1cfc0bc8 33const char * const mi_lttng_element_command_start = "start";
e5b83100 34const char * const mi_lttng_element_command_stop = "stop";
37d03ff7 35const char * const mi_lttng_element_command_create = "create";
65f25c66 36const char * const mi_lttng_element_command_destroy = "destroy";
7e66b1b0 37const char * const mi_lttng_element_command_calibrate = "calibrate";
89b72577 38const char * const mi_lttng_element_command_add_context = "add-context";
acc09215 39const char * const mi_lttng_element_command_enable_channels = "enable-channel";
c7e35b03 40const char * const mi_lttng_element_command_output = "output";
1734c658 41const char * const mi_lttng_element_command_success = "success";
c7e35b03 42
1734c658 43/* Strings related to version command */
c7e35b03
JR
44const char * const mi_lttng_element_version = "version";
45const char * const mi_lttng_element_version_str = "string";
46const char * const mi_lttng_element_version_web = "url";
47const char * const mi_lttng_element_version_major = "major";
48const char * const mi_lttng_element_version_minor = "minor";
314d5222 49const char * const mi_lttng_element_version_commit = "commit";
c7e35b03
JR
50const char * const mi_lttng_element_version_license = "license";
51const char * const mi_lttng_element_version_patch_level = "patchLevel";
52const char * const mi_lttng_element_version_description = "description";
53
5e18ec73
JR
54/* Strings related to pid */
55const char * const mi_lttng_element_pids = "pids";
56const char * const mi_lttng_element_pid = "pid";
57const char * const mi_lttng_element_pid_id = "id";
58
1734c658
JRJ
59/* Strings related to save command */
60const char * const mi_lttng_element_save = "save";
61
62/* Strings related to load command */
63const char * const mi_lttng_element_load = "load";
64
5e18ec73
JR
65/* String related to a lttng_event_field */
66const char * const mi_lttng_element_event_field = "event_field";
67const char * const mi_lttng_element_event_fields = "event_fields";
68
89b72577
JRJ
69/* String related to lttng_event_context */
70const char * const mi_lttng_context_type_perf_counter = "PERF_COUNTER";
71const char * const mi_lttng_context_type_perf_cpu_counter = "PERF_CPU_COUNTER";
72const char * const mi_lttng_context_type_perf_thread_counter = "PERF_THREAD_COUNTER";
73
74/* String related to lttng_event_perf_counter_ctx */
75const char * const mi_lttng_element_perf_counter_context = "perf_counter_context";
76
5e18ec73
JR
77/* General elements of mi_lttng */
78const char * const mi_lttng_element_type_other = "OTHER";
79const char * const mi_lttng_element_type_integer = "INTEGER";
80const char * const mi_lttng_element_type_enum = "ENUM";
81const char * const mi_lttng_element_type_float = "FLOAT";
82const char * const mi_lttng_element_type_string = "STRING";
83const char * const mi_lttng_element_nowrite = "nowrite";
89b72577 84const char * const mi_lttng_element_success = "success";
5e18ec73
JR
85
86/* String related to loglevel */
87const char * const mi_lttng_loglevel_str_alert = "TRACE_ALERT";
88const char * const mi_lttng_loglevel_str_crit = "TRACE_CRIT";
89const char * const mi_lttng_loglevel_str_debug = "TRACE_DEBUG";
90const char * const mi_lttng_loglevel_str_debug_function = "TRACE_DEBUG_FUNCTION";
91const char * const mi_lttng_loglevel_str_debug_line = "TRACE_DEBUG_LINE";
92const char * const mi_lttng_loglevel_str_debug_module = "TRACE_DEBUG_MODULE";
93const char * const mi_lttng_loglevel_str_debug_process = "TRACE_DEBUG_PROCESS";
94const char * const mi_lttng_loglevel_str_debug_program = "TRACE_DEBUG_PROGRAM";
95const char * const mi_lttng_loglevel_str_debug_system = "TRACE_DEBUG_SYSTEM";
96const char * const mi_lttng_loglevel_str_debug_unit = "TRACE_DEBUG_UNIT";
97const char * const mi_lttng_loglevel_str_emerg = "TRACE_EMERG";
98const char * const mi_lttng_loglevel_str_err = "TRACE_ERR";
99const char * const mi_lttng_loglevel_str_info = "TRACE_INFO";
100const char * const mi_lttng_loglevel_str_notice = "TRACE_NOTICE";
101const char * const mi_lttng_loglevel_str_unknown = "UNKNOWN";
102const char * const mi_lttng_loglevel_str_warning = "TRACE_WARNING";
103
1734c658 104/* String related to loglevel type */
5e18ec73
JR
105const char * const mi_lttng_loglevel_type_all = "ALL";
106const char * const mi_lttng_loglevel_type_range = "RANGE";
107const char * const mi_lttng_loglevel_type_single = "SINGLE";
108const char * const mi_lttng_loglevel_type_unknown = "UNKNOWN";
109
7e66b1b0
JRJ
110/* String related to lttng_calibrate */
111const char * const mi_lttng_element_calibrate = "calibrate";
112const char * const mi_lttng_element_calibrate_function = "FUNCTION";
113
5e18ec73
JR
114const char * const mi_lttng_element_empty = "";
115
116const char *mi_lttng_loglevel_string(int value)
117{
118 switch (value) {
119 case -1:
120 return mi_lttng_element_empty;
121 case LTTNG_LOGLEVEL_EMERG:
122 return mi_lttng_loglevel_str_emerg;
123 case LTTNG_LOGLEVEL_ALERT:
124 return mi_lttng_loglevel_str_alert;
125 case LTTNG_LOGLEVEL_CRIT:
126 return mi_lttng_loglevel_str_crit;
127 case LTTNG_LOGLEVEL_ERR:
128 return mi_lttng_loglevel_str_err;
129 case LTTNG_LOGLEVEL_WARNING:
130 return mi_lttng_loglevel_str_warning;
131 case LTTNG_LOGLEVEL_NOTICE:
132 return mi_lttng_loglevel_str_notice;
133 case LTTNG_LOGLEVEL_INFO:
134 return mi_lttng_loglevel_str_info;
135 case LTTNG_LOGLEVEL_DEBUG_SYSTEM:
136 return mi_lttng_loglevel_str_debug_system;
137 case LTTNG_LOGLEVEL_DEBUG_PROGRAM:
138 return mi_lttng_loglevel_str_debug_program;
139 case LTTNG_LOGLEVEL_DEBUG_PROCESS:
140 return mi_lttng_loglevel_str_debug_process;
141 case LTTNG_LOGLEVEL_DEBUG_MODULE:
142 return mi_lttng_loglevel_str_debug_module;
143 case LTTNG_LOGLEVEL_DEBUG_UNIT:
144 return mi_lttng_loglevel_str_debug_unit;
145 case LTTNG_LOGLEVEL_DEBUG_FUNCTION:
146 return mi_lttng_loglevel_str_debug_function;
147 case LTTNG_LOGLEVEL_DEBUG_LINE:
148 return mi_lttng_loglevel_str_debug_line;
149 case LTTNG_LOGLEVEL_DEBUG:
150 return mi_lttng_loglevel_str_debug;
151 default:
152 return mi_lttng_loglevel_str_unknown;
153 }
154}
155
156const char *mi_lttng_logleveltype_string(enum lttng_loglevel_type value)
157{
158 switch (value) {
159 case LTTNG_EVENT_LOGLEVEL_ALL:
160 return mi_lttng_loglevel_type_all;
161 case LTTNG_EVENT_LOGLEVEL_RANGE:
162 return mi_lttng_loglevel_type_range;
163 case LTTNG_EVENT_LOGLEVEL_SINGLE:
164 return mi_lttng_loglevel_type_single;
165 default:
166 return mi_lttng_loglevel_type_unknown;
167 }
168}
169
170const char *mi_lttng_eventtype_string(enum lttng_event_type value)
171{
172 switch (value) {
173 case LTTNG_EVENT_ALL:
174 return config_event_type_all;
175 case LTTNG_EVENT_TRACEPOINT:
176 return config_event_type_tracepoint;
177 case LTTNG_EVENT_PROBE:
178 return config_event_type_probe;
179 case LTTNG_EVENT_FUNCTION:
180 return config_event_type_function;
181 case LTTNG_EVENT_FUNCTION_ENTRY:
182 return config_event_type_function_entry;
183 case LTTNG_EVENT_SYSCALL:
184 return config_event_type_syscall;
185 case LTTNG_EVENT_NOOP:
186 return config_event_type_noop;
187 default:
188 return mi_lttng_element_empty;
189 }
190}
191
89b72577
JRJ
192const char *mi_lttng_event_contexttype_string(enum lttng_event_context_type val)
193{
194 switch (val) {
195 case LTTNG_EVENT_CONTEXT_PID:
196 return config_event_context_pid;
197 case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
198 return mi_lttng_context_type_perf_counter;
199 case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
200 return mi_lttng_context_type_perf_thread_counter;
201 case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER:
202 return mi_lttng_context_type_perf_cpu_counter;
203 case LTTNG_EVENT_CONTEXT_PROCNAME:
204 return config_event_context_procname;
205 case LTTNG_EVENT_CONTEXT_PRIO:
206 return config_event_context_prio;
207 case LTTNG_EVENT_CONTEXT_NICE:
208 return config_event_context_nice;
209 case LTTNG_EVENT_CONTEXT_VPID:
210 return config_event_context_vpid;
211 case LTTNG_EVENT_CONTEXT_TID:
212 return config_event_context_tid;
213 case LTTNG_EVENT_CONTEXT_VTID:
214 return config_event_context_vtid;
215 case LTTNG_EVENT_CONTEXT_PPID:
216 return config_event_context_ppid;
217 case LTTNG_EVENT_CONTEXT_VPPID:
218 return config_event_context_vppid;
219 case LTTNG_EVENT_CONTEXT_PTHREAD_ID:
220 return config_event_context_pthread_id;
221 case LTTNG_EVENT_CONTEXT_HOSTNAME:
222 return config_event_context_hostname;
223 case LTTNG_EVENT_CONTEXT_IP:
224 return config_event_context_ip;
225 default:
226 return NULL;
227 }
228}
229
5e18ec73
JR
230const char *mi_lttng_eventfieldtype_string(enum lttng_event_field_type val)
231{
232 switch (val) {
233 case(LTTNG_EVENT_FIELD_INTEGER):
234 return mi_lttng_element_type_integer;
235 case(LTTNG_EVENT_FIELD_ENUM):
236 return mi_lttng_element_type_enum;
237 case(LTTNG_EVENT_FIELD_FLOAT):
238 return mi_lttng_element_type_float;
239 case(LTTNG_EVENT_FIELD_STRING):
240 return mi_lttng_element_type_string;
241 default:
242 return mi_lttng_element_type_other;
243 }
244}
245
246const char *mi_lttng_domaintype_string(enum lttng_domain_type value)
247{
248 /* Note: This is a *duplicate* of get_domain_str from bin/lttng/utils.c */
249 switch (value) {
250 case LTTNG_DOMAIN_KERNEL:
251 return config_domain_type_kernel;
252 case LTTNG_DOMAIN_UST:
253 return config_domain_type_ust;
254 case LTTNG_DOMAIN_JUL:
255 return config_domain_type_jul;
256 default:
257 /* Should not have an unknown domain */
258 assert(0);
259 }
260}
261
262const char *mi_lttng_buffertype_string(enum lttng_buffer_type value)
263{
264 switch (value) {
265 case LTTNG_BUFFER_PER_PID:
266 return config_buffer_type_per_pid;
267 case LTTNG_BUFFER_PER_UID:
268 return config_buffer_type_per_uid;
269 case LTTNG_BUFFER_GLOBAL:
270 return config_buffer_type_global;
271 default:
272 /* Should not have an unknow buffer type */
273 assert(0);
274 }
275}
276
7e66b1b0
JRJ
277const char *mi_lttng_calibratetype_string(enum lttng_calibrate_type val)
278{
279 const char *ret;
280
281 switch (val) {
282 case LTTNG_CALIBRATE_FUNCTION:
283 ret = mi_lttng_element_calibrate_function;
284 break;
285 default:
286 ret = mi_lttng_element_empty;
287 break;
288 }
289 return ret;
290}
291
c7e35b03
JR
292LTTNG_HIDDEN
293struct mi_writer *mi_lttng_writer_create(int fd_output, int mi_output_type)
294{
295 struct mi_writer *mi_writer;
296
297 mi_writer = zmalloc(sizeof(struct mi_writer));
298 if (!mi_writer) {
299 PERROR("zmalloc mi_writer_create");
300 goto end;
301 }
302 if (mi_output_type == LTTNG_MI_XML) {
303 mi_writer->writer = config_writer_create(fd_output);
304 if (!mi_writer->writer) {
305 goto err_destroy;
306 }
307 mi_writer->type = LTTNG_MI_XML;
308 } else {
309 goto err_destroy;
310 }
311
312end:
313 return mi_writer;
314
315err_destroy:
316 free(mi_writer);
317 return NULL;
318}
319
320LTTNG_HIDDEN
321int mi_lttng_writer_destroy(struct mi_writer *writer)
322{
323 int ret;
324
325 if (!writer) {
326 ret = -EINVAL;
327 goto end;
328 }
329
330 ret = config_writer_destroy(writer->writer);
331 if (ret < 0) {
332 goto end;
333 }
334
335 free(writer);
336end:
337 return ret;
338}
339
340LTTNG_HIDDEN
341int mi_lttng_writer_command_open(struct mi_writer *writer, const char *command)
342{
343 int ret;
344
345 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_command);
346 if (ret) {
347 goto end;
348 }
349 ret = mi_lttng_writer_write_element_string(writer,
350 mi_lttng_element_command_name, command);
351end:
352 return ret;
353}
354
355LTTNG_HIDDEN
356int mi_lttng_writer_command_close(struct mi_writer *writer)
357{
358 return mi_lttng_writer_close_element(writer);
359}
360
361LTTNG_HIDDEN
362int mi_lttng_writer_open_element(struct mi_writer *writer,
363 const char *element_name)
364{
365 return config_writer_open_element(writer->writer, element_name);
366}
367
368LTTNG_HIDDEN
369int mi_lttng_writer_close_element(struct mi_writer *writer)
370{
371 return config_writer_close_element(writer->writer);
372}
373
5e18ec73
JR
374LTTNG_HIDDEN
375int mi_lttng_close_multi_element(struct mi_writer *writer,
376 unsigned int nb_element)
377{
378 int ret, i;
379
380 if (nb_element < 1) {
381 ret = 0;
382 goto end;
383 }
384 for (i = 0; i < nb_element; i++) {
385 ret = mi_lttng_writer_close_element(writer);
386 if (ret) {
387 goto end;
388 }
389 }
390end:
391 return ret;
392}
393
c7e35b03
JR
394LTTNG_HIDDEN
395int mi_lttng_writer_write_element_unsigned_int(struct mi_writer *writer,
396 const char *element_name, uint64_t value)
397{
398 return config_writer_write_element_unsigned_int(writer->writer,
399 element_name, value);
400}
401
402LTTNG_HIDDEN
403int mi_lttng_writer_write_element_signed_int(struct mi_writer *writer,
404 const char *element_name, int64_t value)
405{
406 return config_writer_write_element_signed_int(writer->writer,
407 element_name, value);
408}
409
410LTTNG_HIDDEN
411int mi_lttng_writer_write_element_bool(struct mi_writer *writer,
412 const char *element_name, int value)
413{
414 return config_writer_write_element_bool(writer->writer,
415 element_name, value);
416}
417
418LTTNG_HIDDEN
419int mi_lttng_writer_write_element_string(struct mi_writer *writer,
420 const char *element_name, const char *value)
421{
422 return config_writer_write_element_string(writer->writer,
423 element_name, value);
424}
425
426LTTNG_HIDDEN
427int mi_lttng_version(struct mi_writer *writer, struct mi_lttng_version *version,
428 const char *lttng_description, const char *lttng_license)
429{
430 int ret;
431
432 /* Open version */
433 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_version);
434 if (ret) {
435 goto end;
436 }
437
438 /* Version string (contain info like rc etc.) */
439 ret = mi_lttng_writer_write_element_string(writer,
440 mi_lttng_element_version_str, VERSION);
441 if (ret) {
442 goto end;
443 }
444
445 /* Major version number */
446 ret = mi_lttng_writer_write_element_unsigned_int(writer,
447 mi_lttng_element_version_major, version->version_major);
448 if (ret) {
449 goto end;
450 }
451
452 /* Minor version number */
453 ret = mi_lttng_writer_write_element_unsigned_int(writer,
454 mi_lttng_element_version_minor, version->version_minor);
455 if (ret) {
456 goto end;
457 }
458
314d5222
JRJ
459 /* Commit version number */
460 ret = mi_lttng_writer_write_element_string(writer,
461 mi_lttng_element_version_commit, version->version_commit);
462 if (ret) {
463 goto end;
464 }
465
c7e35b03
JR
466 /* Patch number */
467 ret = mi_lttng_writer_write_element_unsigned_int(writer,
468 mi_lttng_element_version_patch_level, version->version_patchlevel);
469 if (ret) {
470 goto end;
471 }
472
473 /* Name of the version */
474 ret = mi_lttng_writer_write_element_string(writer,
475 config_element_name, version->version_name);
476 if (ret) {
477 goto end;
478 }
479
480 /* Description mostly related to beer... */
481 ret = mi_lttng_writer_write_element_string(writer,
482 mi_lttng_element_version_description, lttng_description);
483 if (ret) {
484 goto end;
485 }
486
487 /* url */
488 ret = mi_lttng_writer_write_element_string(writer,
489 mi_lttng_element_version_web, version->package_url);
490 if (ret) {
491 goto end;
492 }
493
494 /* License: free as in free beer...no...*speech* */
495 ret = mi_lttng_writer_write_element_string(writer,
496 mi_lttng_element_version_license, lttng_license);
497 if (ret) {
498 goto end;
499 }
500
501 /* Close version element */
502 ret = mi_lttng_writer_close_element(writer);
503
504end:
505 return ret;
506}
507
5e18ec73
JR
508LTTNG_HIDDEN
509int mi_lttng_sessions_open(struct mi_writer *writer)
510{
511 return mi_lttng_writer_open_element(writer, config_element_sessions);
512}
513
c7e35b03
JR
514LTTNG_HIDDEN
515int mi_lttng_session(struct mi_writer *writer,
516 struct lttng_session *session, int is_open)
517{
518 int ret;
519
5e18ec73
JR
520 assert(session);
521
522 /* Open sessions element */
c7e35b03
JR
523 ret = mi_lttng_writer_open_element(writer,
524 config_element_session);
525 if (ret) {
526 goto end;
527 }
528
529 /* Name of the session */
530 ret = mi_lttng_writer_write_element_string(writer,
531 config_element_name, session->name);
532 if (ret) {
533 goto end;
534 }
535
5e18ec73 536 /* Path */
c7e35b03
JR
537 ret = mi_lttng_writer_write_element_string(writer,
538 config_element_path, session->path);
539 if (ret) {
540 goto end;
541 }
542
5e18ec73
JR
543 /* Enabled ? */
544 ret = mi_lttng_writer_write_element_bool(writer,
c7e35b03
JR
545 config_element_enabled, session->enabled);
546 if (ret) {
547 goto end;
548 }
549
5e18ec73 550 /* Snapshot mode */
c7e35b03
JR
551 ret = mi_lttng_writer_write_element_unsigned_int(writer,
552 config_element_snapshot_mode, session->snapshot_mode);
553 if (ret) {
554 goto end;
555 }
556
5e18ec73 557 /* Live timer interval in usec */
c7e35b03
JR
558 ret = mi_lttng_writer_write_element_unsigned_int(writer,
559 config_element_live_timer_interval,
560 session->live_timer_interval);
561 if (ret) {
562 goto end;
563 }
564
565 if (!is_open) {
566 /* Closing session element */
567 ret = mi_lttng_writer_close_element(writer);
568 }
569end:
570 return ret;
571
572}
5e18ec73
JR
573
574LTTNG_HIDDEN
575int mi_lttng_domains_open(struct mi_writer *writer)
576{
577 return mi_lttng_writer_open_element(writer, config_element_domains);
578}
579
580LTTNG_HIDDEN
581int mi_lttng_domain(struct mi_writer *writer,
582 struct lttng_domain *domain, int is_open)
583{
584 int ret = 0;
585 const char *str_domain;
586 const char *str_buffer;
587
588 assert(domain);
589
590 /* Open domain element */
591 ret = mi_lttng_writer_open_element(writer, config_element_domain);
592 if (ret) {
593 goto end;
594 }
595
596 /* Domain Type */
597 str_domain = mi_lttng_domaintype_string(domain->type);
598 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
599 str_domain);
600 if (ret) {
601 goto end;
602 }
603
604 /* Buffer Type */
605 str_buffer= mi_lttng_buffertype_string(domain->buf_type);
606 ret = mi_lttng_writer_write_element_string(writer,
607 config_element_buffer_type, str_buffer);
608 if (ret) {
609 goto end;
610 }
611
612 /* TODO: attr... not sure how to use the union.... */
613
614 if (!is_open) {
615 /* Closing domain element */
616 ret = mi_lttng_writer_close_element(writer);
617 }
618
619end:
620 return ret;
621
622}
623
624LTTNG_HIDDEN
625int mi_lttng_channels_open(struct mi_writer *writer)
626{
627 return mi_lttng_writer_open_element(writer, config_element_channels);
628}
629
630LTTNG_HIDDEN
631int mi_lttng_channel(struct mi_writer *writer,
632 struct lttng_channel *channel, int is_open)
633{
634 int ret = 0;
635
636 assert(channel);
637
638 /* Opening channel element */
639 ret = mi_lttng_writer_open_element(writer, config_element_channel);
640 if (ret) {
641 goto end;
642 }
643
644 /* Name */
645 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
646 channel->name);
647 if (ret) {
648 goto end;
649 }
650
651 /* Enabled ? */
652 ret = mi_lttng_writer_write_element_bool(writer,
653 config_element_enabled, channel->enabled);
654 if (ret) {
655 goto end;
656 }
657
658 /* Attribute */
659 ret = mi_lttng_channel_attr(writer, &channel->attr);
660 if (ret) {
661 goto end;
662 }
663
664 if (!is_open) {
665 /* Closing channel element */
666 ret = mi_lttng_writer_close_element(writer);
667 if (ret) {
668 goto end;
669 }
670 }
671end:
672 return ret;
673}
674
675LTTNG_HIDDEN
676int mi_lttng_channel_attr(struct mi_writer *writer,
677 struct lttng_channel_attr *attr)
678{
679 int ret = 0;
680
681 assert(attr);
682
683 /* Opening Attributes */
684 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
685 if (ret) {
686 goto end;
687 }
688
689 /* Overwrite */
690 ret = mi_lttng_writer_write_element_string(writer,
691 config_element_overwrite_mode,
692 attr->overwrite ? config_overwrite_mode_overwrite :
693 config_overwrite_mode_discard);
694 if (ret) {
695 goto end;
696 }
697
698 /* Sub buffer size in byte */
699 ret = mi_lttng_writer_write_element_unsigned_int(writer,
700 config_element_subbuf_size, attr->subbuf_size);
701 if (ret) {
702 goto end;
703 }
704
705 /* Number of subbuffer (power of two) */
706 ret = mi_lttng_writer_write_element_unsigned_int(writer,
707 config_element_num_subbuf,
708 attr->num_subbuf);
709 if (ret) {
710 goto end;
711 }
712
713 /* Switch timer interval in usec */
714 ret = mi_lttng_writer_write_element_unsigned_int(writer,
715 config_element_switch_timer_interval,
716 attr->switch_timer_interval);
717 if (ret) {
718 goto end;
719 }
720
721 /* Read timer interval in usec */
722 ret = mi_lttng_writer_write_element_unsigned_int(writer,
723 config_element_read_timer_interval,
724 attr->read_timer_interval);
725 if (ret) {
726 goto end;
727 }
728
729 /* Event output */
730 ret = mi_lttng_writer_write_element_string(writer,
731 config_element_output_type,
732 attr->output == LTTNG_EVENT_SPLICE ?
733 config_output_type_splice : config_output_type_mmap);
734 if (ret) {
735 goto end;
736 }
737
738 /* Tracefile size in bytes */
739 ret = mi_lttng_writer_write_element_unsigned_int(writer,
740 config_element_tracefile_size, attr->tracefile_size);
741 if (ret) {
742 goto end;
743 }
744
745 /* Count of tracefiles */
746 ret = mi_lttng_writer_write_element_unsigned_int(writer,
747 config_element_tracefile_count,
748 attr->tracefile_count);
749 if (ret) {
750 goto end;
751 }
752
753 /* Live timer interval in usec*/
754 ret = mi_lttng_writer_write_element_unsigned_int(writer,
755 config_element_live_timer_interval,
756 attr->live_timer_interval);
757 if (ret) {
758 goto end;
759 }
760
761 /* Closing attributes */
762 ret = mi_lttng_writer_close_element(writer);
763 if (ret) {
764 goto end;
765 }
766end:
767 return ret;
768
769}
770
771LTTNG_HIDDEN
772int mi_lttng_event_common_attributes(struct mi_writer *writer,
773 struct lttng_event *event)
774{
775 int ret;
776
777 /* Open event element */
778 ret = mi_lttng_writer_open_element(writer, config_element_event);
779 if (ret) {
780 goto end;
781 }
782
783 /* event name */
784 ret = mi_lttng_writer_write_element_string(writer,
785 config_element_name, event->name);
786 if (ret) {
787 goto end;
788 }
789
790 /* event type */
791 ret = mi_lttng_writer_write_element_string(writer,
792 config_element_type, mi_lttng_eventtype_string(event->type));
793 if (ret) {
794 goto end;
795 }
796
797 /* is event enabled */
798 ret = mi_lttng_writer_write_element_bool(writer,
799 config_element_enabled, event->enabled);
800 if (ret) {
801 goto end;
802 }
803
804 /* event filter enabled? */
805 ret = mi_lttng_writer_write_element_bool(writer,
806 config_element_filter, event->filter);
807
808end:
809 return ret;
810}
811
812LTTNG_HIDDEN
813int mi_lttng_event_tracepoint_loglevel(struct mi_writer *writer,
814 struct lttng_event *event)
815{
816 int ret;
817
818 /* event loglevel */
819 ret = mi_lttng_writer_write_element_string(writer,
820 config_element_loglevel, mi_lttng_loglevel_string(event->loglevel));
821 if (ret) {
822 goto end;
823 }
824
825 ret = mi_lttng_writer_write_element_string(writer,
826 config_element_loglevel_type,
827 mi_lttng_logleveltype_string(event->loglevel_type));
828 if (ret) {
829 goto end;
830 }
831
832 /* event exclusion filter */
833 ret = mi_lttng_writer_write_element_bool(writer,
834 config_element_exclusion, event->exclusion);
835 if (ret) {
836 goto end;
837 }
838
839end:
840 return ret;
841}
842
843LTTNG_HIDDEN
844int mi_lttng_event_tracepoint_no_loglevel(struct mi_writer *writer,
845 struct lttng_event *event)
846{
847 /* event exclusion filter */
848 return mi_lttng_writer_write_element_bool(writer,
849 config_element_exclusion, event->exclusion);
850}
851
852LTTNG_HIDDEN
853int mi_lttng_event_function_probe(struct mi_writer *writer,
854 struct lttng_event *event)
855{
856 int ret;
857
858 if (event->attr.probe.addr != 0) {
859 /* event probe address */
860 ret = mi_lttng_writer_write_element_unsigned_int(writer,
861 config_element_address, event->attr.probe.addr);
862 if (ret) {
863 goto end;
864 }
865 } else {
866 /* event probe offset */
867 ret = mi_lttng_writer_write_element_unsigned_int(writer,
868 config_element_offset, event->attr.probe.offset);
869 if (ret) {
870 goto end;
871 }
872
873 /* event probe symbol_name */
874 ret = mi_lttng_writer_write_element_string(writer,
875 config_element_symbol_name, event->attr.probe.symbol_name);
876 if (ret) {
877 goto end;
878 }
879 }
880end:
881 return ret;
882}
883
884LTTNG_HIDDEN
885int mi_lttng_event_function_entry(struct mi_writer *writer,
886 struct lttng_event *event)
887{
888 /* event probe symbol_name */
889 return mi_lttng_writer_write_element_string(writer,
890 config_element_symbol_name, event->attr.ftrace.symbol_name);
891}
892
893LTTNG_HIDDEN
894int mi_lttng_events_open(struct mi_writer *writer)
895{
896 return mi_lttng_writer_open_element(writer, config_element_events);
897}
898
899LTTNG_HIDDEN
900int mi_lttng_event(struct mi_writer *writer,
901 struct lttng_event *event, int is_open)
902{
903 int ret;
904
905 ret = mi_lttng_event_common_attributes(writer, event);
906 if (ret) {
907 goto end;
908 }
909
910 switch (event->type) {
911 case LTTNG_EVENT_ALL:
912 /* We should never have "all" events in list. */
913 assert(0);
914 break;
915 case LTTNG_EVENT_TRACEPOINT:
916 {
917 if (event->loglevel != -1) {
918 ret = mi_lttng_event_tracepoint_loglevel(writer, event);
919 } else {
920 ret = mi_lttng_event_tracepoint_no_loglevel(writer, event);
921 }
922 break;
923 }
924 case LTTNG_EVENT_PROBE:
925 ret = mi_lttng_event_function_probe(writer, event);
926 break;
927 case LTTNG_EVENT_FUNCTION_ENTRY:
928 ret = mi_lttng_event_function_entry(writer, event);
929 break;
930 default:
931 break;
932 }
933
934 if (!is_open) {
935 ret = mi_lttng_writer_close_element(writer);
936 }
937
938end:
939 return ret;
940}
941
942LTTNG_HIDDEN
943int mi_lttng_pids_open(struct mi_writer *writer)
944{
945 return mi_lttng_writer_open_element(writer, mi_lttng_element_pids);
946}
947
948LTTNG_HIDDEN
949int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *cmdline,
950 int is_open)
951{
952 int ret;
953
954 /* Open element pid */
955 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_pid);
956 if (ret) {
957 goto end;
958 }
959
960 /* Writing pid number */
961 ret = mi_lttng_writer_write_element_signed_int(writer,
962 mi_lttng_element_pid_id, (int)pid);
963 if (ret) {
964 goto end;
965 }
966
967 /* Writing name of the process */
968 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
969 cmdline);
970 if (ret) {
971 goto end;
972 }
973
974 if (!is_open) {
975 /* Closing Pid */
976 ret = mi_lttng_writer_close_element(writer);
977 }
978
979end:
980 return ret;
981}
982
983LTTNG_HIDDEN
984int mi_lttng_event_fields_open(struct mi_writer *writer)
985{
986 return mi_lttng_writer_open_element(writer, mi_lttng_element_event_fields);
987}
988
989LTTNG_HIDDEN
990int mi_lttng_event_field(struct mi_writer *writer,
991 struct lttng_event_field *field)
992{
993 int ret;
994
995 if (!field->field_name[0]) {
996 /* To Review: not sure if legal david ?
997 * how should this be handle ?
998 */
999 ret = 0;
1000 goto end;
1001 }
1002
1003 /* Open field */
1004 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_event_field);
1005 if (ret) {
1006 goto end;
1007 }
1008
1009 if (!field->field_name[0]) {
1010 goto close;
1011 }
1012
1013 /* Name */
1014 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1015 field->field_name);
1016 if (ret) {
1017 goto end;
1018 }
1019
1020 /* Type */
1021 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1022 mi_lttng_eventfieldtype_string(field->type));
1023 if (ret) {
1024 goto end;
1025 }
1026
1027 /* nowrite */
1028 ret = mi_lttng_writer_write_element_signed_int(writer,
1029 mi_lttng_element_nowrite, field->nowrite);
1030 if (ret) {
1031 goto end;
1032 }
1033
1034close:
1035 /* Close field element */
1036 ret = mi_lttng_writer_close_element(writer);
1037
1038end:
1039 return ret;
1040}
7e66b1b0
JRJ
1041
1042LTTNG_HIDDEN
1043int mi_lttng_calibrate(struct mi_writer *writer,
1044 struct lttng_calibrate *calibrate)
1045{
1046 int ret;
1047
1048 /* Open calibrate element */
1049 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_calibrate);
1050 if (ret) {
1051 goto end;
1052 }
1053
1054 /* Calibration type */
1055 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1056 mi_lttng_calibratetype_string(calibrate->type));
1057 if (ret) {
1058 goto end;
1059 }
1060
1061 /* Closing calibrate element */
1062 ret = mi_lttng_writer_close_element(writer);
1063end:
1064 return ret;
1065}
89b72577
JRJ
1066LTTNG_HIDDEN
1067int mi_lttng_context(struct mi_writer *writer,
1068 struct lttng_event_context *context, int is_open)
1069{
1070 int ret;
1071 const char *type_string;
1072 struct lttng_event_perf_counter_ctx *perf_context;
1073 /* Open context */
1074 ret = mi_lttng_writer_open_element(writer , config_element_context);
1075 if (ret) {
1076 goto end;
1077 }
1078
1079 type_string = mi_lttng_event_contexttype_string(context->ctx);
1080 if (!type_string) {
1081 ret = -LTTNG_ERR_INVALID;
1082 goto end;
1083 }
1084
1085 /* Print context type */
1086 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1087 type_string);
1088
1089 /* Special case for PERF_*_COUNTER
1090 * print the lttng_event_perf_counter_ctx*/
1091 switch (context->ctx) {
1092 case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
1093 case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
1094 case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER:
1095 perf_context = &context->u.perf_counter;
1096 ret = mi_lttng_perf_counter_context(writer, perf_context);
1097 if (ret) {
1098 goto end;
1099 }
1100 break;
1101 default:
1102 break;
1103 }
1104
1105 /* Close context */
1106 if (!is_open) {
1107 ret = mi_lttng_writer_close_element(writer);
1108 }
1109
1110end:
1111 return ret;
1112}
1113
1114LTTNG_HIDDEN
1115int mi_lttng_perf_counter_context(struct mi_writer *writer,
1116 struct lttng_event_perf_counter_ctx *perf_context)
1117{
1118 int ret;
1119
1120 /* Open perf_counter_context */
1121 ret = mi_lttng_writer_open_element(writer,
1122 mi_lttng_element_perf_counter_context);
1123 if (ret) {
1124 goto end;
1125 }
1126
1127 /* Type */
1128 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1129 config_element_type, perf_context->type);
1130 if (ret) {
1131 goto end;
1132 }
1133
1134 /* Config */
1135 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1136 config_element_config, perf_context->config);
1137 if (ret) {
1138 goto end;
1139 }
1140
1141 /* Name of the perf counter */
1142 ret = mi_lttng_writer_write_element_string(writer,
1143 config_element_name, perf_context->name);
1144 if (ret) {
1145 goto end;
1146 }
1147
1148 /* Close perf_counter_context */
1149 ret = mi_lttng_writer_close_element(writer);
1150end:
1151 return ret;
1152}
This page took 0.068539 seconds and 5 git commands to generate.