summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
44760c2)
Registering triggers with an on-event hit condition affects event
notifiers, imposing a synchronization of enablers with the user space
tracers.
As noted in the comments of session.h, the session list lock protects
those updates and is, ultimately, ill-named. The comment is adjusted to
mention "tracer configurations" rather than "session configurations"
since event notifiers are not part of a session, making the comment
imprecise.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Id1bcbcccbdeeafa91176ed3413ddddbcbab10ad2
struct lttng_trigger **return_trigger)
{
enum lttng_error_code ret_code;
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;
const char *trigger_name;
uid_t trigger_owner;
enum lttng_trigger_status trigger_status;
trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
trigger_name : "(unnamed)";
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);
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 adds an event notifier.
*/
/*
* Synchronize tracers if the trigger adds an event notifier.
*/
- if (must_update_event_notifier) {
+ if (must_update_event_notifiers) {
const enum lttng_domain_type trigger_domain =
lttng_trigger_get_underlying_domain_type_restriction(trigger);
const enum lttng_domain_type trigger_domain =
lttng_trigger_get_underlying_domain_type_restriction(trigger);
switch (trigger_domain) {
case LTTNG_DOMAIN_KERNEL:
{
switch (trigger_domain) {
case LTTNG_DOMAIN_KERNEL:
{
agt = agent_create(trigger_domain);
if (!agt) {
ret_code = LTTNG_ERR_NOMEM;
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) {
}
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;
+
+ session_unlock_list();
trigger = NULL;
end:
return ret_code;
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,
}
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;
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;
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);
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);
* the tracers from producing notifications associated with this
* event notifier.
*/
* the tracers from producing notifications associated with this
* event notifier.
*/
- if (must_update_event_notifier) {
+ if (must_update_event_notifiers) {
const enum lttng_domain_type trigger_domain =
lttng_trigger_get_underlying_domain_type_restriction(
trigger);
const enum lttng_domain_type trigger_domain =
lttng_trigger_get_underlying_domain_type_restriction(
trigger);
switch (trigger_domain) {
case LTTNG_DOMAIN_KERNEL:
{
switch (trigger_domain) {
case LTTNG_DOMAIN_KERNEL:
{
agt = agent_create(trigger_domain);
if (!agt) {
ret_code = LTTNG_ERR_NOMEM;
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) {
}
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;
+
+ session_unlock_list();
+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,
int cmd_list_triggers(struct command_ctx *cmd_ctx,
struct notification_thread_handle *notification_thread,
* also used as a multi-session lock when synchronizing newly-registered
* 'user space tracer' and 'agent' applications.
*
* also used as a multi-session lock when synchronizing newly-registered
* 'user space tracer' and 'agent' applications.
*
- * In other words, it prevents session configurations from changing while they
+ * In other words, it prevents tracer configurations from changing while they
* are being transmitted to the various applications.
*/
void session_lock_list(void);
* are being transmitted to the various applications.
*/
void session_lock_list(void);