* Copyright (C) 2011 - Julien Desfossez <julien.desfossez@polymtl.ca>
* Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; only version 2
- * of the License.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define _GNU_SOURCE
{
data->handle = -1;
data->shm_fd = -1;
+ data->shm_path = NULL;
data->wait_fd = -1;
+ data->wait_pipe_path = NULL;
data->memory_map_size = 0;
}
return ret;
}
}
+
+ if (data->shm_path) {
+ free(data->shm_path);
+ }
+
if (data->wait_fd >= 0) {
ret = close(data->wait_fd);
if (ret < 0) {
return ret;
}
}
+
+ if (data->wait_pipe_path) {
+ free(data->wait_pipe_path);
+ }
+
return ustctl_release_handle(sock, data->handle);
}
struct ustcomm_ust_reply lur;
struct lttng_ust_object_data *metadata_data;
int ret, err = 0;
+ char *shm_path, *wait_pipe_path;
if (!chops || !_metadata_data)
return -EINVAL;
metadata_data->handle = lur.ret_val;
DBG("received metadata handle %u", metadata_data->handle);
metadata_data->memory_map_size = lur.u.channel.memory_map_size;
- /* get shm fd */
- ret = ustcomm_recv_fd(sock);
- if (ret < 0)
+ /* get shm path */
+ shm_path = ustcomm_recv_string(sock);
+ if (!shm_path) {
err = 1;
- else
- metadata_data->shm_fd = ret;
+ } else {
+ DBG("Received shm path: %s\n", shm_path);
+ metadata_data->shm_fd = -1;
+ metadata_data->shm_path = shm_path;
+ }
+
/*
* We need to get the second FD even if the first fails, because
* libust expects us to read the two FDs.
*/
- /* get wait fd */
- ret = ustcomm_recv_fd(sock);
- if (ret < 0)
+
+ /* get wait pipe path */
+ wait_pipe_path = ustcomm_recv_string(sock);
+ if (!wait_pipe_path) {
+ free(shm_path);
err = 1;
- else
- metadata_data->wait_fd = ret;
+ } else {
+ DBG("Received wait pipe path: %s\n", wait_pipe_path);
+ metadata_data->wait_fd = -1;
+ metadata_data->wait_pipe_path = wait_pipe_path;
+ }
+
+
if (err)
goto error;
*_metadata_data = metadata_data;
struct ustcomm_ust_reply lur;
struct lttng_ust_object_data *channel_data;
int ret, err = 0;
+ char *shm_path, *wait_pipe_path;
if (!chops || !_channel_data)
return -EINVAL;
channel_data->handle = lur.ret_val;
DBG("received channel handle %u", channel_data->handle);
channel_data->memory_map_size = lur.u.channel.memory_map_size;
- /* get shm fd */
- ret = ustcomm_recv_fd(sock);
- if (ret < 0)
+ /* get shm path */
+ shm_path = ustcomm_recv_string(sock);
+ if (!shm_path) {
err = 1;
- else
- channel_data->shm_fd = ret;
+ } else {
+ DBG("Received shm path: %s\n", shm_path);
+ channel_data->shm_fd = -1;
+ channel_data->shm_path = shm_path;
+ }
+
/*
* We need to get the second FD even if the first fails, because
* libust expects us to read the two FDs.
*/
- /* get wait fd */
- ret = ustcomm_recv_fd(sock);
- if (ret < 0)
+ /* get wait pipe path */
+ wait_pipe_path = ustcomm_recv_string(sock);
+ if (!wait_pipe_path) {
+ free(shm_path);
err = 1;
- else
- channel_data->wait_fd = ret;
+ } else {
+ DBG("Received wait pipe path: %s\n", wait_pipe_path);
+ channel_data->wait_fd = -1;
+ channel_data->wait_pipe_path = wait_pipe_path;
+ }
+
if (err)
goto error;
*_channel_data = channel_data;
struct ustcomm_ust_msg lum;
struct ustcomm_ust_reply lur;
struct lttng_ust_object_data *stream_data;
- int ret, fd, err = 0;
+ int ret, err = 0;
+ char *shm_path, *wait_pipe_path;
if (!channel_data || !_stream_data)
return -EINVAL;
stream_data->handle = lur.ret_val;
DBG("received stream handle %u", stream_data->handle);
stream_data->memory_map_size = lur.u.stream.memory_map_size;
- /* get shm fd */
- fd = ustcomm_recv_fd(sock);
- if (fd < 0)
+ /* get shm path */
+ shm_path = ustcomm_recv_string(sock);
+ if (!shm_path) {
err = 1;
- else
- stream_data->shm_fd = fd;
+ } else {
+ DBG("Received shm path: %s\n", shm_path);
+ stream_data->shm_fd = -1;
+ stream_data->shm_path = shm_path;
+ }
+
/*
* We need to get the second FD even if the first fails, because
* libust expects us to read the two FDs.
*/
- /* get wait fd */
- fd = ustcomm_recv_fd(sock);
- if (fd < 0)
+ /* get wait pipe path */
+ wait_pipe_path = ustcomm_recv_string(sock);
+ if (!wait_pipe_path) {
+ free(shm_path);
err = 1;
- else
- stream_data->wait_fd = fd;
+ } else {
+ DBG("Received wait pipe path: %s\n", wait_pipe_path);
+ stream_data->wait_fd = -1;
+ stream_data->wait_pipe_path = wait_pipe_path;
+ }
+
if (err)
goto error;
*_stream_data = stream_data;
struct lttng_ust_lib_ring_buffer *ustctl_open_stream_read(struct lttng_ust_shm_handle *handle,
int cpu)
{
- struct channel *chan = handle->shadow_chan;
+ struct channel *chan;
int *shm_fd, *wait_fd;
+ char *shm_path, *wait_pipe_path;
uint64_t *memory_map_size;
struct lttng_ust_lib_ring_buffer *buf;
int ret;
if (!handle)
return NULL;
+ chan = handle->shadow_chan;
buf = channel_get_ring_buffer(&chan->backend.config,
- chan, cpu, handle, &shm_fd, &wait_fd, &memory_map_size);
+ chan, cpu, handle,
+ &shm_fd, &shm_path,
+ &wait_fd, &wait_pipe_path,
+ &memory_map_size);
if (!buf)
return NULL;
ret = lib_ring_buffer_open_read(buf, handle, 1);
unsigned long *len)
{
unsigned long mmap_buf_len;
- struct channel *chan = handle->shadow_chan;
+ struct channel *chan;
if (!handle || !buf || !len)
return -EINVAL;
+ chan = handle->shadow_chan;
if (chan->backend.config.output != RING_BUFFER_MMAP)
return -EINVAL;
mmap_buf_len = chan->backend.buf_size;
struct lttng_ust_lib_ring_buffer *buf,
unsigned long *len)
{
- struct channel *chan = handle->shadow_chan;
+ struct channel *chan;
if (!handle || !buf || !len)
return -EINVAL;
+ chan = handle->shadow_chan;
*len = chan->backend.subbuf_size;
return 0;
}
int ustctl_get_mmap_read_offset(struct lttng_ust_shm_handle *handle,
struct lttng_ust_lib_ring_buffer *buf, unsigned long *off)
{
- struct channel *chan = handle->shadow_chan;
+ struct channel *chan;
unsigned long sb_bindex;
if (!handle || !buf || !off)
return -EINVAL;
+ chan = handle->shadow_chan;
if (chan->backend.config.output != RING_BUFFER_MMAP)
return -EINVAL;
sb_bindex = subbuffer_id_get_index(&chan->backend.config,
int ustctl_get_subbuf_size(struct lttng_ust_shm_handle *handle,
struct lttng_ust_lib_ring_buffer *buf, unsigned long *len)
{
- struct channel *chan = handle->shadow_chan;
+ struct channel *chan;
if (!handle || !buf || !len)
return -EINVAL;
+ chan = handle->shadow_chan;
*len = lib_ring_buffer_get_read_data_size(&chan->backend.config, buf,
handle);
return 0;
int ustctl_get_padded_subbuf_size(struct lttng_ust_shm_handle *handle,
struct lttng_ust_lib_ring_buffer *buf, unsigned long *len)
{
- struct channel *chan = handle->shadow_chan;
+ struct channel *chan;
if (!handle || !buf || !len)
return -EINVAL;
+ chan = handle->shadow_chan;
*len = lib_ring_buffer_get_read_data_size(&chan->backend.config, buf,
handle);
*len = PAGE_ALIGN(*len);