Commit | Line | Data |
---|---|---|
5e1b7b8b | 1 | /* |
c0c0989a | 2 | * SPDX-License-Identifier: LGPL-2.1-only |
5e1b7b8b | 3 | * |
c0c0989a | 4 | * Copyright (C) 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
5e1b7b8b MD |
5 | */ |
6 | ||
3fbec7dc | 7 | #define _LGPL_SOURCE |
5e1b7b8b MD |
8 | #include <error.h> |
9 | #include <dlfcn.h> | |
10 | #include <stdlib.h> | |
9d315d6d | 11 | #include "common/logging.h" |
5e1b7b8b MD |
12 | #include <lttng/ust-getcpu.h> |
13 | #include <urcu/system.h> | |
14 | #include <urcu/arch.h> | |
15 | ||
730bf2af | 16 | #include "getenv.h" |
e4db8f98 | 17 | #include "common/ringbuffer/getcpu.h" |
5e1b7b8b MD |
18 | |
19 | int (*lttng_get_cpu)(void); | |
20 | ||
4bc1ccd7 MD |
21 | static |
22 | void *getcpu_handle; | |
23 | ||
5e1b7b8b MD |
24 | int lttng_ust_getcpu_override(int (*getcpu)(void)) |
25 | { | |
26 | CMM_STORE_SHARED(lttng_get_cpu, getcpu); | |
27 | return 0; | |
28 | } | |
29 | ||
30 | void lttng_ust_getcpu_init(void) | |
31 | { | |
32 | const char *libname; | |
5e1b7b8b MD |
33 | void (*libinit)(void); |
34 | ||
4bc1ccd7 MD |
35 | if (getcpu_handle) |
36 | return; | |
4c41b460 | 37 | libname = lttng_ust_getenv("LTTNG_UST_GETCPU_PLUGIN"); |
5e1b7b8b MD |
38 | if (!libname) |
39 | return; | |
4bc1ccd7 MD |
40 | getcpu_handle = dlopen(libname, RTLD_NOW); |
41 | if (!getcpu_handle) { | |
5e1b7b8b MD |
42 | PERROR("Cannot load LTTng UST getcpu override library %s", |
43 | libname); | |
44 | return; | |
45 | } | |
46 | dlerror(); | |
4bc1ccd7 | 47 | libinit = (void (*)(void)) dlsym(getcpu_handle, |
5e1b7b8b MD |
48 | "lttng_ust_getcpu_plugin_init"); |
49 | if (!libinit) { | |
50 | PERROR("Cannot find LTTng UST getcpu override library %s initialization function lttng_ust_getcpu_plugin_init()", | |
51 | libname); | |
52 | return; | |
53 | } | |
54 | libinit(); | |
55 | } |