X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust-ctl%2Fustctl.c;h=30e408bcd39aabf89d4e26ad8c7b0cbef5dfd06e;hb=d26228ae208d9a5e9484c17a36c4efaf373bf474;hp=f9c5e84fab59ef65116b70aa7d8df1941a123027;hpb=b115631f8ae20c4261491c20a88af496f6341e60;p=lttng-ust.git diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c index f9c5e84f..30e408bc 100644 --- a/liblttng-ust-ctl/ustctl.c +++ b/liblttng-ust-ctl/ustctl.c @@ -20,11 +20,12 @@ #include #include #include -#include -#include #include #include +#include +#include + #include "../libringbuffer/backend.h" #include "../libringbuffer/frontend.h" @@ -39,22 +40,38 @@ void init_object(struct lttng_ust_object_data *data) data->memory_map_size = 0; } -void ustctl_release_object(int sock, struct lttng_ust_object_data *data) +/* + * If sock is negative, it means we don't have to notify the other side + * (e.g. application has already vanished). + */ +int ustctl_release_object(int sock, struct lttng_ust_object_data *data) { struct ustcomm_ust_msg lum; struct ustcomm_ust_reply lur; int ret; - if (data->shm_fd >= 0) - close(data->shm_fd); - if (data->wait_fd >= 0) - close(data->wait_fd); - memset(&lum, 0, sizeof(lum)); - lum.handle = data->handle; - lum.cmd = LTTNG_UST_RELEASE; - ret = ustcomm_send_app_cmd(sock, &lum, &lur); - assert(!ret); - free(data); + if (data->shm_fd >= 0) { + ret = close(data->shm_fd); + if (ret < 0) { + return ret; + } + } + if (data->wait_fd >= 0) { + ret = close(data->wait_fd); + if (ret < 0) { + return ret; + } + } + if (sock >= 0) { + memset(&lum, 0, sizeof(lum)); + lum.handle = data->handle; + lum.cmd = LTTNG_UST_RELEASE; + ret = ustcomm_send_app_cmd(sock, &lum, &lur); + if (ret < 0) { + return ret; + } + } + return 0; } /* @@ -154,7 +171,8 @@ int ustctl_open_metadata(int sock, int session_handle, return 0; error: - ustctl_release_object(sock, metadata_data); + (void) ustctl_release_object(sock, metadata_data); + free(metadata_data); return -EINVAL; } @@ -207,7 +225,8 @@ int ustctl_create_channel(int sock, int session_handle, return 0; error: - ustctl_release_object(sock, channel_data); + (void) ustctl_release_object(sock, channel_data); + free(channel_data); return -EINVAL; } @@ -258,7 +277,8 @@ int ustctl_create_stream(int sock, struct lttng_ust_object_data *channel_data, return ret; error: - ustctl_release_object(sock, stream_data); + (void) ustctl_release_object(sock, stream_data); + free(stream_data); return -EINVAL; }