X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lttng-sessiond%2Fust-app.c;h=b6dd76ae9c0fec891f8ce2f3c3f5af6b6bb5b8d9;hb=8535a6d9d5bebd85679008b795cce0545a4c4faf;hp=30ac8ceaf923d4d7490589d07eb885c5d0d481c4;hpb=edb6738816b442fb81f12ea0079260c96c3a5759;p=lttng-tools.git diff --git a/lttng-sessiond/ust-app.c b/lttng-sessiond/ust-app.c index 30ac8ceaf..b6dd76ae9 100644 --- a/lttng-sessiond/ust-app.c +++ b/lttng-sessiond/ust-app.c @@ -288,8 +288,6 @@ static int disable_ust_channel(struct ust_app *app, goto error; } - ua_chan->enabled = 0; - DBG2("UST app channel %s disabled successfully for app (pid: %d)", ua_chan->name, app->key.pid); @@ -422,6 +420,14 @@ static int create_ust_channel(struct ust_app *app, DBG2("UST app channel %s created successfully for pid:%d and sock:%d", ua_chan->name, app->key.pid, app->key.sock); + /* If channel is not enabled, disable it on the tracer */ + if (!ua_chan->enabled) { + ret = disable_ust_channel(app, ua_sess, ua_chan); + if (ret < 0) { + goto error; + } + } + error: return ret; } @@ -445,11 +451,18 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess, } ua_event->handle = ua_event->obj->handle; - ua_event->enabled = 1; DBG2("UST app event %s created successfully for pid:%d", ua_event->attr.name, app->key.pid); + /* If event not enabled, disable it on the tracer */ + if (!ua_event->enabled) { + ret = disable_ust_event(app, ua_sess, ua_event); + if (ret < 0) { + goto error; + } + } + error: return ret; } @@ -496,6 +509,7 @@ static struct ust_app_channel *alloc_ust_app_channel(char *name, strncpy(ua_chan->name, name, sizeof(ua_chan->name)); ua_chan->name[sizeof(ua_chan->name) - 1] = '\0'; + ua_chan->enabled = 1; ua_chan->handle = -1; ua_chan->ctx = hashtable_new(0); ua_chan->events = hashtable_new_str(0); @@ -532,6 +546,7 @@ static struct ust_app_event *alloc_ust_app_event(char *name, goto error; } + ua_event->enabled = 1; strncpy(ua_event->name, name, sizeof(ua_event->name)); ua_event->name[sizeof(ua_event->name) - 1] = '\0'; ua_event->ctx = hashtable_new(0); @@ -760,8 +775,7 @@ error: */ static int enable_ust_app_event(struct ust_app_session *ua_sess, - struct ust_app_channel *ua_chan, struct ust_app_event *ua_event, - struct ust_app *app) + struct ust_app_event *ua_event, struct ust_app *app) { int ret; @@ -799,29 +813,19 @@ error: /* * Lookup ust app channel for session and disable it on the tracer side. */ -static int disable_ust_app_channel(struct ust_app_session *ua_sess, - struct ltt_ust_channel *uchan, struct ust_app *app) +static +int disable_ust_app_channel(struct ust_app_session *ua_sess, + struct ust_app_channel *ua_chan, struct ust_app *app) { - int ret = 0; - struct cds_lfht_iter iter; - struct cds_lfht_node *ua_chan_node; - struct ust_app_channel *ua_chan; - - ua_chan_node = hashtable_lookup(ua_sess->channels, - (void *)uchan->name, strlen(uchan->name), &iter); - if (ua_chan_node == NULL) { - DBG2("Unable to find channel %s in ust session uid %u", - uchan->name, ua_sess->uid); - goto error; - } - - ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); + int ret; ret = disable_ust_channel(app, ua_sess, ua_chan); if (ret < 0) { goto error; } + ua_chan->enabled = 0; + error: return ret; } @@ -934,6 +938,8 @@ int create_ust_app_event(struct ust_app_session *ua_sess, goto error; } + ua_event->enabled = 1; + hashtable_add_unique(ua_chan->events, &ua_event->node); end: @@ -1238,13 +1244,15 @@ void ust_app_ht_alloc(void) /* * For a specific UST session, disable the channel for all registered apps. */ -int ust_app_disable_channel_all(struct ltt_ust_session *usess, +int ust_app_disable_channel_glb(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan) { int ret = 0; struct cds_lfht_iter iter; + struct cds_lfht_node *ua_chan_node; struct ust_app *app; struct ust_app_session *ua_sess; + struct ust_app_channel *ua_chan; if (usess == NULL || uchan == NULL) { ERR("Disabling UST global channel with NULL values"); @@ -1252,7 +1260,7 @@ int ust_app_disable_channel_all(struct ltt_ust_session *usess, goto error; } - DBG2("UST app disablling channel %s from global domain for session uid %d", + DBG2("UST app disabling channel %s from global domain for session uid %d", uchan->name, usess->uid); rcu_read_lock(); @@ -1264,8 +1272,18 @@ int ust_app_disable_channel_all(struct ltt_ust_session *usess, continue; } - /* Create channel onto application */ - ret = disable_ust_app_channel(ua_sess, uchan, app); + /* Get channel */ + ua_chan_node = hashtable_lookup(ua_sess->channels, + (void *)uchan->name, strlen(uchan->name), &iter); + /* If the session if found for the app, the channel must be there */ + assert(ua_chan_node); + + ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); + /* The channel must not be already disabled */ + assert(ua_chan->enabled == 1); + + /* Disable channel onto application */ + ret = disable_ust_app_channel(ua_sess, ua_chan, app); if (ret < 0) { /* XXX: We might want to report this error at some point... */ continue; @@ -1281,7 +1299,7 @@ error: /* * For a specific UST session, enable the channel for all registered apps. */ -int ust_app_enable_channel_all(struct ltt_ust_session *usess, +int ust_app_enable_channel_glb(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan) { int ret = 0; @@ -1324,8 +1342,8 @@ error: /* * Disable an event in a channel and for a specific session. */ -int ust_app_disable_event(struct ltt_ust_session *usess, - struct ltt_ust_channel *uchan, char *event_name) +int ust_app_disable_event_glb(struct ltt_ust_session *usess, + struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent) { int ret = 0; struct cds_lfht_iter iter, uiter; @@ -1336,7 +1354,7 @@ int ust_app_disable_event(struct ltt_ust_session *usess, struct ust_app_event *ua_event; DBG("UST app disabling event %s for all apps in channel " - "%s for session uid %d", event_name, uchan->name, usess->uid); + "%s for session uid %d", uevent->attr.name, uchan->name, usess->uid); rcu_read_lock(); @@ -1359,10 +1377,10 @@ int ust_app_disable_event(struct ltt_ust_session *usess, ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); ua_event_node = hashtable_lookup(ua_chan->events, - (void *) event_name, strlen(event_name), &uiter); + (void *)uevent->attr.name, strlen(uevent->attr.name), &uiter); if (ua_event_node == NULL) { DBG2("Event %s not found in channel %s for app pid %d." - "Skipping", event_name, uchan->name, app->key.pid); + "Skipping", uevent->attr.name, uchan->name, app->key.pid); continue; } ua_event = caa_container_of(ua_event_node, struct ust_app_event, node); @@ -1383,7 +1401,7 @@ int ust_app_disable_event(struct ltt_ust_session *usess, * For a specific UST session and UST channel, the event for all * registered apps. */ -int ust_app_disable_event_all(struct ltt_ust_session *usess, +int ust_app_disable_all_event_glb(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan) { int ret = 0; @@ -1431,7 +1449,7 @@ int ust_app_disable_event_all(struct ltt_ust_session *usess, /* * For a specific UST session, create the channel for all registered apps. */ -int ust_app_create_channel_all(struct ltt_ust_session *usess, +int ust_app_create_channel_glb(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan) { int ret = 0; @@ -1479,12 +1497,12 @@ error: /* * Enable event for a specific session and channel on the tracer. */ -int ust_app_enable_event_all(struct ltt_ust_session *usess, +int ust_app_enable_event_glb(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent) { int ret = 0; struct cds_lfht_iter iter, uiter; - struct cds_lfht_node *ua_chan_node; + struct cds_lfht_node *ua_chan_node, *ua_event_node; struct ust_app *app; struct ust_app_session *ua_sess; struct ust_app_channel *ua_chan; @@ -1515,13 +1533,19 @@ int ust_app_enable_event_all(struct ltt_ust_session *usess, ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); - /* Enable each events of channel */ - cds_lfht_for_each_entry(ua_chan->events, &uiter, ua_event, node) { - ret = enable_ust_app_event(ua_sess, ua_chan, ua_event, app); - if (ret < 0) { - /* XXX: Report error someday... */ - continue; - } + ua_event_node = hashtable_lookup(ua_sess->channels, + (void*)uevent->attr.name, strlen(uevent->attr.name), &uiter); + if (ua_event_node == NULL) { + DBG3("UST app enable event %s not found. Skipping app", + uevent->attr.name); + continue; + } + ua_event = caa_container_of(ua_event_node, struct ust_app_event, node); + + ret = enable_ust_app_event(ua_sess, ua_event, app); + if (ret < 0) { + /* XXX: Report error someday... */ + continue; } } @@ -1534,7 +1558,7 @@ int ust_app_enable_event_all(struct ltt_ust_session *usess, * For a specific existing UST session and UST channel, creates the event for * all registered apps. */ -int ust_app_create_event_all(struct ltt_ust_session *usess, +int ust_app_create_event_glb(struct ltt_ust_session *usess, struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent) { int ret = 0;