Close stream and channel file descriptors as soon as passed to sessiond
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 12 Jan 2012 18:04:34 +0000 (13:04 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 12 Jan 2012 18:04:34 +0000 (13:04 -0500)
Ensure we don't bust the open FD limit with many sessions.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
14 files changed:
include/lttng/ust-abi.h
include/lttng/ust-events.h
liblttng-ust-ctl/ustctl.c
liblttng-ust/ltt-events.c
liblttng-ust/ltt-ring-buffer-client.h
liblttng-ust/ltt-ring-buffer-metadata-client.h
liblttng-ust/lttng-ust-abi.c
liblttng-ust/lttng-ust-comm.c
libringbuffer/frontend.h
libringbuffer/ring_buffer_frontend.c
libringbuffer/shm.c
libringbuffer/shm.h
tests/ust-basic-tracing/ust-basic-tracing.c
tests/ust-multi-test/ust-multi-test.c

index 8b8197731b10714543ca2948e386187f2bf36e70..6a15e0dd346fa2e07e522e96d8627a5234b5f074 100644 (file)
@@ -49,10 +49,6 @@ struct lttng_ust_channel {
        unsigned int switch_timer_interval;     /* usecs */
        unsigned int read_timer_interval;       /* usecs */
        enum lttng_ust_output output;           /* output mode */
-       /* The following fields are used internally within UST. */
-       int shm_fd;
-       int wait_fd;
-       uint64_t memory_map_size;
 };
 
 /*
@@ -158,8 +154,22 @@ struct lttng_ust_object_data {
 
 struct lttng_ust_obj;
 
+union ust_args {
+       struct {
+               int *shm_fd;
+               int *wait_fd;
+               uint64_t *memory_map_size;
+       } channel;
+       struct {
+               int *shm_fd;
+               int *wait_fd;
+               uint64_t *memory_map_size;
+       } stream;
+};
+
 struct lttng_ust_objd_ops {
-       long (*cmd)(int objd, unsigned int cmd, unsigned long arg);
+       long (*cmd)(int objd, unsigned int cmd, unsigned long arg,
+               union ust_args *args);
        int (*release)(int objd);
 };
 
index b74a176755af19f0bc12da564035a14db5bd3877..4d1cace5c0cd582554b37d31da32cb1ec1629af6 100644 (file)
@@ -304,14 +304,14 @@ struct ltt_channel_ops {
                                size_t subbuf_size, size_t num_subbuf,
                                unsigned int switch_timer_interval,
                                unsigned int read_timer_interval,
-                               int *shm_fd, int *wait_fd,
-                               uint64_t *memory_map_size,
+                               int **shm_fd, int **wait_fd,
+                               uint64_t **memory_map_size,
                                struct ltt_channel *chan_priv_init);
        void (*channel_destroy)(struct ltt_channel *ltt_chan);
        struct lttng_ust_lib_ring_buffer *(*buffer_read_open)(struct channel *chan,
                                struct lttng_ust_shm_handle *handle,
-                               int *shm_fd, int *wait_fd,
-                               uint64_t *memory_map_size);
+                               int **shm_fd, int **wait_fd,
+                               uint64_t **memory_map_size);
        void (*buffer_read_close)(struct lttng_ust_lib_ring_buffer *buf,
                                struct lttng_ust_shm_handle *handle);
        int (*event_reserve)(struct lttng_ust_lib_ring_buffer_ctx *ctx,
@@ -392,16 +392,16 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session,
                                       size_t subbuf_size, size_t num_subbuf,
                                       unsigned int switch_timer_interval,
                                       unsigned int read_timer_interval,
-                                      int *shm_fd, int *wait_fd,
-                                      uint64_t *memory_map_size,
+                                      int **shm_fd, int **wait_fd,
+                                      uint64_t **memory_map_size,
                                       struct ltt_channel *chan_priv_init);
 struct ltt_channel *ltt_global_channel_create(struct ltt_session *session,
                                       int overwrite, void *buf_addr,
                                       size_t subbuf_size, size_t num_subbuf,
                                       unsigned int switch_timer_interval,
                                       unsigned int read_timer_interval,
-                                      int *shm_fd, int *wait_fd,
-                                      uint64_t *memory_map_size);
+                                      int **shm_fd, int **wait_fd,
+                                      uint64_t **memory_map_size);
 
 int ltt_event_create(struct ltt_channel *chan,
                struct lttng_ust_event *event_param,
index 656aeac51e44720f12f2406de382758e9bb8afb0..f7e13a1a06e8618823899e8a49286278d8f4ce5a 100644 (file)
@@ -600,8 +600,8 @@ struct lttng_ust_lib_ring_buffer *ustctl_open_stream_read(struct lttng_ust_shm_h
        int cpu)
 {
        struct channel *chan = handle->shadow_chan;
-       int shm_fd, wait_fd;
-       uint64_t memory_map_size;
+       int *shm_fd, *wait_fd;
+       uint64_t *memory_map_size;
        struct lttng_ust_lib_ring_buffer *buf;
        int ret;
 
index 94e06780f9de58822d259979bca000f968f0c696..ee88b43142d6e39c57f974102ba45328a7aef210 100644 (file)
@@ -401,8 +401,8 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session,
                                       size_t subbuf_size, size_t num_subbuf,
                                       unsigned int switch_timer_interval,
                                       unsigned int read_timer_interval,
-                                      int *shm_fd, int *wait_fd,
-                                      uint64_t *memory_map_size,
+                                      int **shm_fd, int **wait_fd,
+                                      uint64_t **memory_map_size,
                                       struct ltt_channel *chan_priv_init)
 {
        struct ltt_channel *chan = NULL;
index 6f714da57b97866d842dd10beafb7836cb2b0550..a2ace400d608824dac0bb9be198d968d6e0561da 100644 (file)
@@ -385,8 +385,8 @@ struct ltt_channel *_channel_create(const char *name,
                                size_t subbuf_size, size_t num_subbuf,
                                unsigned int switch_timer_interval,
                                unsigned int read_timer_interval,
-                               int *shm_fd, int *wait_fd,
-                               uint64_t *memory_map_size,
+                               int **shm_fd, int **wait_fd,
+                               uint64_t **memory_map_size,
                                struct ltt_channel *chan_priv_init)
 {
        void *priv;
@@ -416,8 +416,8 @@ void ltt_channel_destroy(struct ltt_channel *ltt_chan)
 static
 struct lttng_ust_lib_ring_buffer *ltt_buffer_read_open(struct channel *chan,
                                             struct lttng_ust_shm_handle *handle,
-                                            int *shm_fd, int *wait_fd,
-                                            uint64_t *memory_map_size)
+                                            int **shm_fd, int **wait_fd,
+                                            uint64_t **memory_map_size)
 {
        struct lttng_ust_lib_ring_buffer *buf;
        int cpu;
@@ -521,8 +521,8 @@ int ltt_flush_buffer(struct channel *chan, struct lttng_ust_shm_handle *handle)
        int cpu;
 
        for_each_channel_cpu(cpu, chan) {
-               int shm_fd, wait_fd;
-               uint64_t memory_map_size;
+               int *shm_fd, *wait_fd;
+               uint64_t *memory_map_size;
 
                buf = channel_get_ring_buffer(&client_config, chan,
                                cpu, handle, &shm_fd, &wait_fd,
index a9c2f641c54cc4bfc317ae5b52bb2c76d8646f59..7e79b116fa613a672be0efaeb0a2c1987536c762 100644 (file)
@@ -167,8 +167,8 @@ struct ltt_channel *_channel_create(const char *name,
                                size_t subbuf_size, size_t num_subbuf,
                                unsigned int switch_timer_interval,
                                unsigned int read_timer_interval,
-                               int *shm_fd, int *wait_fd,
-                               uint64_t *memory_map_size,
+                               int **shm_fd, int **wait_fd,
+                               uint64_t **memory_map_size,
                                struct ltt_channel *chan_priv_init)
 {
        void *priv;
@@ -198,8 +198,8 @@ void ltt_channel_destroy(struct ltt_channel *ltt_chan)
 static
 struct lttng_ust_lib_ring_buffer *ltt_buffer_read_open(struct channel *chan,
                                             struct lttng_ust_shm_handle *handle,
-                                            int *shm_fd, int *wait_fd,
-                                            uint64_t *memory_map_size)
+                                            int **shm_fd, int **wait_fd,
+                                            uint64_t **memory_map_size)
 {
        struct lttng_ust_lib_ring_buffer *buf;
 
@@ -283,8 +283,8 @@ static
 int ltt_flush_buffer(struct channel *chan, struct lttng_ust_shm_handle *handle)
 {
        struct lttng_ust_lib_ring_buffer *buf;
-       int shm_fd, wait_fd;
-       uint64_t memory_map_size;
+       int *shm_fd, *wait_fd;
+       uint64_t *memory_map_size;
 
        buf = channel_get_ring_buffer(&client_config, chan,
                        0, handle, &shm_fd, &wait_fd,
index 716a2cc9d1a13efe8d8e943a6c41ad6c98395413..b3db6fd735c7e91239a0f61e3e89898b9754c545 100644 (file)
@@ -281,6 +281,7 @@ long lttng_abi_add_context(int objd,
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This descriptor implements lttng commands:
  *     LTTNG_UST_SESSION
@@ -295,7 +296,8 @@ long lttng_abi_add_context(int objd,
  * The returned session will be deleted when its file descriptor is closed.
  */
 static
-long lttng_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        switch (cmd) {
        case LTTNG_UST_SESSION:
@@ -350,7 +352,8 @@ create_error:
 
 int lttng_abi_create_channel(int session_objd,
                             struct lttng_ust_channel *chan_param,
-                            enum channel_type channel_type)
+                            enum channel_type channel_type,
+                            union ust_args *uargs)
 {
        struct ltt_session *session = objd_private(session_objd);
        const struct lttng_ust_objd_ops *ops;
@@ -399,9 +402,9 @@ int lttng_abi_create_channel(int session_objd,
                                  chan_param->num_subbuf,
                                  chan_param->switch_timer_interval,
                                  chan_param->read_timer_interval,
-                                 &chan_param->shm_fd,
-                                 &chan_param->wait_fd,
-                                 &chan_param->memory_map_size,
+                                 &uargs->channel.shm_fd,
+                                 &uargs->channel.wait_fd,
+                                 &uargs->channel.memory_map_size,
                                  &chan_priv_init);
        if (!chan) {
                ret = -EINVAL;
@@ -435,6 +438,7 @@ objd_error:
  *     @obj: the object
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This descriptor implements lttng commands:
  *     LTTNG_UST_CHANNEL
@@ -449,7 +453,8 @@ objd_error:
  * The returned channel will be deleted when its file descriptor is closed.
  */
 static
-long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct ltt_session *session = objd_private(objd);
 
@@ -457,7 +462,7 @@ long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg)
        case LTTNG_UST_CHANNEL:
                return lttng_abi_create_channel(objd,
                                (struct lttng_ust_channel *) arg,
-                               PER_CPU_CHANNEL);
+                               PER_CPU_CHANNEL, uargs);
        case LTTNG_UST_SESSION_START:
        case LTTNG_UST_ENABLE:
                return ltt_session_enable(session);
@@ -467,7 +472,7 @@ long lttng_session_cmd(int objd, unsigned int cmd, unsigned long arg)
        case LTTNG_UST_METADATA:
                return lttng_abi_create_channel(objd,
                                (struct lttng_ust_channel *) arg,
-                               METADATA_CHANNEL);
+                               METADATA_CHANNEL, uargs);
        default:
                return -EINVAL;
        }
