static pthread_t dispatch_thread;
static pthread_t agent_reg_thread;
static pthread_t load_session_thread;
-static pthread_t timer_thread;
/*
* UST registration command queue. This queue is tied with a futex and uses a N
struct lttng_pipe *ust32_channel_monitor_pipe = NULL,
*ust64_channel_monitor_pipe = NULL,
*kernel_channel_monitor_pipe = NULL;
- bool timer_thread_launched = false;
struct lttng_thread *ht_cleanup_thread = NULL;
- struct timer_thread_parameters timer_thread_ctx;
+ struct timer_thread_parameters timer_thread_parameters;
/* Rotation thread handle. */
struct rotation_thread_handle *rotation_thread_handle = NULL;
/* Queue of rotation jobs populated by the sessiond-timer. */
retval = -1;
goto exit_init_data;
}
- timer_thread_ctx.rotation_thread_job_queue = rotation_timer_queue;
+ timer_thread_parameters.rotation_thread_job_queue =
+ rotation_timer_queue;
ust64_channel_monitor_pipe = lttng_pipe_open(0);
if (!ust64_channel_monitor_pipe) {
if (!launch_notification_thread(notification_thread_handle)) {
retval = -1;
goto exit_notification;
-
}
/* Create timer thread. */
- ret = pthread_create(&timer_thread, default_pthread_attr(),
- timer_thread_func, &timer_thread_ctx);
- if (ret) {
- errno = ret;
- PERROR("pthread_create timer");
+ if (!launch_timer_thread(&timer_thread_parameters)) {
retval = -1;
- stop_threads();
goto exit_notification;
}
- timer_thread_launched = true;
/* rotation_thread_data acquires the pipes' read side. */
rotation_thread_handle = rotation_thread_handle_create(
*/
rcu_barrier();
- if (timer_thread_launched) {
- timer_exit();
- ret = pthread_join(timer_thread, &status);
- if (ret) {
- errno = ret;
- PERROR("pthread_join timer thread");
- retval = -1;
- }
- }
-
if (ht_cleanup_thread) {
lttng_thread_shutdown(ht_cleanup_thread);
lttng_thread_put(ht_cleanup_thread);
#include "timer.h"
#include "health-sessiond.h"
#include "rotation-thread.h"
+#include "thread.h"
#define LTTNG_SESSIOND_SIG_QS SIGRTMIN + 10
#define LTTNG_SESSIOND_SIG_EXIT SIGRTMIN + 11
/*
* This thread is the sighandler for the timer signals.
*/
-void *timer_thread_func(void *data)
+static
+void *thread_timer(void *data)
{
int signr;
sigset_t mask;
return NULL;
}
-void timer_exit(void)
+static
+bool shutdown_timer_thread(void *data)
+{
+ return kill(getpid(), LTTNG_SESSIOND_SIG_EXIT) == 0;
+}
+
+bool launch_timer_thread(
+ struct timer_thread_parameters *timer_thread_parameters)
{
- kill(getpid(), LTTNG_SESSIOND_SIG_EXIT);
+ struct lttng_thread *thread;
+
+ thread = lttng_thread_create("Timer",
+ thread_timer,
+ shutdown_timer_thread,
+ NULL,
+ timer_thread_parameters);
+ if (!thread) {
+ goto error;
+ }
+ lttng_thread_put(thread);
+ return true;
+error:
+ return false;
}
#define SESSIOND_TIMER_H
#include <pthread.h>
+#include <stdbool.h>
#include "session.h"
};
int timer_signal_init(void);
-void *timer_thread_func(void *data);
-
-void timer_exit(void);
/* Start a session's rotation pending check timer (one-shot mode). */
int timer_session_rotation_pending_check_start(struct ltt_session *session,
/* Stop a session's rotation schedule timer. */
int timer_session_rotation_schedule_timer_stop(struct ltt_session *session);
+bool launch_timer_thread(
+ struct timer_thread_parameters *timer_thread_parameters);
+
#endif /* SESSIOND_TIMER_H */