page alloc wrapper: Fix get_pfnblock_flags_mask prototype
[lttng-modules.git] / src / lttng-clock.c
CommitLineData
b7cdc182 1/* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
9f36eaed 2 *
2754583e
MD
3 * lttng-clock.c
4 *
5 * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
2754583e
MD
6 */
7
8#include <linux/module.h>
9#include <linux/kmod.h>
10#include <linux/mutex.h>
11
241ae9a8 12#include <wrapper/trace-clock.h>
2df37e95
MD
13#include <lttng/events.h>
14#include <lttng/tracer.h>
9139e0fa 15#include <lttng/events-internal.h>
2754583e
MD
16
17struct lttng_trace_clock *lttng_trace_clock;
18EXPORT_SYMBOL_GPL(lttng_trace_clock);
19
20static DEFINE_MUTEX(clock_mutex);
21static struct module *lttng_trace_clock_mod; /* plugin */
22static int clock_used; /* refcount */
23
24int lttng_clock_register_plugin(struct lttng_trace_clock *ltc,
25 struct module *mod)
26{
27 int ret = 0;
28
29 mutex_lock(&clock_mutex);
30 if (clock_used) {
31 ret = -EBUSY;
32 goto end;
33 }
34 if (lttng_trace_clock_mod) {
35 ret = -EEXIST;
36 goto end;
37 }
38 /* set clock */
a8f2d0c7 39 WRITE_ONCE(lttng_trace_clock, ltc);
2754583e
MD
40 lttng_trace_clock_mod = mod;
41end:
42 mutex_unlock(&clock_mutex);
43 return ret;
44}
45EXPORT_SYMBOL_GPL(lttng_clock_register_plugin);
46
47void lttng_clock_unregister_plugin(struct lttng_trace_clock *ltc,
48 struct module *mod)
49{
50 mutex_lock(&clock_mutex);
51 WARN_ON_ONCE(clock_used);
52 if (!lttng_trace_clock_mod) {
53 goto end;
54 }
55 WARN_ON_ONCE(lttng_trace_clock_mod != mod);
56
a8f2d0c7 57 WRITE_ONCE(lttng_trace_clock, NULL);
2754583e
MD
58 lttng_trace_clock_mod = NULL;
59end:
60 mutex_unlock(&clock_mutex);
61}
62EXPORT_SYMBOL_GPL(lttng_clock_unregister_plugin);
63
64void lttng_clock_ref(void)
65{
66 mutex_lock(&clock_mutex);
67 clock_used++;
68 if (lttng_trace_clock_mod) {
69 int ret;
70
71 ret = try_module_get(lttng_trace_clock_mod);
72 if (!ret) {
5a15f70c 73 printk(KERN_ERR "LTTng: LTTng-clock cannot get clock plugin module\n");
a8f2d0c7 74 WRITE_ONCE(lttng_trace_clock, NULL);
2754583e
MD
75 lttng_trace_clock_mod = NULL;
76 }
77 }
78 mutex_unlock(&clock_mutex);
79}
80EXPORT_SYMBOL_GPL(lttng_clock_ref);
81
82void lttng_clock_unref(void)
83{
84 mutex_lock(&clock_mutex);
85 clock_used--;
86 if (lttng_trace_clock_mod)
87 module_put(lttng_trace_clock_mod);
88 mutex_unlock(&clock_mutex);
89}
90EXPORT_SYMBOL_GPL(lttng_clock_unref);
91
92MODULE_LICENSE("GPL and additional rights");
93MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
94MODULE_DESCRIPTION("LTTng Clock");
95MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
96 __stringify(LTTNG_MODULES_MINOR_VERSION) "."
97 __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)
98 LTTNG_MODULES_EXTRAVERSION);
This page took 0.054064 seconds and 4 git commands to generate.