if (sock_info->constructor_sem_posted)
return 0;
sock_info->constructor_sem_posted = 1;
+ if (uatomic_read(&sem_count) <= 0) {
+ return 0;
+ }
ret = uatomic_add_return(&sem_count, -1);
if (ret == 0) {
ret = sem_post(&constructor_wait);
} else {
lur.ret_code = LTTCOMM_SESSION_FAIL;
}
+ if (lum->cmd == LTTNG_UST_STREAM) {
+ /*
+ * Special-case reply to send stream info.
+ * Use lum.u output.
+ */
+ lur.u.stream.memory_map_size = lum->u.stream.memory_map_size;
+ }
ret = send_reply(sock, &lur);
+ if (lum->cmd == LTTNG_UST_STREAM && ret >= 0) {
+ /* we also need to send the file descriptors. */
+ ret = lttcomm_send_fds_unix_sock(sock,
+ &lum->u.stream.shm_fd, &lum->u.stream.shm_fd,
+ 1, sizeof(int));
+ if (ret < 0) {
+ perror("send shm_fd");
+ goto error;
+ }
+ ret = lttcomm_send_fds_unix_sock(sock,
+ &lum->u.stream.wait_fd, &lum->u.stream.wait_fd,
+ 1, sizeof(int));
+ if (ret < 0) {
+ perror("send wait_fd");
+ goto error;
+ }
+ }
+error:
ust_unlock();
return ret;
}
"mainline). LTTng-UST will use polling mode fallback.");
}
PERROR("futex");
- sleep(5);
}
}
return;
error:
ust_unlock();
- /* Error handling: fallback on a 5 seconds sleep. */
- sleep(5);
return;
}
void *ust_listener_thread(void *arg)
{
struct sock_info *sock_info = arg;
- int sock, ret;
+ int sock, ret, prev_connect_failed = 0, has_waited = 0;
/* Restart trying to connect to the session daemon */
restart:
+ if (prev_connect_failed) {
+ /* Wait for sessiond availability with pipe */
+ wait_for_sessiond(sock_info);
+ if (has_waited) {
+ has_waited = 0;
+ /*
+ * Sleep for 5 seconds before retrying after a
+ * sequence of failure / wait / failure. This
+ * deals with a killed or broken session daemon.
+ */
+ sleep(5);
+ }
+ has_waited = 1;
+ prev_connect_failed = 0;
+ }
ust_lock();
if (lttng_ust_comm_should_quit) {
ret = lttcomm_connect_unix_sock(sock_info->sock_path);
if (ret < 0) {
ERR("Error connecting to %s apps socket", sock_info->name);
+ prev_connect_failed = 1;
/*
* If we cannot find the sessiond daemon, don't delay
* constructor execution.
ret = handle_register_done(sock_info);
assert(!ret);
ust_unlock();
-
- /* Wait for sessiond availability with pipe */
- wait_for_sessiond(sock_info);
goto restart;
}
ret = register_app_to_sessiond(sock);
if (ret < 0) {
ERR("Error registering to %s apps socket", sock_info->name);
+ prev_connect_failed = 1;
/*
* If we cannot register to the sessiond daemon, don't
* delay constructor execution.
ret = handle_register_done(sock_info);
assert(!ret);
ust_unlock();
- wait_for_sessiond(sock_info);
goto restart;
}
ust_unlock();