Skip to content

Commit f149493

Browse files
committed
Fix: sessiond: ODR violation results in memory corruption
Issue observed ============== Address sanitizer reports the following invalid accesses while running the test_mi test. ❯ ASAN_OPTIONS=detect_odr_violation=0 lttng-sessiond ================================================================= ==289173==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60400000e280 at pc 0x55cbbe35e2e0 bp 0x7f01672f1550 sp 0x7f01672f1540 WRITE of size 4 at 0x60400000e280 thread T13 #0 0x55cbbe35e2df in mark_thread_as_ready /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/manage-consumer.cpp:32 #1 0x55cbbe360160 in thread_consumer_management /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/manage-consumer.cpp:267 #2 0x55cbbe336ac4 in launch_thread /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/thread.cpp:66 #3 0x7f01729c15c1 in start_thread (/usr/lib/libc.so.6+0x8d5c1) #4 0x7f0172a46583 in __clone (/usr/lib/libc.so.6+0x112583) 0x60400000e280 is located 8 bytes to the right of 40-byte region [0x60400000e250,0x60400000e278) allocated by thread T7 here: #0 0x7f01733b1fb9 in __interceptor_calloc /usr/src/debug/gcc/libsanitizer/asan/asan_malloc_linux.cpp:154 #1 0x55cbbe33adf3 in zmalloc_internal ../../../src/common/macros.hpp:60 #2 0x55cbbe33ae03 in thread_notifiers* zmalloc<thread_notifiers>() ../../../src/common/macros.hpp:89 #3 0x55cbbe3617f9 in launch_consumer_management_thread(consumer_data*) /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/manage-consumer.cpp:440 #4 0x55cbbe33cf49 in spawn_consumer_thread /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:188 #5 0x55cbbe33f7cf in start_consumerd /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:394 #6 0x55cbbe345713 in process_client_msg /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:1277 #7 0x55cbbe34d74b in thread_manage_clients /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:2622 #8 0x55cbbe336ac4 in launch_thread /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/thread.cpp:66 lttng#9 0x7f01729c15c1 in start_thread (/usr/lib/libc.so.6+0x8d5c1) Thread T13 created by T7 here: #0 0x7f0173353eb7 in __interceptor_pthread_create /usr/src/debug/gcc/libsanitizer/asan/asan_interceptors.cpp:216 #1 0x55cbbe336f9e in lttng_thread_create(char const*, void* (*)(void*), bool (*)(void*), void (*)(void*), void*) /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/thread.cpp:106 #2 0x55cbbe3618cc in launch_consumer_management_thread(consumer_data*) /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/manage-consumer.cpp:453 #3 0x55cbbe33cf49 in spawn_consumer_thread /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:188 #4 0x55cbbe33f7cf in start_consumerd /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:394 #5 0x55cbbe345713 in process_client_msg /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:1277 #6 0x55cbbe34d74b in thread_manage_clients /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:2622 #7 0x55cbbe336ac4 in launch_thread /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/thread.cpp:66 #8 0x7f01729c15c1 in start_thread (/usr/lib/libc.so.6+0x8d5c1) Thread T7 created by T0 here: #0 0x7f0173353eb7 in __interceptor_pthread_create /usr/src/debug/gcc/libsanitizer/asan/asan_interceptors.cpp:216 #1 0x55cbbe336f9e in lttng_thread_create(char const*, void* (*)(void*), bool (*)(void*), void (*)(void*), void*) /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/thread.cpp:106 #2 0x55cbbe34eebf in launch_client_thread() /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/client.cpp:2756 #3 0x55cbbe27f31a in main /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/main.cpp:1838 #4 0x7f017296130f in __libc_start_call_main (/usr/lib/libc.so.6+0x2d30f) SUMMARY: AddressSanitizer: heap-buffer-overflow /home/jgalar/EfficiOS/src/lttng-tools/src/bin/lttng-sessiond/manage-consumer.cpp:32 in mark_thread_as_ready Shadow bytes around the buggy address: 0x0c087fff9c00: fa fa fd fd fd fd fd fa fa fa fd fd fd fd fd fa 0x0c087fff9c10: fa fa fd fd fd fd fd fa fa fa fd fd fd fd fd fa 0x0c087fff9c20: fa fa fd fd fd fd fd fa fa fa fd fd fd fd fd fa 0x0c087fff9c30: fa fa fd fd fd fd fd fa fa fa fd fd fd fd fd fa 0x0c087fff9c40: fa fa fd fd fd fd fd fa fa fa 00 00 00 00 00 fa =>0x0c087fff9c50:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c60: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c70: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c90: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9ca0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb Shadow gap: cc ==289173==ABORTING Cause ===== The start functions of the various worker threads of the session daemon are implemented in separate translation units (TU). To make use of the lttng_thread API, they all define different control structures to control their shutdown. Those structures are all named 'thread_notifiers' and are all allocated using zmalloc<>. The various instances of zmalloc<thread_notifiers> all end up having the same mangled name (e.g. _Z7zmallocI16thread_notifiersEPT_v). At link time, only one instance of zmalloc<thread_notifiers> is kept. Since those structures all have different layout/sizes, this is problematic. However, it is an acceptable behaviour according to the ODR [1]. I first considered making the various memory allocation functions in macros.hpp 'static' which results in each TU holding the appropriate specialization of the various functions. While this works, it doesn't make us ODR-compliant. To make a long story short, a program defining multiple types sharing the same name, in the same namespace, is ill-formed. Another concern is that marking all templated free-functions as static will eventually result in code bloat. Solution ======== All structures defined in TUs (but not in a header) are placed in unnamed namespaces (also called anonymous namespaces) [2]. This results in separate copies of the templated functions being generated when specialized using a structure in an anonymous namespace (e.g. _Z7zmallocIN12_GLOBAL__N_116thread_notifiersEEPT_v). We could have renamed the various `thread_notifiers` structures to give them different names. However, I found those are not the only structures sharing a name in different TUs. For instance, the same problem applies to `struct lttng_index` (index in a stream, index in a map). I propose we systematically namespace structures defined in TUs in the future. This will also save us trouble if those POD structures eventually become non-POD: we would experience the same "clashes" if those structures had constructors, for example. References ========== [1] https://en.cppreference.com/w/cpp/language/definition [2] https://en.cppreference.com/w/cpp/language/namespace Signed-off-by: Jérémie Galarneau <[email protected]> Change-Id: I867e5a287ad8cf3ada617335bc1a80b800bf0833
1 parent 2d7da30 commit f149493

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+287
-148
lines changed