@@ -500,7 +505,8 @@ static const struct lttng_ust_objd_ops lttng_session_ops = {
 };
 
 static
-long lttng_tracepoint_list_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_tracepoint_list_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct lttng_ust_tracepoint_list *list = objd_private(objd);
        struct lttng_ust_tracepoint_iter *tp =
@@ -587,7 +593,8 @@ struct stream_priv_data {
 };
 
 static
-int lttng_abi_open_stream(int channel_objd, struct lttng_ust_stream *info)
+int lttng_abi_open_stream(int channel_objd, struct lttng_ust_stream *info,
+               union ust_args *uargs)
 {
        struct ltt_channel *channel = objd_private(channel_objd);
        struct lttng_ust_lib_ring_buffer *buf;
@@ -595,7 +602,9 @@ int lttng_abi_open_stream(int channel_objd, struct lttng_ust_stream *info)
        int stream_objd, ret;
 
        buf = channel->ops->buffer_read_open(channel->chan, channel->handle,
-                       &info->shm_fd, &info->wait_fd, &info->memory_map_size);
+                       &uargs->stream.shm_fd,
+                       &uargs->stream.wait_fd,
+                       &uargs->stream.memory_map_size);
        if (!buf)
                return -ENOENT;
 
@@ -742,6 +751,7 @@ objd_error:
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This object descriptor implements lttng commands:
  *      LTTNG_UST_STREAM
