Fix: sync event enablers before choosing header type
[lttng-ust.git] / liblttng-ust-comm / lttng-ust-comm.c
index c01eb9dec37cc3d76b3dc32308c87519f401753c..679b40e6e40725a60bc166cfd2e4d2dc88f8d5d6 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <lttng/ust-ctl.h>
 #include <ust-comm.h>
+#include <ust-fd.h>
 #include <helper.h>
 #include <lttng/ust-error.h>
 #include <lttng/ust-events.h>
@@ -94,6 +95,8 @@ const char *lttng_ust_strerror(int code)
  * ustcomm_connect_unix_sock
  *
  * Connect to unix socket using the path name.
+ *
+ * Caller handles FD tracker.
  */
 int ustcomm_connect_unix_sock(const char *pathname, long timeout)
 {
@@ -257,16 +260,22 @@ int ustcomm_listen_unix_sock(int sock)
  * ustcomm_close_unix_sock
  *
  * Shutdown cleanly a unix socket.
+ *
+ * Handles fd tracker internally.
  */
 int ustcomm_close_unix_sock(int sock)
 {
        int ret;
 
+       lttng_ust_lock_fd_tracker();
        ret = close(sock);
-       if (ret < 0) {
+       if (!ret) {
+               lttng_ust_delete_fd_from_tracker(sock);
+       } else {
                PERROR("close");
                ret = -errno;
        }
+       lttng_ust_unlock_fd_tracker();
 
        return ret;
 }
@@ -589,7 +598,7 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
 {
        void *chan_data;
        ssize_t len, nr_fd;
-       int wakeup_fd;
+       int wakeup_fd, ret;
 
        if (var_len > LTTNG_UST_CHANNEL_DATA_MAX_LEN) {
                len = -EINVAL;
@@ -606,8 +615,10 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
                goto error_recv;
        }
        /* recv wakeup fd */
+       lttng_ust_lock_fd_tracker();
        nr_fd = ustcomm_recv_fds_unix_sock(sock, &wakeup_fd, 1);
        if (nr_fd <= 0) {
+               lttng_ust_unlock_fd_tracker();
                if (nr_fd < 0) {
                        len = nr_fd;
                        goto error_recv;
@@ -616,7 +627,21 @@ ssize_t ustcomm_recv_channel_from_sessiond(int sock,
                        goto error_recv;
                }
        }
-       *_wakeup_fd = wakeup_fd;
+
+       ret = lttng_ust_add_fd_to_tracker(wakeup_fd);
+       if (ret < 0) {
+               lttng_ust_unlock_fd_tracker();
+               ret = close(wakeup_fd);
+               if (ret) {
+                       PERROR("close on wakeup_fd");
+               }
+               len = -EIO;
+               goto error_recv;
+       }
+
+       *_wakeup_fd = ret;
+       lttng_ust_unlock_fd_tracker();
+
        *_chan_data = chan_data;
        return len;
 
@@ -636,8 +661,10 @@ int ustcomm_recv_stream_from_sessiond(int sock,
        int fds[2];
 
        /* recv shm fd and wakeup fd */
+       lttng_ust_lock_fd_tracker();
        len = ustcomm_recv_fds_unix_sock(sock, fds, 2);
        if (len <= 0) {
+               lttng_ust_unlock_fd_tracker();
                if (len < 0) {
                        ret = len;
                        goto error;
@@ -646,8 +673,36 @@ int ustcomm_recv_stream_from_sessiond(int sock,
                        goto error;
                }
        }
-       *shm_fd = fds[0];
-       *wakeup_fd = fds[1];
+
+       ret = lttng_ust_add_fd_to_tracker(fds[0]);
+       if (ret < 0) {
+               lttng_ust_unlock_fd_tracker();
+               ret = close(fds[0]);
+               if (ret) {
+                       PERROR("close on received shm_fd");
+               }
+               ret = -EIO;
+               goto error;
+       }
+       *shm_fd = ret;
+
+       ret = lttng_ust_add_fd_to_tracker(fds[1]);
+       if (ret < 0) {
+               lttng_ust_unlock_fd_tracker();
+               ret = close(*shm_fd);
+               if (ret) {
+                       PERROR("close on shm_fd");
+               }
+               *shm_fd = -1;
+               ret = close(fds[1]);
+               if (ret) {
+                       PERROR("close on received wakeup_fd");
+               }
+               ret = -EIO;
+               goto error;
+       }
+       *wakeup_fd = ret;
+       lttng_ust_unlock_fd_tracker();
        return 0;
 
 error:
@@ -856,8 +911,7 @@ int serialize_basic_type(struct lttng_session *session,
                if (session) {
                        const struct lttng_enum *_enum;
 
-                       _enum = lttng_ust_enum_get(session,
-                                       lbt->enumeration.desc->name);
+                       _enum = lttng_ust_enum_get_from_desc(session, lbt->enumeration.desc);
                        if (!_enum)
                                return -EINVAL;
                        ubt->enumeration.id = _enum->id;
This page took 0.027825 seconds and 4 git commands to generate.