Cygwin: Introduce new LTTNG_UST_STREAM_PIPE command to open wakeup pipe
[lttng-ust.git] / liblttng-ust-ctl / ustctl.c
index 39997a2be97dd886bcd63028acb0ccbb2df5facc..c9e930d045916b82eb7234ca80c07532aab0126e 100644 (file)
 
 volatile enum ust_loglevel ust_loglevel;
 
+static int dummy_pipe[2];
+
+static
+void __attribute__((constructor)) setup_dummy_pipe(void)
+{
+       pipe(dummy_pipe);
+       /* Only dummy_pipe[0] is used */
+       close(dummy_pipe[1]);
+       /* FIXME: Handle pipe() failure */
+}
+
+static
+inline int get_dummy_fd(void)
+{
+       return dup(dummy_pipe[0]);
+}
+
 static
 void init_object(struct lttng_ust_object_data *data)
 {
@@ -188,7 +205,7 @@ int ustctl_open_metadata(int sock, int session_handle,
                err = 1;
        } else {
                DBG("Received shm path: %s\n", shm_path);
-               metadata_data->shm_fd = -1;
+               metadata_data->shm_fd = get_dummy_fd();
                metadata_data->shm_path = shm_path;
        }
 
@@ -204,7 +221,7 @@ int ustctl_open_metadata(int sock, int session_handle,
                err = 1;
        } else {
                DBG("Received wait pipe path: %s\n", wait_pipe_path);
-               metadata_data->wait_fd = -1;
+               metadata_data->wait_fd = get_dummy_fd();
                metadata_data->wait_pipe_path = wait_pipe_path;
        }
 
@@ -220,6 +237,36 @@ error:
        return -EINVAL;
 }
 
+int ustctl_open_wait_pipe(int sock,
+                         struct lttng_ust_object_data *channel_data)
+{
+       struct ustcomm_ust_msg lum;
+       struct ustcomm_ust_reply lur;
+       int ret;
+
+       if (!channel_data)
+               return -EINVAL;
+
+       /* Create metadata channel */
+       memset(&lum, 0, sizeof(lum));
+       lum.handle = channel_data->handle;
+       lum.cmd = LTTNG_UST_STREAM_PIPE;
+       ret = ustcomm_send_app_cmd(sock, &lum, &lur);
+
+       if (ret) {
+               goto error;
+       }
+       if (lur.ret_code != USTCOMM_OK) {
+               ret = lur.ret_code;
+               goto error;
+       }
+
+       return 0;
+
+error:
+       return ret;
+}
+
 int ustctl_create_channel(int sock, int session_handle,
                struct lttng_ust_channel_attr *chops,
                struct lttng_ust_object_data **_channel_data)
@@ -265,7 +312,7 @@ int ustctl_create_channel(int sock, int session_handle,
                err = 1;
        } else {
                DBG("Received shm path: %s\n", shm_path);
-               channel_data->shm_fd = -1;
+               channel_data->shm_fd = get_dummy_fd();
                channel_data->shm_path = shm_path;
        }
 
@@ -280,7 +327,7 @@ int ustctl_create_channel(int sock, int session_handle,
                err = 1;
        } else {
                DBG("Received wait pipe path: %s\n", wait_pipe_path);
-               channel_data->wait_fd = -1;
+               channel_data->wait_fd = get_dummy_fd();
                channel_data->wait_pipe_path = wait_pipe_path;
        }
 
@@ -338,7 +385,7 @@ int ustctl_create_stream(int sock, struct lttng_ust_object_data *channel_data,
                err = 1;
        } else {
                DBG("Received shm path: %s\n", shm_path);
-               stream_data->shm_fd = -1;
+               stream_data->shm_fd = get_dummy_fd();
                stream_data->shm_path = shm_path;
        }
 
@@ -353,7 +400,7 @@ int ustctl_create_stream(int sock, struct lttng_ust_object_data *channel_data,
                err = 1;
        } else {
                DBG("Received wait pipe path: %s\n", wait_pipe_path);
-               stream_data->wait_fd = -1;
+               stream_data->wait_fd = get_dummy_fd();
                stream_data->wait_pipe_path = wait_pipe_path;
        }
 
This page took 0.025074 seconds and 4 git commands to generate.