Project

General

Profile

Bug #403 » fix-bug403.diff

David Goulet, 11/27/2012 12:42 PM

View differences:

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;
}
(3-3/3)