src/bin/lttng-crash/lttng-crash.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ enum rb_modes {
9898
RING_BUFFER_DISCARD = 1, /* Discard when buffer full */
9999
};
100100

101+
namespace {
101102
struct crash_abi_unknown {
102103
uint8_t magic[RB_CRASH_DUMP_ABI_MAGIC_LEN];
103104
uint64_t mmap_length; /* Overall length of crash record */
@@ -177,6 +178,7 @@ struct lttng_crash_layout {
177178
uint64_t num_subbuf; /* Number of sub-buffers for writer */
178179
uint32_t mode; /* Buffer mode: 0: overwrite, 1: discard */
179180
};
181+
} /* namespace */
180182

181183
/* Variables */
182184
static const char *progname;

src/bin/lttng-relayd/sessiond-trace-chunks.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ struct sessiond_trace_chunk_registry {
5656
struct cds_lfht *ht;
5757
};
5858

59+
namespace {
5960
struct trace_chunk_registry_ht_key {
6061
lttng_uuid sessiond_uuid;
6162
};
@@ -70,6 +71,7 @@ struct trace_chunk_registry_ht_element {
7071
struct lttng_trace_chunk_registry *trace_chunk_registry;
7172
struct sessiond_trace_chunk_registry *sessiond_trace_chunk_registry;
7273
};
74+
} /* namespace */
7375

7476
static
7577
unsigned long trace_chunk_registry_ht_key_hash(

src/bin/lttng-relayd/tcp_keep_alive.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161

6262
#endif /* ! defined (__linux__) && ! defined (__sun__) */
6363

64+
namespace {
6465
struct tcp_keep_alive_support {
6566
/* TCP keep-alive is supported by this platform. */
6667
bool supported;
@@ -105,17 +106,18 @@ struct tcp_keep_alive_config {
105106
int abort_threshold;
106107
};
107108

108-
static struct tcp_keep_alive_config the_config = {.enabled = false,
109+
struct tcp_keep_alive_config the_config = {.enabled = false,
109110
.idle_time = -1,
110111
.probe_interval = -1,
111112
.max_probe_count = -1,
112113
.abort_threshold = -1};
113114

114-
static struct tcp_keep_alive_support the_support = {.supported = false,
115+
struct tcp_keep_alive_support the_support = {.supported = false,
115116
.idle_time_supported = false,
116117
.probe_interval_supported = false,
117118
.max_probe_count_supported = false,
118119
.abort_threshold_supported = false};
120+
} /* namespace */
119121

120122
/*
121123
* Common parser for string to positive int conversion where the value must be

src/bin/lttng-sessiond/action-executor.cpp

+15-13
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@
3636
#define THREAD_NAME "Action Executor"
3737
#define MAX_QUEUED_WORK_COUNT 8192
3838

39+
struct action_executor {
40+
struct lttng_thread *thread;
41+
struct notification_thread_handle *notification_thread_handle;
42+
struct {
43+
uint64_t pending_count;
44+
struct cds_list_head list;
45+
pthread_cond_t cond;
46+
pthread_mutex_t lock;
47+
} work;
48+
bool should_quit;
49+
uint64_t next_work_item_id;
50+
};
51+
52+
namespace {
3953
/*
4054
* A work item is composed of a dynamic array of sub-items which
4155
* represent a flattened, and augmented, version of a trigger's actions.
@@ -69,7 +83,6 @@
6983
* trigger object at the moment of execution, if the trigger is found to be
7084
* unregistered, the execution is skipped.
7185
*/
72-
7386
struct action_work_item {
7487
uint64_t id;
7588

@@ -94,19 +107,8 @@ struct action_work_subitem {
94107
LTTNG_OPTIONAL(uint64_t) session_id;
95108
} context;
96109
};
110+
} /* namespace */
97111

98-
struct action_executor {
99-
struct lttng_thread *thread;
100-
struct notification_thread_handle *notification_thread_handle;
101-
struct {
102-
uint64_t pending_count;
103-
struct cds_list_head list;
104-
pthread_cond_t cond;
105-
pthread_mutex_t lock;
106-
} work;
107-
bool should_quit;
108-
uint64_t next_work_item_id;
109-
};
110112

111113
/*
112114
* Only return non-zero on a fatal error that should shut down the action

src/bin/lttng-sessiond/agent-thread.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "utils.hpp"
2323
#include "thread.hpp"
2424

25+
namespace {
2526
struct thread_notifiers {
2627
struct lttng_pipe *quit_pipe;
2728
sem_t ready;
@@ -36,15 +37,15 @@ struct agent_protocol_version {
3637
unsigned int major, minor;
3738
};
3839

39-
static int agent_tracing_enabled = -1;
40+
int agent_tracing_enabled = -1;
4041

4142
/*
4243
* Note that there is not port here. It's set after this URI is parsed so we
4344
* can let the user define a custom one. However, localhost is ALWAYS the
4445
* default listening address.
4546
*/
46-
static const char *default_reg_uri =
47-
"tcp://" DEFAULT_NETWORK_VIEWER_BIND_ADDRESS;
47+
const char *default_reg_uri = "tcp://" DEFAULT_NETWORK_VIEWER_BIND_ADDRESS;
48+
} /* namespace */
4849

4950
/*
5051
* Update agent application using the given socket. This is done just after

src/bin/lttng-sessiond/agent.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ typedef enum lttng_event_rule_status (*event_rule_logging_get_log_level_rule)(
3939
/*
4040
* Agent application context representation.
4141
*/
42+
namespace {
4243
struct agent_app_ctx {
4344
char *provider_name;
4445
char *ctx_name;
@@ -49,6 +50,7 @@ struct agent_app_ctx {
4950
/* For call_rcu teardown. */
5051
struct rcu_head rcu_node;
5152
};
53+
} /* namespace */
5254

5355
/*
5456
* Human readable agent return code.

src/bin/lttng-sessiond/clear.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
#include "kernel.hpp"
2121
#include "cmd.hpp"
2222

23+
namespace {
2324
struct cmd_clear_session_reply_context {
2425
int reply_sock_fd;
2526
};
27+
} /* namespace */
2628

2729
static
2830
void cmd_clear_session_reply(const struct ltt_session *session,

src/bin/lttng-sessiond/client.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@
4545
#include "testpoint.hpp"
4646
#include "utils.hpp"
4747

48-
static bool is_root;
48+
namespace {
49+
bool is_root;
4950

50-
static struct thread_state {
51+
struct thread_state {
5152
sem_t ready;
5253
bool running;
5354
int client_sock;
5455
} thread_state;
56+
} /* namespace */
5557

5658
static void set_thread_status(bool running)
5759
{

src/bin/lttng-sessiond/cmd.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@
7474
/* Sleep for 100ms between each check for the shm path's deletion. */
7575
#define SESSION_DESTROY_SHM_PATH_CHECK_DELAY_US 100000
7676

77+
static enum lttng_error_code wait_on_path(void *path);
78+
79+
namespace {
7780
struct cmd_destroy_session_reply_context {
7881
int reply_sock_fd;
7982
bool implicit_rotation_on_destroy;
@@ -84,15 +87,13 @@ struct cmd_destroy_session_reply_context {
8487
enum lttng_error_code destruction_status;
8588
};
8689

87-
static enum lttng_error_code wait_on_path(void *path);
88-
8990
/*
9091
* Command completion handler that is used by the destroy command
9192
* when a session that has a non-default shm_path is being destroyed.
9293
*
9394
* See comment in cmd_destroy_session() for the rationale.
9495
*/
95-
static struct destroy_completion_handler {
96+
struct destroy_completion_handler {
9697
struct cmd_completion_handler handler;
9798
char shm_path[member_sizeof(struct ltt_session, shm_path)];
9899
} destroy_completion_handler = {
@@ -103,17 +104,17 @@ static struct destroy_completion_handler {
103104
.shm_path = { 0 },
104105
};
105106

106-
static struct cmd_completion_handler *current_completion_handler;
107-
108107
/*
109108
* Used to keep a unique index for each relayd socket created where this value
110109
* is associated with streams on the consumer so it can match the right relayd
111110
* to send to. It must be accessed with the relayd_net_seq_idx_lock
112111
* held.
113112
*/
114-
static pthread_mutex_t relayd_net_seq_idx_lock = PTHREAD_MUTEX_INITIALIZER;
115-
static uint64_t relayd_net_seq_idx;
113+
pthread_mutex_t relayd_net_seq_idx_lock = PTHREAD_MUTEX_INITIALIZER;
114+
uint64_t relayd_net_seq_idx;
115+
} /* namespace */
116116

117+
static struct cmd_completion_handler *current_completion_handler;
117118
static int validate_ust_event_name(const char *);
118119
static int cmd_enable_event_internal(struct ltt_session *session,
119120
const struct lttng_domain *domain,

src/bin/lttng-sessiond/dispatch.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
#include "lttng-sessiond.hpp"
2222
#include "thread.hpp"
2323

24+
namespace {
2425
struct thread_notifiers {
2526
struct ust_cmd_queue *ust_cmd_queue;
2627
int apps_cmd_pipe_write_fd;
2728
int apps_cmd_notify_pipe_write_fd;
2829
int dispatch_thread_exit;
2930
};
31+
} /* namespace */
3032

3133
/*
3234
* For each tracing session, update newly registered apps. The session list

src/bin/lttng-sessiond/event-notifier-error-accounting.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#define ERROR_COUNTER_INDEX_HT_INITIAL_SIZE 16
2727

28+
namespace {
2829
struct index_ht_entry {
2930
struct lttng_ht_node_u64 node;
3031
uint64_t error_counter_index;
@@ -53,10 +54,10 @@ struct kernel_error_accounting_entry {
5354
int error_counter_fd;
5455
};
5556

56-
static struct kernel_error_accounting_entry kernel_error_accounting_entry;
57+
struct kernel_error_accounting_entry kernel_error_accounting_entry;
5758

5859
/* Hashtable mapping uid to error_account_entry. */
59-
static struct lttng_ht *error_counter_uid_ht;
60+
struct lttng_ht *error_counter_uid_ht;
6061

6162
struct error_accounting_state {
6263
struct lttng_index_allocator *index_allocator;
@@ -65,8 +66,9 @@ struct error_accounting_state {
6566
uint64_t number_indices;
6667
};
6768

68-
static struct error_accounting_state ust_state;
69-
static struct error_accounting_state kernel_state;
69+
struct error_accounting_state ust_state;
70+
struct error_accounting_state kernel_state;
71+
} /* namespace */
7072

7173
static inline void get_trigger_info_for_log(const struct lttng_trigger *trigger,
7274
const char **trigger_name,
@@ -113,12 +115,14 @@ const char *error_accounting_status_str(
113115
}
114116

115117
#ifdef HAVE_LIBLTTNG_UST_CTL
118+
namespace {
116119
struct event_notifier_counter {
117120
pthread_mutex_t lock;
118121
long count;
119122
};
120123

121-
static struct event_notifier_counter the_event_notifier_counter;
124+
struct event_notifier_counter the_event_notifier_counter;
125+
} /* namespace */
122126

123127
static void free_ust_error_accounting_entry(struct rcu_head *head)
124128
{

src/bin/lttng-sessiond/health.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
#include "utils.hpp"
1818
#include "thread.hpp"
1919

20+
namespace {
2021
struct thread_notifiers {
2122
struct lttng_pipe *quit_pipe;
2223
sem_t ready;
2324
};
25+
} /* namespace */
2426

2527
static
2628
void mark_thread_as_ready(struct thread_notifiers *notifiers)

src/bin/lttng-sessiond/manage-apps.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
#include "utils.hpp"
1414
#include "thread.hpp"
1515

16+
namespace {
1617
struct thread_notifiers {
1718
struct lttng_pipe *quit_pipe;
1819
int apps_cmd_pipe_read_fd;
1920
};
21+
} /* namespace */
2022

2123
static void cleanup_application_management_thread(void *data)
2224
{

src/bin/lttng-sessiond/manage-consumer.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
#include "thread.hpp"
2020
#include "ust-consumer.hpp"
2121

22+
namespace {
2223
struct thread_notifiers {
2324
struct lttng_pipe *quit_pipe;
2425
struct consumer_data *consumer_data;
2526
sem_t ready;
2627
int initialization_result;
2728
};
29+
} /* namespace */
2830

2931
static void mark_thread_as_ready(struct thread_notifiers *notifiers)
3032
{

src/bin/lttng-sessiond/manage-kernel.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
#include "kernel.hpp"
1919
#include "kernel-consumer.hpp"
2020

21+
namespace {
2122
struct thread_notifiers {
2223
struct lttng_pipe *quit_pipe;
2324
int kernel_poll_pipe_read_fd;
2425
};
26+
} /* namespace */
2527

2628
/*
2729
* Update the kernel poll set of all channel fd available over all tracing

src/bin/lttng-sessiond/notification-thread-events.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,6 @@ enum lttng_object_type {
6060
LTTNG_OBJECT_TYPE_SESSION,
6161
};
6262

63-
struct lttng_trigger_list_element {
64-
/* No ownership of the trigger object is assumed. */
65-
struct lttng_trigger *trigger;
66-
struct cds_list_head node;
67-
};
68-
6963
struct lttng_channel_trigger_list {
7064
struct channel_key channel_key;
7165
/* List of struct lttng_trigger_list_element. */
@@ -117,6 +111,13 @@ struct lttng_session_trigger_list {
117111
struct rcu_head rcu_node;
118112
};
119113

114+
namespace {
115+
struct lttng_trigger_list_element {
116+
/* No ownership of the trigger object is assumed. */
117+
struct lttng_trigger *trigger;
118+
struct cds_list_head node;
119+
};
120+
120121
struct lttng_trigger_ht_element {
121122
struct lttng_trigger *trigger;
122123
struct cds_lfht_node node;
@@ -140,6 +141,7 @@ struct channel_state_sample {
140141
/* call_rcu delayed reclaim. */
141142
struct rcu_head rcu_node;
142143
};
144+
} /* namespace */
143145

144146
static unsigned long hash_channel_key(struct channel_key *key);
145147
static int evaluate_buffer_condition(const struct lttng_condition *condition,

src/bin/lttng-sessiond/notify-apps.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
#include "utils.hpp"
1919
#include "thread.hpp"
2020

21+
namespace {
2122
struct thread_notifiers {
2223
struct lttng_pipe *quit_pipe;
2324
int apps_cmd_notify_pipe_read_fd;
2425
};
26+
} /* namespace */
2527

2628
/*
2729
* This thread manage application notify communication.

0 commit comments

Comments
 (0)