Compare provider and context names in trace_ust_match_context
[lttng-tools.git] / src / bin / lttng-sessiond / event.c
CommitLineData
54d01ffb
DG
1/*
2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
3 *
d14d33bf
AM
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2 only,
6 * as published by the Free Software Foundation.
54d01ffb 7 *
d14d33bf
AM
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
54d01ffb 12 *
d14d33bf
AM
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
54d01ffb
DG
16 */
17
6c1c0768 18#define _LGPL_SOURCE
d87bfb32 19#include <errno.h>
54d01ffb 20#include <urcu/list.h>
2bdd86d4 21#include <string.h>
54d01ffb
DG
22
23#include <lttng/lttng.h>
db758600 24#include <common/error.h>
10a8a223 25#include <common/sessiond-comm/sessiond-comm.h>
54d01ffb
DG
26
27#include "channel.h"
28#include "event.h"
4771f025 29#include "kernel.h"
be6a6276 30#include "lttng-sessiond.h"
9df8df5e 31#include "ust-ctl.h"
edb67388
DG
32#include "ust-app.h"
33#include "trace-kernel.h"
34#include "trace-ust.h"
7c1d2758 35#include "agent.h"
54d01ffb 36
025faf73
DG
37/*
38 * Add unique UST event based on the event name, filter bytecode and loglevel.
39 */
18eace3b
DG
40static void add_unique_ust_event(struct lttng_ht *ht,
41 struct ltt_ust_event *event)
42{
43 struct cds_lfht_node *node_ptr;
44 struct ltt_ust_ht_key key;
45
46 assert(ht);
47 assert(ht->ht);
48 assert(event);
49
50 key.name = event->attr.name;
51 key.filter = (struct lttng_filter_bytecode *) event->filter;
b953b8cd
PP
52 key.loglevel_type = event->attr.loglevel_type;
53 key.loglevel_value = event->attr.loglevel;
4031e53e 54 key.exclusion = event->exclusion;
18eace3b
DG
55
56 node_ptr = cds_lfht_add_unique(ht->ht,
57 ht->hash_fct(event->node.key, lttng_ht_seed),
58 trace_ust_ht_match_event, &key, &event->node.node);
59 assert(node_ptr == &event->node.node);
60}
61
54d01ffb 62/*
9550ee81
JR
63 * Disable kernel tracepoint events for a channel from the kernel session of
64 * a specified event_name and event type.
65 * On type LTTNG_EVENT_ALL all events with event_name are disabled.
66 * If event_name is NULL all events of the specified type are disabled.
54d01ffb 67 */
d0ae4ea8 68int event_kernel_disable_event(struct ltt_kernel_channel *kchan,
9550ee81 69 char *event_name, enum lttng_event_type type)
54d01ffb 70{
9550ee81 71 int ret, error = 0, found = 0;
54d01ffb
DG
72 struct ltt_kernel_event *kevent;
73
0525e9ae
DG
74 assert(kchan);
75
54d01ffb
DG
76 /* For each event in the kernel session */
77 cds_list_for_each_entry(kevent, &kchan->events_list.head, list) {
d0ae4ea8
MD
78 if (type != LTTNG_EVENT_ALL && kevent->type != type)
79 continue;
9550ee81
JR
80 if (event_name != NULL && strcmp(event_name, kevent->event->name)) {
81 continue;
82 }
83 found++;
54d01ffb
DG
84 ret = kernel_disable_event(kevent);
85 if (ret < 0) {
9550ee81 86 error = 1;
54d01ffb
DG
87 continue;
88 }
89 }
9550ee81
JR
90 DBG("Disable kernel event: found %d events with name: %s and type: %d",
91 found, event_name ? event_name : "NULL", type);
7a3d1328 92
9550ee81
JR
93 if (event_name != NULL && !found) {
94 ret = LTTNG_ERR_NO_EVENT;
95 } else {
96 ret = error ? LTTNG_ERR_KERN_DISABLE_FAIL : LTTNG_OK;
97 }
98
99 return ret;
54d01ffb
DG
100}
101
102/*
7a3d1328 103 * Enable kernel tracepoint event for a channel from the kernel session.
49d21f93 104 * We own filter_expression and filter.
54d01ffb 105 */
d0ae4ea8 106int event_kernel_enable_event(struct ltt_kernel_channel *kchan,
00a62084
MD
107 struct lttng_event *event, char *filter_expression,
108 struct lttng_filter_bytecode *filter)
54d01ffb
DG
109{
110 int ret;
111 struct ltt_kernel_event *kevent;
112
0525e9ae
DG
113 assert(kchan);
114 assert(event);
115
00a62084
MD
116 kevent = trace_kernel_find_event(event->name, kchan,
117 event->type, filter);
54d01ffb 118 if (kevent == NULL) {
00a62084
MD
119 ret = kernel_create_event(event, kchan,
120 filter_expression, filter);
a969e101
MD
121 /* We have passed ownership */
122 filter_expression = NULL;
123 filter = NULL;
54d01ffb 124 if (ret < 0) {
bd29c13d
DG
125 switch (-ret) {
126 case EEXIST:
f73fabfd 127 ret = LTTNG_ERR_KERN_EVENT_EXIST;
bd29c13d
DG
128 break;
129 case ENOSYS:
f73fabfd 130 ret = LTTNG_ERR_KERN_EVENT_ENOSYS;
bd29c13d
DG
131 break;
132 default:
f73fabfd 133 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
bd29c13d 134 break;
d87bfb32 135 }
7a3d1328 136 goto end;
54d01ffb
DG
137 }
138 } else if (kevent->enabled == 0) {
139 ret = kernel_enable_event(kevent);
140 if (ret < 0) {
f73fabfd 141 ret = LTTNG_ERR_KERN_ENABLE_FAIL;
7a3d1328 142 goto end;
54d01ffb 143 }
42224349
DG
144 } else {
145 /* At this point, the event is considered enabled */
f73fabfd 146 ret = LTTNG_ERR_KERN_EVENT_EXIST;
42224349 147 goto end;
54d01ffb 148 }
42224349 149
f73fabfd 150 ret = LTTNG_OK;
7a3d1328 151end:
a969e101
MD
152 free(filter_expression);
153 free(filter);
54d01ffb
DG
154 return ret;
155}
156
7f79d3a1
DG
157/*
158 * ============================
159 * UST : The Ultimate Frontier!
160 * ============================
161 */
162
2bdd86d4
MD
163/*
164 * Enable UST tracepoint event for a channel from a UST session.
49d21f93 165 * We own filter_expression, filter, and exclusion.
2bdd86d4 166 */
7972aab2 167int event_ust_enable_tracepoint(struct ltt_ust_session *usess,
025faf73 168 struct ltt_ust_channel *uchan, struct lttng_event *event,
6b453b5e 169 char *filter_expression,
f1613f52 170 struct lttng_filter_bytecode *filter,
88f06f15
JG
171 struct lttng_event_exclusion *exclusion,
172 bool internal_event)
2bdd86d4 173{
f73fabfd 174 int ret = LTTNG_OK, to_create = 0;
edb67388
DG
175 struct ltt_ust_event *uevent;
176
0525e9ae
DG
177 assert(usess);
178 assert(uchan);
179 assert(event);
180
18eace3b
DG
181 rcu_read_lock();
182
025faf73 183 uevent = trace_ust_find_event(uchan->events, event->name, filter,
b953b8cd 184 event->loglevel_type, event->loglevel, exclusion);
87c6e328 185 if (!uevent) {
6b453b5e 186 uevent = trace_ust_create_event(event, filter_expression,
87c6e328 187 filter, exclusion, internal_event);
49d21f93
MD
188 /* We have passed ownership */
189 filter_expression = NULL;
190 filter = NULL;
191 exclusion = NULL;
edb67388 192 if (uevent == NULL) {
95a82664 193 ret = LTTNG_ERR_UST_ENABLE_FAIL;
edb67388
DG
194 goto error;
195 }
025faf73 196
fc34caaa 197 /* Valid to set it after the goto error since uevent is still NULL */
edb67388
DG
198 to_create = 1;
199 }
2bdd86d4 200
7f79d3a1
DG
201 if (uevent->enabled) {
202 /* It's already enabled so everything is OK */
5bcdda4f 203 ret = LTTNG_ERR_UST_EVENT_ENABLED;
7f79d3a1
DG
204 goto end;
205 }
206
fc34caaa
DG
207 uevent->enabled = 1;
208
7972aab2
DG
209 if (to_create) {
210 /* Create event on all UST registered apps for session */
211 ret = ust_app_create_event_glb(usess, uchan, uevent);
212 } else {
213 /* Enable event on all UST registered apps for session */
214 ret = ust_app_enable_event_glb(usess, uchan, uevent);
215 }
48842b30 216
7972aab2
DG
217 if (ret < 0) {
218 if (ret == -LTTNG_UST_ERR_EXIST) {
219 ret = LTTNG_ERR_UST_EVENT_EXIST;
220 goto end;
221 } else {
222 ret = LTTNG_ERR_UST_ENABLE_FAIL;
223 goto error;
edb67388 224 }
2bdd86d4 225 }
48842b30 226
7f79d3a1 227 if (to_create) {
fc34caaa 228 /* Add ltt ust event to channel */
18eace3b 229 add_unique_ust_event(uchan->events, uevent);
7f79d3a1 230 }
edb67388 231
7f79d3a1
DG
232 DBG("Event UST %s %s in channel %s", uevent->attr.name,
233 to_create ? "created" : "enabled", uchan->name);
234
f73fabfd 235 ret = LTTNG_OK;
fc34caaa 236
fb89d070 237end:
18eace3b 238 rcu_read_unlock();
49d21f93
MD
239 free(filter_expression);
240 free(filter);
241 free(exclusion);
fc34caaa 242 return ret;
edb67388
DG
243
244error:
fc34caaa
DG
245 /*
246 * Only destroy event on creation time (not enabling time) because if the
247 * event is found in the channel (to_create == 0), it means that at some
248 * point the enable_event worked and it's thus valid to keep it alive.
249 * Destroying it also implies that we also destroy it's shadow copy to sync
250 * everyone up.
251 */
252 if (to_create) {
253 /* In this code path, the uevent was not added to the hash table */
254 trace_ust_destroy_event(uevent);
255 }
18eace3b 256 rcu_read_unlock();
49d21f93
MD
257 free(filter_expression);
258 free(filter);
259 free(exclusion);
2bdd86d4
MD
260 return ret;
261}
262
7f79d3a1
DG
263/*
264 * Disable UST tracepoint of a channel from a UST session.
265 */
7972aab2 266int event_ust_disable_tracepoint(struct ltt_ust_session *usess,
7f79d3a1 267 struct ltt_ust_channel *uchan, char *event_name)
2bdd86d4
MD
268{
269 int ret;
7f79d3a1 270 struct ltt_ust_event *uevent;
18eace3b
DG
271 struct lttng_ht_node_str *node;
272 struct lttng_ht_iter iter;
18eace3b 273 struct lttng_ht *ht;
2bdd86d4 274
0525e9ae
DG
275 assert(usess);
276 assert(uchan);
277 assert(event_name);
278
18eace3b
DG
279 ht = uchan->events;
280
18eace3b 281 rcu_read_lock();
025faf73
DG
282
283 /*
284 * We use a custom lookup since we need the iterator for the next_duplicate
285 * call in the do while loop below.
286 */
287 cds_lfht_lookup(ht->ht, ht->hash_fct((void *) event_name, lttng_ht_seed),
288 trace_ust_ht_match_event_by_name, event_name, &iter.iter);
18eace3b
DG
289 node = lttng_ht_iter_get_node_str(&iter);
290 if (node == NULL) {
291 DBG2("Trace UST event NOT found by name %s", event_name);
f73fabfd 292 ret = LTTNG_ERR_UST_EVENT_NOT_FOUND;
7f79d3a1 293 goto error;
2bdd86d4 294 }
7f79d3a1 295
18eace3b
DG
296 do {
297 uevent = caa_container_of(node, struct ltt_ust_event, node);
025faf73
DG
298 assert(uevent);
299
18eace3b
DG
300 if (uevent->enabled == 0) {
301 /* It's already disabled so everything is OK */
a1dcaf0f 302 goto next;
7f79d3a1 303 }
18eace3b 304
7972aab2
DG
305 ret = ust_app_disable_event_glb(usess, uchan, uevent);
306 if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
307 ret = LTTNG_ERR_UST_DISABLE_FAIL;
18eace3b
DG
308 goto error;
309 }
18eace3b
DG
310 uevent->enabled = 0;
311
025faf73
DG
312 DBG2("Event UST %s disabled in channel %s", uevent->attr.name,
313 uchan->name);
314
a1dcaf0f 315next:
18eace3b
DG
316 /* Get next duplicate event by name. */
317 cds_lfht_next_duplicate(ht->ht, trace_ust_ht_match_event_by_name,
318 event_name, &iter.iter);
319 node = lttng_ht_iter_get_node_str(&iter);
320 } while (node);
7f79d3a1 321
f73fabfd 322 ret = LTTNG_OK;
7f79d3a1 323
7f79d3a1 324error:
18eace3b 325 rcu_read_unlock();
7f79d3a1
DG
326 return ret;
327}
328
b1e7fe2d
JR
329/*
330 * Disable all UST tracepoints for a channel from a UST session.
331 */
332int event_ust_disable_all_tracepoints(struct ltt_ust_session *usess,
333 struct ltt_ust_channel *uchan)
334{
3e81c0f2 335 int ret, i, size, error = 0;
b1e7fe2d
JR
336 struct lttng_ht_iter iter;
337 struct ltt_ust_event *uevent = NULL;
338 struct lttng_event *events = NULL;
339
340 assert(usess);
341 assert(uchan);
342
343 rcu_read_lock();
344
345 /* Disabling existing events */
346 cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent,
347 node.node) {
348 if (uevent->enabled == 1) {
349 ret = event_ust_disable_tracepoint(usess, uchan,
350 uevent->attr.name);
351 if (ret < 0) {
3e81c0f2 352 error = LTTNG_ERR_UST_DISABLE_FAIL;
b1e7fe2d
JR
353 continue;
354 }
355 }
356 }
357
358 /* Get all UST available events */
359 size = ust_app_list_events(&events);
360 if (size < 0) {
361 ret = LTTNG_ERR_UST_LIST_FAIL;
362 goto error;
363 }
364
365 for (i = 0; i < size; i++) {
366 ret = event_ust_disable_tracepoint(usess, uchan,
367 events[i].name);
3e81c0f2 368 if (ret < 0) {
b1e7fe2d 369 /* Continue to disable the rest... */
3e81c0f2 370 error = LTTNG_ERR_UST_DISABLE_FAIL;
b1e7fe2d
JR
371 continue;
372 }
373 }
374
3e81c0f2 375 ret = error ? error : LTTNG_OK;
b1e7fe2d
JR
376error:
377 rcu_read_unlock();
378 free(events);
379 return ret;
380}
381
f20baf8e 382/*
022d91ba 383 * Enable all agent event for a given UST session.
f20baf8e
DG
384 *
385 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
386 */
022d91ba 387int event_agent_enable_all(struct ltt_ust_session *usess,
fefd409b 388 struct agent *agt, struct lttng_event *event,
51755dc8 389 struct lttng_filter_bytecode *filter ,char *filter_expression)
f20baf8e
DG
390{
391 int ret;
fefd409b 392 struct agent_event *aevent;
f20baf8e
DG
393 struct lttng_ht_iter iter;
394
395 assert(usess);
396
022d91ba 397 DBG("Event agent enabling ALL events for session %" PRIu64, usess->id);
f20baf8e 398
022d91ba 399 /* Enable event on agent application through TCP socket. */
8404118c 400 ret = event_agent_enable(usess, agt, event, filter, filter_expression);
f20baf8e
DG
401 if (ret != LTTNG_OK) {
402 goto error;
403 }
404
405 /* Flag every event that they are now enabled. */
406 rcu_read_lock();
fefd409b 407 cds_lfht_for_each_entry(agt->events->ht, &iter.iter, aevent,
f20baf8e 408 node.node) {
fefd409b 409 aevent->enabled = 1;
f20baf8e
DG
410 }
411 rcu_read_unlock();
412
413 ret = LTTNG_OK;
414
415error:
416 return ret;
417}
418
419/*
022d91ba 420 * Enable a single agent event for a given UST session.
f20baf8e
DG
421 *
422 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
423 */
fefd409b
DG
424int event_agent_enable(struct ltt_ust_session *usess,
425 struct agent *agt, struct lttng_event *event,
8404118c
JG
426 struct lttng_filter_bytecode *filter,
427 char *filter_expression)
f20baf8e
DG
428{
429 int ret, created = 0;
fefd409b 430 struct agent_event *aevent;
f20baf8e
DG
431
432 assert(usess);
433 assert(event);
fefd409b 434 assert(agt);
f20baf8e 435
022d91ba 436 DBG("Event agent enabling %s for session %" PRIu64 " with loglevel type %d "
51755dc8
JG
437 ", loglevel %d and filter \"%s\"", event->name,
438 usess->id, event->loglevel_type, event->loglevel,
439 filter_expression ? filter_expression : "NULL");
f20baf8e 440
a9319624 441 aevent = agent_find_event(event->name, event->loglevel_type,
6b10b3b0 442 event->loglevel, filter_expression, agt);
fefd409b 443 if (!aevent) {
a9319624
PP
444 aevent = agent_create_event(event->name, event->loglevel_type,
445 event->loglevel, filter,
51755dc8 446 filter_expression);
fefd409b 447 if (!aevent) {
f20baf8e
DG
448 ret = LTTNG_ERR_NOMEM;
449 goto error;
450 }
451 created = 1;
452 }
453
454 /* Already enabled? */
fefd409b 455 if (aevent->enabled) {
f20baf8e
DG
456 goto end;
457 }
458
fefd409b 459 ret = agent_enable_event(aevent, agt->domain);
f20baf8e
DG
460 if (ret != LTTNG_OK) {
461 goto error;
462 }
463
464 /* If the event was created prior to the enable, add it to the domain. */
465 if (created) {
fefd409b 466 agent_add_event(aevent, agt);
f20baf8e
DG
467 }
468
469end:
470 return LTTNG_OK;
471
472error:
473 if (created) {
fefd409b 474 agent_destroy_event(aevent);
f20baf8e
DG
475 }
476 return ret;
477}
478
da6c3a50 479/*
d1ec8e20
JG
480 * Return the default event name associated with the provided UST domain. Return
481 * NULL on error.
da6c3a50
DG
482 */
483const char *event_get_default_agent_ust_name(enum lttng_domain_type domain)
484{
485 const char *default_event_name = NULL;
486
0e115563
DG
487 switch (domain) {
488 case LTTNG_DOMAIN_LOG4J:
d1ec8e20 489 default_event_name = DEFAULT_LOG4J_EVENT_NAME;
0e115563
DG
490 break;
491 case LTTNG_DOMAIN_JUL:
d1ec8e20 492 default_event_name = DEFAULT_JUL_EVENT_NAME;
0e115563
DG
493 break;
494 case LTTNG_DOMAIN_PYTHON:
e7c82272 495 default_event_name = DEFAULT_PYTHON_EVENT_NAME;
0e115563
DG
496 break;
497 default:
da6c3a50
DG
498 assert(0);
499 }
500
501 return default_event_name;
502}
503
f20baf8e 504/*
e261a6cc 505 * Disable a given agent event for a given UST session.
f20baf8e 506 *
e261a6cc 507 * Must be called with the RCU read lock held.
f20baf8e
DG
508 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
509 */
e261a6cc
PP
510static int event_agent_disable_one(struct ltt_ust_session *usess,
511 struct agent *agt, struct agent_event *aevent)
f20baf8e
DG
512{
513 int ret;
be6a6276
DG
514 struct ltt_ust_event *uevent = NULL;
515 struct ltt_ust_channel *uchan = NULL;
71aecbf8 516 const char *ust_event_name, *ust_channel_name;
f20baf8e 517
fefd409b 518 assert(agt);
f20baf8e 519 assert(usess);
e261a6cc 520 assert(aevent);
f20baf8e 521
e261a6cc
PP
522 DBG("Event agent disabling %s (loglevel type %d, loglevel value %d) for session %" PRIu64,
523 aevent->name, aevent->loglevel_type, aevent->loglevel_value,
524 usess->id);
f20baf8e
DG
525
526 /* Already disabled? */
fefd409b 527 if (!aevent->enabled) {
f20baf8e
DG
528 goto end;
529 }
530
71aecbf8
DG
531 if (agt->domain == LTTNG_DOMAIN_JUL) {
532 ust_channel_name = DEFAULT_JUL_CHANNEL_NAME;
533 } else if (agt->domain == LTTNG_DOMAIN_LOG4J) {
534 ust_channel_name = DEFAULT_LOG4J_CHANNEL_NAME;
0e115563
DG
535 } else if (agt->domain == LTTNG_DOMAIN_PYTHON) {
536 ust_channel_name = DEFAULT_PYTHON_CHANNEL_NAME;
71aecbf8
DG
537 } else {
538 ret = LTTNG_ERR_INVALID;
539 goto error;
540 }
541
be6a6276
DG
542 /*
543 * Disable it on the UST side. First get the channel reference then find
544 * the event and finally disable it.
545 */
546 uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
71aecbf8 547 (char *) ust_channel_name);
be6a6276
DG
548 if (!uchan) {
549 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
550 goto error;
551 }
552
da6c3a50
DG
553 ust_event_name = event_get_default_agent_ust_name(agt->domain);
554 if (!ust_event_name) {
555 ret = LTTNG_ERR_FATAL;
556 goto error;
be6a6276
DG
557 }
558
559 /*
b953b8cd
PP
560 * Agent UST event has its loglevel type forced to
561 * LTTNG_UST_LOGLEVEL_ALL. The actual loglevel type/value filtering
562 * happens thanks to an UST filter. The following -1 is actually
563 * ignored since the type is LTTNG_UST_LOGLEVEL_ALL.
be6a6276 564 */
da6c3a50 565 uevent = trace_ust_find_event(uchan->events, (char *) ust_event_name,
b953b8cd 566 aevent->filter, LTTNG_UST_LOGLEVEL_ALL, -1, NULL);
022d91ba 567 /* If the agent event exists, it must be available on the UST side. */
be6a6276
DG
568 assert(uevent);
569
570 ret = ust_app_disable_event_glb(usess, uchan, uevent);
571 if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
572 ret = LTTNG_ERR_UST_DISABLE_FAIL;
573 goto error;
574 }
575
0dcfcf94
DG
576 /*
577 * Flag event that it's disabled so the shadow copy on the ust app side
578 * will disable it if an application shows up.
579 */
580 uevent->enabled = 0;
581
fefd409b 582 ret = agent_disable_event(aevent, agt->domain);
f20baf8e
DG
583 if (ret != LTTNG_OK) {
584 goto error;
585 }
586
587end:
588 return LTTNG_OK;
589
590error:
591 return ret;
592}
e261a6cc
PP
593
594/*
595 * Disable all agent events matching a given name for a given UST session.
596 *
597 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
598 */
599int event_agent_disable(struct ltt_ust_session *usess, struct agent *agt,
600 char *event_name)
601{
602 int ret = LTTNG_OK;
603 struct agent_event *aevent;
604 struct lttng_ht_iter iter;
605 struct lttng_ht_node_str *node;
606
607 assert(agt);
608 assert(usess);
609 assert(event_name);
610
611 DBG("Event agent disabling %s (all loglevels) for session %" PRIu64, event_name, usess->id);
612
613 rcu_read_lock();
614 agent_find_events_by_name(event_name, agt, &iter);
615 node = lttng_ht_iter_get_node_str(&iter);
616
617 if (node == NULL) {
618 DBG2("Event agent NOT found by name %s", event_name);
619 ret = LTTNG_ERR_UST_EVENT_NOT_FOUND;
620 goto end;
621 }
622
623 do {
624 aevent = caa_container_of(node, struct agent_event, node);
625 ret = event_agent_disable_one(usess, agt, aevent);
626
627 if (ret != LTTNG_OK) {
628 goto end;
629 }
630
631 /* Get next duplicate agent event by name. */
632 agent_event_next_duplicate(event_name, agt, &iter);
633 node = lttng_ht_iter_get_node_str(&iter);
634 } while (node);
635end:
636 rcu_read_unlock();
637 return ret;
638}
f20baf8e 639/*
022d91ba 640 * Disable all agent event for a given UST session.
f20baf8e
DG
641 *
642 * Return LTTNG_OK on success or else a LTTNG_ERR* code.
643 */
fefd409b
DG
644int event_agent_disable_all(struct ltt_ust_session *usess,
645 struct agent *agt)
f20baf8e 646{
0dcfcf94 647 int ret;
fefd409b 648 struct agent_event *aevent;
f20baf8e
DG
649 struct lttng_ht_iter iter;
650
fefd409b 651 assert(agt);
f20baf8e
DG
652 assert(usess);
653
0dcfcf94
DG
654 /*
655 * Disable event on agent application. Continue to disable all other events
656 * if the * event is not found.
657 */
fefd409b 658 ret = event_agent_disable(usess, agt, "*");
0dcfcf94
DG
659 if (ret != LTTNG_OK && ret != LTTNG_ERR_UST_EVENT_NOT_FOUND) {
660 goto error;
f20baf8e
DG
661 }
662
b9866e08 663 /* Disable every event. */
f20baf8e 664 rcu_read_lock();
fefd409b 665 cds_lfht_for_each_entry(agt->events->ht, &iter.iter, aevent,
f20baf8e 666 node.node) {
0dcfcf94
DG
667 if (!aevent->enabled) {
668 continue;
669 }
670
671 ret = event_agent_disable(usess, agt, aevent->name);
672 if (ret != LTTNG_OK) {
b9866e08 673 goto error_unlock;
f20baf8e 674 }
f20baf8e 675 }
f20baf8e
DG
676 ret = LTTNG_OK;
677
b9866e08
JG
678error_unlock:
679 rcu_read_unlock();
f20baf8e
DG
680error:
681 return ret;
682}
This page took 0.088644 seconds and 5 git commands to generate.