/*
- * Copyright (C) 2017 - Julien Desfossez <jdesfossez@efficios.com>
- * Copyright (C) 2018 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2017 Julien Desfossez <jdesfossez@efficios.com>
+ * Copyright (C) 2018 Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
*
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define _LGPL_SOURCE
#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
unsigned int timer_interval_us, int signal, bool one_shot)
{
int ret = 0, delete_ret;
- struct sigevent sev;
+ struct sigevent sev = {};
struct itimerspec its;
sev.sigev_notify = SIGEV_SIGNAL;
int ret;
assert(session);
+ assert(session->rotation_pending_check_timer_enabled);
DBG("Disabling session rotation pending check timer on session %" PRIu64,
session->id);
ret = -1;
goto end;
}
- DBG("Enabling scheduled rotation timer on session \"%s\" (%ui µs)", session->name,
- interval_us);
+ DBG("Enabling scheduled rotation timer on session \"%s\" (%ui %s)", session->name,
+ interval_us, USEC_UNIT);
ret = timer_start(&session->rotation_schedule_timer, session,
interval_us, LTTNG_SESSIOND_SIG_SCHEDULED_ROTATION,
/* one-shot */ false);
/*
* 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;
rcu_register_thread();
rcu_thread_online();
- health_register(health_sessiond, HEALTH_SESSIOND_TYPE_TIMER);
+ health_register(the_health_sessiond, HEALTH_SESSIOND_TYPE_TIMER);
health_code_update();
/* Only self thread will receive signal mask. */
rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
ROTATION_THREAD_JOB_TYPE_CHECK_PENDING_ROTATION,
session);
- session_lock_list();
- session_put(session);
- session_unlock_list();
} else if (signr == LTTNG_SESSIOND_SIG_SCHEDULED_ROTATION) {
rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
ROTATION_THREAD_JOB_TYPE_SCHEDULED_ROTATION,
end:
DBG("[timer-thread] Exit");
- health_unregister(health_sessiond);
+ health_unregister(the_health_sessiond);
rcu_thread_offline();
rcu_unregister_thread();
return NULL;
}
-void timer_exit(void)
+static
+bool shutdown_timer_thread(void *data)
{
- kill(getpid(), LTTNG_SESSIOND_SIG_EXIT);
+ return kill(getpid(), LTTNG_SESSIOND_SIG_EXIT) == 0;
+}
+
+bool launch_timer_thread(
+ struct timer_thread_parameters *timer_thread_parameters)
+{
+ 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;
}