@@ -759,7 +769,8 @@ objd_error:
  * Channel and event file descriptors also hold a reference on the session.
  */
 static
-long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct ltt_channel *channel = objd_private(objd);
 
@@ -770,7 +781,7 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg)
 
                stream = (struct lttng_ust_stream *) arg;
                /* stream used as output */
-               return lttng_abi_open_stream(objd, stream);
+               return lttng_abi_open_stream(objd, stream, uargs);
        }
        case LTTNG_UST_EVENT:
        {
@@ -808,6 +819,7 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg)
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This object descriptor implements lttng commands:
  *      LTTNG_UST_STREAM
@@ -816,7 +828,8 @@ long lttng_channel_cmd(int objd, unsigned int cmd, unsigned long arg)
  * Channel and event file descriptors also hold a reference on the session.
  */
 static
-long lttng_metadata_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_metadata_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct ltt_channel *channel = objd_private(objd);
 
@@ -827,7 +840,7 @@ long lttng_metadata_cmd(int objd, unsigned int cmd, unsigned long arg)
 
                stream = (struct lttng_ust_stream *) arg;
                /* stream used as output */
-               return lttng_abi_open_stream(objd, stream);
+               return lttng_abi_open_stream(objd, stream, uargs);
        }
        case LTTNG_UST_FLUSH_BUFFER:
                return channel->ops->flush_buffer(channel->chan, channel->handle);
