const struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
- struct lttng_filter_bytecode *filter,
+ struct lttng_bytecode *filter,
struct lttng_event_exclusion *exclusion,
int wpipe);
cds_lfht_for_each_entry (
agt->events->ht, &iter.iter, agent_event, node.node) {
struct lttng_event event = {
- .enabled = agent_event->enabled,
+ .enabled = AGENT_EVENT_IS_ENABLED(agent_event),
.loglevel = agent_event->loglevel_value,
.loglevel_type = agent_event->loglevel_type,
};
const struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
- struct lttng_filter_bytecode *filter,
+ struct lttng_bytecode *filter,
struct lttng_event_exclusion *exclusion,
int wpipe, bool internal_event)
{
case LTTNG_EVENT_ALL:
{
char *filter_expression_a = NULL;
- struct lttng_filter_bytecode *filter_a = NULL;
+ struct lttng_bytecode *filter_a = NULL;
/*
* We need to duplicate filter_expression and filter,
{
char *filter_expression_copy = NULL;
- struct lttng_filter_bytecode *filter_copy = NULL;
+ struct lttng_bytecode *filter_copy = NULL;
if (filter) {
const size_t filter_size = sizeof(
- struct lttng_filter_bytecode)
+ struct lttng_bytecode)
+ filter->len;
filter_copy = zmalloc(filter_size);
const struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
- struct lttng_filter_bytecode *filter,
+ struct lttng_bytecode *filter,
struct lttng_event_exclusion *exclusion,
int wpipe)
{
const struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
char *filter_expression,
- struct lttng_filter_bytecode *filter,
+ struct lttng_bytecode *filter,
struct lttng_event_exclusion *exclusion,
int wpipe)
{
* then regenerate the metadata. Live and per-pid sessions are not
* supported and return an error.
*
- * Return 0 on success or else a LTTNG_ERR code.
+ * Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_regenerate_metadata(struct ltt_session *session)
{
*
* Ask the tracer to regenerate a new statedump.
*
- * Return 0 on success or else a LTTNG_ERR code.
+ * Return LTTNG_OK on success or else a LTTNG_ERR code.
*/
int cmd_regenerate_statedump(struct ltt_session *session)
{
struct lttng_trigger **return_trigger)
{
enum lttng_error_code ret_code;
- bool must_update_event_notifier;
+ bool must_update_event_notifiers;
const char *trigger_name;
uid_t trigger_owner;
enum lttng_trigger_status trigger_status;
if (ret_code != LTTNG_OK) {
DBG("Failed to register trigger to notification thread: trigger name = '%s', trigger owner uid = %d, error code = %d",
trigger_name, (int) trigger_owner, ret_code);
- goto end_notification_thread;
+ goto end;
}
trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
trigger_name : "(unnamed)";
- ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifier);
+ ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifiers);
if (ret_code != LTTNG_OK) {
ERR("Failed to determine if event modifies event notifiers: trigger name = '%s', trigger owner uid = %d, error code = %d",
trigger_name, (int) trigger_owner, ret_code);
- goto end_notification_thread;
+ goto end;
}
/*
* Synchronize tracers if the trigger adds an event notifier.
*/
- if (must_update_event_notifier) {
- if (lttng_trigger_get_underlying_domain_type_restriction(
- trigger) == LTTNG_DOMAIN_KERNEL) {
+ if (must_update_event_notifiers) {
+ const enum lttng_domain_type trigger_domain =
+ lttng_trigger_get_underlying_domain_type_restriction(trigger);
+ session_lock_list();
+ switch (trigger_domain) {
+ case LTTNG_DOMAIN_KERNEL:
+ {
ret_code = kernel_register_event_notifier(
trigger, cmd_creds);
if (ret_code != LTTNG_OK) {
(int) trigger_owner,
ret_code);
}
-
- goto end;
}
- } else {
+ break;
+ }
+ case LTTNG_DOMAIN_UST:
ust_app_global_update_all_event_notifier_rules();
+ break;
+ case LTTNG_DOMAIN_NONE:
+ abort();
+ default:
+ {
+ /* Agent domains. */
+ struct agent *agt = agent_find_by_event_notifier_domain(
+ trigger_domain);
+
+ if (!agt) {
+ agt = agent_create(trigger_domain);
+ if (!agt) {
+ ret_code = LTTNG_ERR_NOMEM;
+ goto end_unlock_session_list;
+ }
+ agent_add(agt, trigger_agents_ht_by_domain);
+ }
+
+ ret_code = trigger_agent_enable(trigger, agt);
+ if (ret_code != LTTNG_OK) {
+ goto end_unlock_session_list;
+ }
+
+ break;
}
+ }
+
+ session_unlock_list();
}
/*
* reference to the trigger so the caller doesn't have to care if those
* are distinct instances or not.
*/
- lttng_trigger_get(trigger);
- *return_trigger = trigger;
-
-end_notification_thread:
- /* Ownership of trigger was transferred. */
- trigger = NULL;
+ if (ret_code == LTTNG_OK) {
+ lttng_trigger_get(trigger);
+ *return_trigger = trigger;
+ /* Ownership of trigger was transferred to caller. */
+ trigger = NULL;
+ }
end:
return ret_code;
+end_unlock_session_list:
+ session_unlock_list();
+ return ret_code;
}
enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd_creds,
struct notification_thread_handle *notification_thread)
{
enum lttng_error_code ret_code;
- bool must_update_event_notifier;
+ bool must_update_event_notifiers;
const char *trigger_name;
uid_t trigger_owner;
enum lttng_trigger_status trigger_status;
}
}
- ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifier);
+ ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifiers);
if (ret_code != LTTNG_OK) {
ERR("Failed to determine if event modifies event notifiers: trigger name = '%s', trigger owner uid = %d, error code = %d",
trigger_name, (int) trigger_owner, ret_code);
/*
* Synchronize tracers if the trigger removes an event notifier.
+ * Do this even if the trigger unregistration failed to at least stop
+ * the tracers from producing notifications associated with this
+ * event notifier.
*/
- if (must_update_event_notifier) {
- if (lttng_trigger_get_underlying_domain_type_restriction(
- trigger) == LTTNG_DOMAIN_KERNEL) {
-
+ if (must_update_event_notifiers) {
+ const enum lttng_domain_type trigger_domain =
+ lttng_trigger_get_underlying_domain_type_restriction(
+ trigger);
+
+ session_lock_list();
+ switch (trigger_domain) {
+ case LTTNG_DOMAIN_KERNEL:
+ {
ret_code = kernel_unregister_event_notifier(
trigger);
- } else {
+ break;
+ }
+ case LTTNG_DOMAIN_UST:
ust_app_global_update_all_event_notifier_rules();
+ break;
+ case LTTNG_DOMAIN_NONE:
+ abort();
+ default:
+ {
+ /* Agent domains. */
+ struct agent *agt = agent_find_by_event_notifier_domain(
+ trigger_domain);
+
+ if (!agt) {
+ agt = agent_create(trigger_domain);
+ if (!agt) {
+ ret_code = LTTNG_ERR_NOMEM;
+ goto end_unlock_session_list;
+ }
+ agent_add(agt, trigger_agents_ht_by_domain);
+ }
+
+ ret_code = trigger_agent_disable(trigger, agt);
+ if (ret_code != LTTNG_OK) {
+ goto end_unlock_session_list;
+ }
+
+ break;
+ }
}
+
+ session_unlock_list();
}
end:
return ret_code;
-}
+end_unlock_session_list:
+ session_unlock_list();
+ return ret_code;}
int cmd_list_triggers(struct command_ctx *cmd_ctx,
struct notification_thread_handle *notification_thread,
sizeof(session->shm_path));
session->shm_path[sizeof(session->shm_path) - 1] = '\0';
- return 0;
+ return LTTNG_OK;
}
/*
* 'activate' to false means deactivate the rotation schedule and validate that
* 'new_value' has the same value as the currently active value.
*
- * Return 0 on success or else a positive LTTNG_ERR code.
+ * Return LTTNG_OK on success or else a positive LTTNG_ERR code.
*/
int cmd_rotation_set_schedule(struct ltt_session *session,
bool activate, enum lttng_rotation_schedule_type schedule_type,