*/
extern struct lttng_ht *agent_apps_ht_by_sock;
+/*
+ * Hash table that contains the trigger agents by domain */
+extern struct lttng_ht *trigger_agents_ht_by_domain;
+
struct agent_ht_key {
const char *name;
int loglevel_value;
enum lttng_loglevel_type loglevel_type;
- char *filter_expression;
+ const char *filter_expression;
};
/*
/*
* Agent event representation.
+ * Accesses to this structure are protected by the session list lock.
*/
struct agent_event {
/* Name of the event. */
enum lttng_loglevel_type loglevel_type;
/*
- * Tells if the event is enabled or not on the agent.
+ * Tells if the event is enabled or not on the agent. While this can be
+ * implicitly tested as a boolean, it is in fact a reference count and
+ * the AGENT_EVENT_IS_ENABLED macro should be used to prevent accidental
+ * comparisons to non-zero literals (e.g. '1').
+ *
+ * Multiple triggers and events can map to the same agent event as it
+ * is merely a "filter" in front of a user space tracer enabler.
+ *
+ * This count is updated to ensure an event is only disabled when all
+ * matching enablers are disabled.
*/
- unsigned int enabled:1;
+ unsigned int enabled_count;
/* Hash table node of the agent domain object. */
struct lttng_ht_node_str node;
/* Filter associated with the event. NULL if none. */
- struct lttng_filter_bytecode *filter;
+ struct lttng_bytecode *filter;
char *filter_expression;
struct lttng_event_exclusion *exclusion;
};
+#define AGENT_EVENT_IS_ENABLED(agent_event) (!!agent_event->enabled_count)
+
/*
- * Agent object containing events enabled/disabled for it.
+ * Agent object containing events enabled/disabled for a given domain in a
+ * scope. The scope is typically a session, but can also be "global" in the
+ * context of event notifiers: see event_notifiers_find_agent().
*/
struct agent {
/*
/* Agent event API. */
struct agent_event *agent_create_event(const char *name,
enum lttng_loglevel_type loglevel_type, int loglevel_value,
- struct lttng_filter_bytecode *filter,
+ struct lttng_bytecode *filter,
char *filter_expression);
void agent_add_event(struct agent_event *event, struct agent *agt);
struct agent_event *agent_find_event(const char *name,
- enum lttng_loglevel_type loglevel_type, int loglevel_value,
- char *filter_expression, struct agent *agt);
+ enum lttng_loglevel_type loglevel_type,
+ int loglevel_value,
+ const char *filter_expression,
+ struct agent *agt);
void agent_find_events_by_name(const char *name, struct agent *agt,
struct lttng_ht_iter* iter);
void agent_event_next_duplicate(const char *name,
enum lttng_domain_type domain);
int agent_disable_event(struct agent_event *event,
enum lttng_domain_type domain);
-void agent_update(struct agent *agt, int sock);
+void agent_update(const struct agent *agt, const struct agent_app *app);
int agent_list_events(struct lttng_event **events,
enum lttng_domain_type domain);
+struct agent_event *agent_find_event_by_trigger(
+ const struct lttng_trigger *trigger, struct agent *agt);
+
+/* Global event notifier per-domain agents. */
+struct agent *agent_find_by_event_notifier_domain(
+ enum lttng_domain_type domain_type);
+void agent_by_event_notifier_domain_ht_destroy(void);
+int agent_by_event_notifier_domain_ht_create(void);
+
#endif /* LTTNG_SESSIOND_AGENT_H */