Cygwin: Generate dummy file descriptors
authorChristian Babeux <christian.babeux@efficios.com>
Wed, 28 Nov 2012 22:00:01 +0000 (17:00 -0500)
committerChristian Babeux <christian.babeux@efficios.com>
Wed, 28 Nov 2012 22:03:30 +0000 (17:03 -0500)
The consumer in LTTng-tools keeps a mapping of the file descriptors
between the sessiond and it's own file descriptors in a hash table.
The fd number is the key used for lookups in the hash table.
Since we can't send the fds to the sessiond on Cygwin, the consumer
fds mapping mechanism is broken.

To fix this, we generate a dummy file descriptor upon reception
of the file paths in the sessiond.

liblttng-ust-ctl/ustctl.c

index 39997a2be97dd886bcd63028acb0ccbb2df5facc..5069fbb19ce9638de182540c8c4a235ed61171d9 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;
        }
 
@@ -265,7 +282,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 +297,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 +355,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 +370,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.027122 seconds and 4 git commands to generate.