side initialization
[libside.git] / src / side.c
1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6 #include <side/trace.h>
7 #include "tracer.h"
8 #include "rcu.h"
9 #include "smp.h"
10
11 #define SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK 0x80000000
12
13 struct side_rcu_gp_state rcu_gp = {
14 .percpu_state = NULL,
15 .nr_cpus = 0,
16 .period = 0,
17 .gp_lock = PTHREAD_MUTEX_INITIALIZER,
18 };
19
20 /*
21 * Lazy initialization for early use within library constructors.
22 */
23 static bool initialized;
24
25 static
26 void side_init(void)
27 __attribute__((constructor));
28
29 void side_call(const struct side_event_description *desc, const struct side_arg_vec_description *sav_desc)
30 {
31 if (side_unlikely(!initialized))
32 side_init();
33 if (side_unlikely(desc->flags & SIDE_EVENT_FLAG_VARIADIC)) {
34 printf("ERROR: unexpected variadic event description\n");
35 abort();
36 }
37 if (side_unlikely(*desc->enabled & SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK)) {
38 // TODO: call kernel write.
39 }
40 //TODO: replace tracer_call by rcu iteration on list of registered callbacks
41 tracer_call(desc, sav_desc, NULL);
42 }
43
44 void side_call_variadic(const struct side_event_description *desc,
45 const struct side_arg_vec_description *sav_desc,
46 const struct side_arg_dynamic_event_struct *var_struct)
47 {
48 if (side_unlikely(!initialized))
49 side_init();
50 if (side_unlikely(*desc->enabled & SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK)) {
51 // TODO: call kernel write.
52 }
53 //TODO: replace tracer_call by rcu iteration on list of registered callbacks
54 tracer_call_variadic(desc, sav_desc, var_struct, NULL);
55 }
56
57 void side_init(void)
58 {
59 if (initialized)
60 return;
61 rcu_gp.nr_cpus = get_possible_cpus_array_len();
62 if (!rcu_gp.nr_cpus)
63 abort();
64 initialized = true;
65 }
This page took 0.031376 seconds and 5 git commands to generate.