*
* Return LTTNG_OK on success or else a LTTNG_ERR* code.
*/
-int agent_enable_event(struct agent_event *event)
+int agent_enable_event(struct agent_event *event,
+ enum lttng_domain_type domain)
{
int ret;
struct agent_app *app;
cds_lfht_for_each_entry(agent_apps_ht_by_sock->ht, &iter.iter, app,
node.node) {
+ if (app->domain != domain) {
+ continue;
+ }
+
/* Enable event on agent application through TCP socket. */
ret = enable_event(app, event);
if (ret != LTTNG_OK) {
*
* Return LTTNG_OK on success or else a LTTNG_ERR* code.
*/
-int agent_disable_event(struct agent_event *event)
+int agent_disable_event(struct agent_event *event,
+ enum lttng_domain_type domain)
{
int ret;
struct agent_app *app;
cds_lfht_for_each_entry(agent_apps_ht_by_sock->ht, &iter.iter, app,
node.node) {
+ if (app->domain != domain) {
+ continue;
+ }
+
/* Enable event on agent application through TCP socket. */
ret = disable_event(app, event);
if (ret != LTTNG_OK) {
*
* Return the number of events or else a negative value.
*/
-int agent_list_events(struct lttng_event **events)
+int agent_list_events(struct lttng_event **events,
+ enum lttng_domain_type domain)
{
int ret;
size_t nbmem, count = 0;
assert(events);
+ DBG2("Agent listing events for domain %d", domain);
+
nbmem = UST_APP_EVENT_LIST_SIZE;
tmp_events = zmalloc(nbmem * sizeof(*tmp_events));
if (!tmp_events) {
ssize_t nb_ev;
struct lttng_event *agent_events;
+ /* Skip domain not asked by the list. */
+ if (app->domain != domain) {
+ continue;
+ }
+
nb_ev = list_events(app, &agent_events);
if (nb_ev < 0) {
ret = nb_ev;
*
* Return newly allocated object or else NULL on error.
*/
-struct agent_app *agent_create_app(pid_t pid, struct lttcomm_sock *sock)
+struct agent_app *agent_create_app(pid_t pid, enum lttng_domain_type domain,
+ struct lttcomm_sock *sock)
{
struct agent_app *app;
}
app->pid = pid;
+ app->domain = domain;
app->sock = sock;
lttng_ht_node_init_ulong(&app->node, (unsigned long) app->sock->fd);
ret = -ENOMEM;
goto error;
}
+ lttng_ht_node_init_u64(&agt->node, agt->domain);
return 0;
return ret;
}
+/*
+ * Add agent object to the given hash table.
+ */
+void agent_add(struct agent *agt, struct lttng_ht *ht)
+{
+ assert(agt);
+ assert(ht);
+
+ DBG3("Agent adding from domain %d", agt->domain);
+
+ rcu_read_lock();
+ lttng_ht_add_unique_u64(ht, &agt->node);
+ rcu_read_unlock();
+}
+
+/*
+ * Create an agent object for the given domain.
+ *
+ * Return the allocated agent or NULL on error.
+ */
+struct agent *agent_create(enum lttng_domain_type domain)
+{
+ int ret;
+ struct agent *agt;
+
+ agt = zmalloc(sizeof(*agt));
+ if (!agt) {
+ goto error;
+ }
+ agt->domain = domain;
+
+ ret = agent_init(agt);
+ if (ret < 0) {
+ free(agt);
+ agt = NULL;
+ goto error;
+ }
+
+error:
+ return agt;
+}
+
/*
* Create a newly allocated agent event data structure. If name is valid, it's
* copied into the created event.