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.
volatile enum ust_loglevel ust_loglevel;
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)
{
static
void init_object(struct lttng_ust_object_data *data)
{
err = 1;
} else {
DBG("Received shm path: %s\n", shm_path);
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;
}
metadata_data->shm_path = shm_path;
}
err = 1;
} else {
DBG("Received wait pipe path: %s\n", wait_pipe_path);
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;
}
metadata_data->wait_pipe_path = wait_pipe_path;
}
err = 1;
} else {
DBG("Received shm path: %s\n", shm_path);
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;
}
channel_data->shm_path = shm_path;
}
err = 1;
} else {
DBG("Received wait pipe path: %s\n", wait_pipe_path);
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;
}
channel_data->wait_pipe_path = wait_pipe_path;
}
err = 1;
} else {
DBG("Received shm path: %s\n", shm_path);
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;
}
stream_data->shm_path = shm_path;
}
err = 1;
} else {
DBG("Received wait pipe path: %s\n", wait_pipe_path);
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;
}
stream_data->wait_pipe_path = wait_pipe_path;
}