/* Cleanup ALL session */
cds_list_for_each_entry_safe(sess, stmp,
&session_list_ptr->head, list) {
- cmd_destroy_session(sess, kernel_poll_pipe[1]);
+ cmd_destroy_session(sess, kernel_poll_pipe[1],
+ notification_thread_handle);
}
}
case LTTNG_ROTATION_GET_INFO:
case LTTNG_SESSION_GET_CURRENT_OUTPUT:
case LTTNG_ROTATION_SET_SCHEDULE:
+ case LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD:
+ case LTTNG_ROTATION_SCHEDULE_GET_SIZE:
need_domain = 0;
break;
default:
case LTTNG_DATA_PENDING:
case LTTNG_ROTATE_SESSION:
case LTTNG_ROTATION_GET_INFO:
+ case LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD:
+ case LTTNG_ROTATION_SCHEDULE_GET_SIZE:
break;
default:
/* Setup lttng message with no payload */
}
case LTTNG_DESTROY_SESSION:
{
- ret = cmd_destroy_session(cmd_ctx->session, kernel_poll_pipe[1]);
+ ret = cmd_destroy_session(cmd_ctx->session, kernel_poll_pipe[1],
+ notification_thread_handle);
/* Set session to NULL so we do not unlock it after free. */
cmd_ctx->session = NULL;
ret = cmd_rotation_set_schedule(cmd_ctx->session,
cmd_ctx->lsm->u.rotate_setup.timer_us,
- cmd_ctx->lsm->u.rotate_setup.size);
+ cmd_ctx->lsm->u.rotate_setup.size,
+ notification_thread_handle);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+
+ break;
+ }
+ case LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD:
+ {
+ struct lttng_rotation_schedule_get_timer_period *get_timer;
+
+ get_timer = zmalloc(sizeof(struct lttng_rotation_schedule_get_timer_period));
+ if (!get_timer) {
+ ret = ENOMEM;
+ goto error;
+ }
+ get_timer->rotate_timer = cmd_ctx->session->rotate_timer_period;
+
+ ret = setup_lttng_msg_no_cmd_header(cmd_ctx, get_timer,
+ sizeof(struct lttng_rotation_schedule_get_timer_period));
+ free(get_timer);
+ if (ret < 0) {
+ ret = -ret;
+ goto error;
+ }
+
+ ret = LTTNG_OK;
+ break;
+ }
+ case LTTNG_ROTATION_SCHEDULE_GET_SIZE:
+ {
+ struct lttng_rotation_schedule_get_size *get_size;
+
+ get_size = zmalloc(sizeof(struct lttng_rotation_schedule_get_size));
+ if (!get_size) {
+ ret = ENOMEM;
+ goto error;
+ }
+ get_size->rotate_size = cmd_ctx->session->rotate_size;
+
+ ret = setup_lttng_msg_no_cmd_header(cmd_ctx, get_size,
+ sizeof(struct lttng_rotation_schedule_get_size));
+ free(get_size);
if (ret < 0) {
ret = -ret;
goto error;
struct timer_thread_parameters timer_thread_ctx;
/* Queue of rotation jobs populated by the sessiond-timer. */
struct rotation_thread_timer_queue *rotation_timer_queue = NULL;
+ sem_t notification_thread_ready;
init_kernel_workarounds();
goto exit_health;
}
+ /*
+ * The rotation thread needs the notification thread to be ready before
+ * creating the rotate_notification_channel, so we use this semaphore as
+ * a rendez-vous point.
+ */
+ sem_init(¬ification_thread_ready, 0, 0);
+
/* notification_thread_data acquires the pipes' read side. */
notification_thread_handle = notification_thread_handle_create(
ust32_channel_monitor_pipe,
ust64_channel_monitor_pipe,
- kernel_channel_monitor_pipe);
+ kernel_channel_monitor_pipe,
+ ¬ification_thread_ready);
if (!notification_thread_handle) {
retval = -1;
ERR("Failed to create notification thread shared data");
ust64_channel_rotate_pipe,
kernel_channel_rotate_pipe,
thread_quit_pipe[0],
- rotation_timer_queue);
+ rotation_timer_queue,
+ notification_thread_handle,
+ ¬ification_thread_ready);
if (!rotation_thread_handle) {
retval = -1;
ERR("Failed to create rotation thread shared data");
exit_client:
exit_rotation:
exit_notification:
+ sem_destroy(¬ification_thread_ready);
ret = pthread_join(health_thread, &status);
if (ret) {
errno = ret;