@@ -893,12 +906,14 @@ static const struct lttng_ust_objd_ops lttng_metadata_ops = {
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This object descriptor implements lttng commands:
  *             (None for now. Access is done directly though shm.)
  */
 static
-long lttng_rb_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_rb_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        switch (cmd) {
        default:
@@ -949,6 +964,7 @@ static const struct lttng_ust_objd_ops lib_ring_buffer_objd_ops = {
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This object descriptor implements lttng commands:
  *     LTTNG_UST_CONTEXT
@@ -959,7 +975,8 @@ static const struct lttng_ust_objd_ops lib_ring_buffer_objd_ops = {
  *             Disable recording for this event (strong disable)
  */
 static
-long lttng_event_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_event_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct ltt_event *event = objd_private(objd);
 
@@ -999,6 +1016,7 @@ static const struct lttng_ust_objd_ops lttng_event_ops = {
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This object descriptor implements lttng commands:
  *     LTTNG_UST_CONTEXT
@@ -1010,7 +1028,8 @@ static const struct lttng_ust_objd_ops lttng_event_ops = {
  *             Disable recording for these loglevel events (strong disable)
  */
 static
-long lttng_loglevel_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_loglevel_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct session_loglevel *loglevel = objd_private(objd);
 
@@ -1053,6 +1072,7 @@ static const struct lttng_ust_objd_ops lttng_loglevel_ops = {
  *     @objd: the object descriptor
  *     @cmd: the command
  *     @arg: command arg
+ *     @uargs: UST arguments (internal)
  *
  *     This object descriptor implements lttng commands:
  *     LTTNG_UST_CONTEXT
@@ -1064,7 +1084,8 @@ static const struct lttng_ust_objd_ops lttng_loglevel_ops = {
  *             Disable recording for these wildcard events (strong disable)
  */
 static
-long lttng_wildcard_cmd(int objd, unsigned int cmd, unsigned long arg)
+long lttng_wildcard_cmd(int objd, unsigned int cmd, unsigned long arg,
+       union ust_args *uargs)
 {
        struct session_wildcard *wildcard = objd_private(objd);
 
index b968b498acc52874b3472544691bbaef05364d48..516e39d2f570c6837352ccedb23bd798bbb1b3b0 100644 (file)
@@ -239,6 +239,7 @@ int handle_message(struct sock_info *sock_info,
        const struct lttng_ust_objd_ops *ops;
        struct ustcomm_ust_reply lur;
        int shm_fd, wait_fd;
+       union ust_args args;
 
        ust_lock();
 
@@ -271,7 +272,8 @@ int handle_message(struct sock_info *sock_info,
        default:
                if (ops->cmd)
                        ret = ops->cmd(lum->handle, lum->cmd,
-                                       (unsigned long) &lum->u);
+                                       (unsigned long) &lum->u,
+                                       &args);
                else
                        ret = -ENOSYS;
                break;
@@ -293,15 +295,15 @@ end:
                 * Special-case reply to send stream info.
                 * Use lum.u output.
                 */
-               lur.u.stream.memory_map_size = lum->u.stream.memory_map_size;
-               shm_fd = lum->u.stream.shm_fd;
-               wait_fd = lum->u.stream.wait_fd;
+               lur.u.stream.memory_map_size = *args.stream.memory_map_size;
+               shm_fd = *args.stream.shm_fd;
+               wait_fd = *args.stream.wait_fd;
                break;
        case LTTNG_UST_METADATA:
        case LTTNG_UST_CHANNEL:
-               lur.u.channel.memory_map_size = lum->u.channel.memory_map_size;
-               shm_fd = lum->u.channel.shm_fd;
-               wait_fd = lum->u.channel.wait_fd;
+               lur.u.channel.memory_map_size = *args.channel.memory_map_size;
+               shm_fd = *args.channel.shm_fd;
+               wait_fd = *args.channel.wait_fd;
                break;
        case LTTNG_UST_TRACER_VERSION:
                lur.u.version = lum->u.version;
@@ -336,6 +338,48 @@ end:
                        goto error;
                }
        }
+       /*
+        * We still have the memory map reference, and the fds have been
+        * sent to the sessiond. We can therefore close those fds.
+        */
+       if (lur.ret_code == USTCOMM_OK) {
+               switch (lum->cmd) {
+               case LTTNG_UST_STREAM:
+                       if (shm_fd >= 0) {
+                               ret = close(shm_fd);
+                               if (ret) {
+                                       PERROR("Error closing stream shm_fd");
+                               }
+                               *args.stream.shm_fd = -1;
+                       }
+                       if (wait_fd >= 0) {
+                               ret = close(wait_fd);
+                               if (ret) {
+                                       PERROR("Error closing stream wait_fd");
+                               }
+                               *args.stream.wait_fd = -1;
+                       }
+                       break;
+               case LTTNG_UST_METADATA:
+               case LTTNG_UST_CHANNEL:
+                       if (shm_fd >= 0) {
+                               ret = close(shm_fd);
+                               if (ret) {
+                                       PERROR("Error closing channel shm_fd");
+                               }
+                               *args.channel.shm_fd = -1;
+                       }
+                       if (wait_fd >= 0) {
+                               ret = close(wait_fd);
+                               if (ret) {
+                                       PERROR("Error closing channel wait_fd");
+                               }
+                               *args.channel.wait_fd = -1;
+                       }
+                       break;
+               }
+       }
+
 error:
        ust_unlock();
        return ret;
index eb95e6225986a759df3e809be09ad6e955222d5a..ce79cdeed2d3f1ed24ff90576fd6281b99b1a260 100644 (file)
@@ -52,8 +52,8 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff
                                size_t subbuf_size, size_t num_subbuf,
                                unsigned int switch_timer_interval,
                                unsigned int read_timer_interval,
-                               int *shm_fd, int *wait_fd,
-                               uint64_t *memory_map_size);
+                               int **shm_fd, int **wait_fd,
+                               uint64_t **memory_map_size);
 
 /* channel_handle_create - for consumer. */
 extern
@@ -89,8 +89,8 @@ extern struct lttng_ust_lib_ring_buffer *channel_get_ring_buffer(
                                const struct lttng_ust_lib_ring_buffer_config *config,
                                struct channel *chan, int cpu,
                                struct lttng_ust_shm_handle *handle,
-                               int *shm_fd, int *wait_fd,
-                               uint64_t *memory_map_size);
+                               int **shm_fd, int **wait_fd,
+                               uint64_t **memory_map_size);
 extern int lib_ring_buffer_open_read(struct lttng_ust_lib_ring_buffer *buf,
                                     struct lttng_ust_shm_handle *handle,
                                     int shadow);
index f558793a1626efd06b3cba986ab7a84cbe7f6fa7..d0649f3e36b9e33b0e1b247854fd6a2c000f714a 100644 (file)
@@ -420,7 +420,7 @@ struct lttng_ust_shm_handle *channel_create(const struct lttng_ust_lib_ring_buff
                   void *buf_addr, size_t subbuf_size,
                   size_t num_subbuf, unsigned int switch_timer_interval,
                   unsigned int read_timer_interval,
-                  int *shm_fd, int *wait_fd, uint64_t *memory_map_size)
+                  int **shm_fd, int **wait_fd, uint64_t **memory_map_size)
 {
        int ret, cpu;
        size_t shmsize, chansize;
@@ -610,8 +610,8 @@ struct lttng_ust_lib_ring_buffer *channel_get_ring_buffer(
                                        const struct lttng_ust_lib_ring_buffer_config *config,
                                        struct channel *chan, int cpu,
                                        struct lttng_ust_shm_handle *handle,
-                                       int *shm_fd, int *wait_fd,
-                                       uint64_t *memory_map_size)
+                                       int **shm_fd, int **wait_fd,
+                                       uint64_t **memory_map_size)
 {
        struct shm_ref *ref;
 
index 994204d1e0a2463829a8e73e3cb0cf078eae1c0f..69e4b1a765eb1d9dea37b9cafb6c06bbf8f4e8ad 100644 (file)
@@ -211,10 +211,12 @@ void shmp_object_destroy(struct shm_object *obj)
                        assert(0);
                }
        }
-       ret = close(obj->shm_fd);
-       if (ret) {
-               PERROR("close");
-               assert(0);
+       if (obj->shm_fd >= 0) {
+               ret = close(obj->shm_fd);
+               if (ret) {
+                       PERROR("close");
+                       assert(0);
+               }
        }
        for (i = 0; i < 2; i++) {
                if (obj->wait_fd[i] < 0)
index 4111144776722072ee60800f6d5764b7bdef7a28..104eece6e6d1e4f4f3dc3943b9ce48fc84c28626 100644 (file)
@@ -107,7 +107,7 @@ int shm_get_wait_fd(struct lttng_ust_shm_handle *handle, struct shm_ref *ref)
 
 static inline
 int shm_get_object_data(struct lttng_ust_shm_handle *handle, struct shm_ref *ref,
-               int *shm_fd, int *wait_fd, uint64_t *memory_map_size)
+               int **shm_fd, int **wait_fd, uint64_t **memory_map_size)
 {
        struct shm_object_table *table = handle->table;
        struct shm_object *obj;
@@ -117,9 +117,9 @@ int shm_get_object_data(struct lttng_ust_shm_handle *handle, struct shm_ref *ref
        if (caa_unlikely(index >= table->allocated_len))
                return -EPERM;
        obj = &table->objects[index];
-       *shm_fd = obj->shm_fd;
-       *wait_fd = obj->wait_fd[0];
-       *memory_map_size = obj->allocated_len;
+       *shm_fd = &obj->shm_fd;
+       *wait_fd = &obj->wait_fd[0];
+       *memory_map_size = &obj->allocated_len;
        return 0;
 }
 
index d11b587bf1d2e5a7cd78bd15b849e4ca3e6bc014..da2852f893b41aaf47879bf0397a9693cc5e21e8 100644 (file)
@@ -203,8 +203,8 @@ int consume_stream(struct lttng_ust_shm_handle *handle, int cpu, char *outfile)
        struct channel *chan;
        struct lttng_ust_lib_ring_buffer *buf;
        int outfd, ret;
-       int shm_fd, wait_fd;
-       uint64_t memory_map_size;
+       int *shm_fd, *wait_fd;
+       uint64_t *memory_map_size;
 
        chan = shmp(handle, handle->chan);
 
index cfd6d355123297b0f01c7f23bd05924885b2cb6e..b3c97ea10f0397ebdfbf4a99f6dfea85a41358bb 100644 (file)
@@ -210,8 +210,8 @@ int consume_stream(struct lttng_ust_shm_handle *handle, int cpu, char *outfile)
        struct channel *chan;
        struct lttng_ust_lib_ring_buffer *buf;
        int outfd, ret;
-       int shm_fd, wait_fd;
-       uint64_t memory_map_size;
+       int *shm_fd, *wait_fd;
+       uint64_t *memory_map_size;
 
        chan = shmp(handle, handle->chan);
 
This page took 0.038025 seconds and 4 git commands to generate.