Bug #403 » fix-bug403.diff
src/bin/lttng-sessiond/channel.c | ||
---|---|---|
switch (domain) {
|
||
case LTTNG_DOMAIN_UST:
|
||
DBG2("Channel %s being created in UST global domain", uchan->name);
|
||
/* Enable channel for global domain */
|
||
ret = ust_app_create_channel_glb(usess, uchan);
|
||
/*
|
||
* Enable channel for UST global domain on all applications. Ignore
|
||
* return value here since whatever error we got, it means that the
|
||
* channel was not created on one or many registered applications and
|
||
* we can not report this to the user yet. However, at this stage, the
|
||
* channel was successfully created on the session daemon side so the
|
||
* enable-channel command is a success.
|
||
*/
|
||
(void) ust_app_create_channel_glb(usess, uchan);
|
||
break;
|
||
#if 0
|
||
case LTTNG_DOMAIN_UST_PID:
|
||
... | ... | |
goto error_free_chan;
|
||
}
|
||
if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
|
||
ret = LTTNG_ERR_UST_CHAN_FAIL;
|
||
goto error_free_chan;
|
||
}
|
||
/* Adding the channel to the channel hash table. */
|
||
rcu_read_lock();
|
||
lttng_ht_add_unique_str(usess->domain_global.channels, &uchan->node);
|
src/bin/lttng-sessiond/ust-app.c | ||
---|---|---|
}
|
||
/*
|
||
* Create UST app channel and create it on the tracer.
|
||
* Create UST app channel and create it on the tracer. Set ua_chanp of the
|
||
* newly created channel if not NULL.
|
||
*/
|
||
static struct ust_app_channel *create_ust_app_channel(
|
||
struct ust_app_session *ua_sess, struct ltt_ust_channel *uchan,
|
||
struct ust_app *app)
|
||
static int create_ust_app_channel(struct ust_app_session *ua_sess,
|
||
struct ltt_ust_channel *uchan, struct ust_app *app,
|
||
struct ust_app_channel **ua_chanp)
|
||
{
|
||
int ret = 0;
|
||
struct lttng_ht_iter iter;
|
||
... | ... | |
ua_chan = alloc_ust_app_channel(uchan->name, &uchan->attr);
|
||
if (ua_chan == NULL) {
|
||
/* Only malloc can fail here */
|
||
ret = -ENOMEM;
|
||
goto error;
|
||
}
|
||
shadow_copy_channel(ua_chan, uchan);
|
||
... | ... | |
goto error;
|
||
}
|
||
/* Only add the channel if successful on the tracer side. */
|
||
lttng_ht_add_unique_str(ua_sess->channels, &ua_chan->node);
|
||
DBG2("UST app create channel %s for PID %d completed", ua_chan->name,
|
||
app->pid);
|
||
end:
|
||
return ua_chan;
|
||
if (ua_chanp) {
|
||
*ua_chanp = ua_chan;
|
||
}
|
||
/* Everything went well. */
|
||
return 0;
|
||
error:
|
||
delete_ust_app_channel(-1, ua_chan);
|
||
return NULL;
|
||
return ret;
|
||
}
|
||
/*
|
||
... | ... | |
struct lttng_ht_iter iter;
|
||
struct ust_app *app;
|
||
struct ust_app_session *ua_sess;
|
||
struct ust_app_channel *ua_chan;
|
||
/* Very wrong code flow */
|
||
assert(usess);
|
||
... | ... | |
ua_sess = create_ust_app_session(usess, app);
|
||
if (ua_sess == NULL) {
|
||
/* The malloc() failed. */
|
||
ret = -1;
|
||
ret = -ENOMEM;
|
||
goto error;
|
||
} else if (ua_sess == (void *) -1UL) {
|
||
/* The application's socket is not valid. Contiuing */
|
||
ret = -1;
|
||
/*
|
||
* The application's socket is not valid. Either a bad socket or a
|
||
* timeout on it. We can't inform yet the caller that for a
|
||
* specific app, the session failed so we continue here.
|
||
*/
|
||
continue;
|
||
}
|
||
/* Create channel onto application */
|
||
ua_chan = create_ust_app_channel(ua_sess, uchan, app);
|
||
if (ua_chan == NULL) {
|
||
/* Major problem here and it's maybe the tracer or malloc() */
|
||
ret = -1;
|
||
/* Create channel onto application. We don't need the chan ref. */
|
||
ret = create_ust_app_channel(ua_sess, uchan, app, NULL);
|
||
if (ret < 0 && ret == -ENOMEM) {
|
||
/* No more memory is a fatal error. Stop right now. */
|
||
goto error;
|
||
}
|
||
}
|
||
rcu_read_unlock();
|
||
error:
|
||
rcu_read_unlock();
|
||
return ret;
|
||
}
|
||
- « Previous
- 1
- 2
- 3
- Next »