Visibility hidden by default
[babeltrace.git] / src / lib / current-thread.c
CommitLineData
553c4bab 1/*
0235b0db 2 * SPDX-License-Identifier: MIT
553c4bab 3 *
0235b0db 4 * Copyright (c) 2019 Philippe Proulx <pproulx@efficios.com>
553c4bab
PP
5 */
6
7#define BT_LOG_TAG "LIB/CUR-THREAD"
8#include "lib/logging.h"
9
4fa90f32 10#include <babeltrace2/babeltrace.h>
553c4bab
PP
11#include <stdint.h>
12#include <stdarg.h>
13
14#include "error.h"
15#include "common/assert.h"
d98421f2 16#include "lib/assert-cond.h"
553c4bab
PP
17#include "lib/func-status.h"
18
1778c2a4
PP
19#define BT_ASSERT_PRE_FILE_NAME_NON_NULL(_file_name) \
20 BT_ASSERT_PRE_NON_NULL("file-name", (_file_name), "File name");
21
22#define BT_ASSERT_PRE_MSG_FMT_NON_NULL(_msg_fmt) \
23 BT_ASSERT_PRE_NON_NULL("message-format", (_msg_fmt), "Message format");
24
553c4bab
PP
25/*
26 * This points to the thread's error object, or it's `NULL` if there's
27 * no current error object.
28 */
29static __thread struct bt_error *thread_error;
30
1353b066 31BT_EXPORT
553c4bab
PP
32const struct bt_error *bt_current_thread_take_error(void)
33{
34 struct bt_error *error = thread_error;
35
36 thread_error = NULL;
37 BT_LOGD("Took current thread's error object: addr=%p",
38 error);
39 return error;
40}
41
1353b066 42BT_EXPORT
553c4bab
PP
43void bt_current_thread_clear_error(void)
44{
45 bt_error_destroy(thread_error);
46 BT_LOGD("Cleared current thread's error object: addr=%p",
47 thread_error);
48 thread_error = NULL;
49}
50
1353b066 51BT_EXPORT
553c4bab
PP
52void bt_current_thread_move_error(const struct bt_error *error)
53{
d5b13b9b 54 BT_ASSERT_PRE_ERROR_NON_NULL(error);
553c4bab
PP
55 bt_current_thread_clear_error();
56 thread_error = (void *) error;
57 BT_LOGD("Moved error object as current thread's error: addr=%p",
58 thread_error);
59}
60
61/*
62 * Creates the current thread's error object if it does not already
63 * exist.
64 */
65static
66int try_create_thread_error(void)
67{
68 int status = BT_FUNC_STATUS_OK;
69
70 if (thread_error) {
71 goto end;
72 }
73
74 BT_LOGD_STR("Creating current thread's error object.");
75 thread_error = bt_error_create();
76 if (!thread_error) {
77 /* bt_error_create() logs errors */
78 status = BT_FUNC_STATUS_MEMORY_ERROR;
79 goto end;
80 }
81
82 BT_LOGD("Created current thread's error object: addr=%p", thread_error);
83
84end:
85 return status;
86}
87
1353b066 88BT_EXPORT
553c4bab
PP
89enum bt_current_thread_error_append_cause_status
90bt_current_thread_error_append_cause_from_unknown(
91 const char *module_name, const char *file_name,
92 uint64_t line_no, const char *msg_fmt, ...)
93{
94 enum bt_current_thread_error_append_cause_status status =
95 try_create_thread_error();
96 va_list args;
97
1778c2a4
PP
98 BT_ASSERT_PRE_NON_NULL("module-name", module_name, "Module name");
99 BT_ASSERT_PRE_FILE_NAME_NON_NULL(file_name);
100 BT_ASSERT_PRE_MSG_FMT_NON_NULL(msg_fmt);
c77d03eb 101
553c4bab
PP
102 if (status) {
103 goto end;
104 }
105
106 BT_LOGD("Appending error cause to current thread's error from unknown actor: "
107 "error-addr=%p", thread_error);
108 va_start(args, msg_fmt);
109 status = bt_error_append_cause_from_unknown(thread_error, module_name,
110 file_name, line_no, msg_fmt, args);
111 va_end(args);
112
113end:
114 return status;
115}
116
1353b066 117BT_EXPORT
553c4bab
PP
118enum bt_current_thread_error_append_cause_status
119bt_current_thread_error_append_cause_from_component(
120 bt_self_component *self_comp, const char *file_name,
121 uint64_t line_no, const char *msg_fmt, ...)
122{
123 enum bt_current_thread_error_append_cause_status status =
124 try_create_thread_error();
125 va_list args;
126
d5b13b9b 127 BT_ASSERT_PRE_COMP_NON_NULL(self_comp);
1778c2a4
PP
128 BT_ASSERT_PRE_FILE_NAME_NON_NULL(file_name);
129 BT_ASSERT_PRE_MSG_FMT_NON_NULL(msg_fmt);
c77d03eb 130
553c4bab
PP
131 if (status) {
132 goto end;
133 }
134
135 BT_LOGD("Appending error cause to current thread's error from component: "
136 "error-addr=%p", thread_error);
137 va_start(args, msg_fmt);
138 status = bt_error_append_cause_from_component(thread_error, self_comp,
139 file_name, line_no, msg_fmt, args);
140 va_end(args);
141
142end:
143 return status;
144}
145
1353b066 146BT_EXPORT
553c4bab
PP
147enum bt_current_thread_error_append_cause_status
148bt_current_thread_error_append_cause_from_component_class(
149 bt_self_component_class *self_comp_class, const char *file_name,
150 uint64_t line_no, const char *msg_fmt, ...)
151{
152 enum bt_current_thread_error_append_cause_status status =
153 try_create_thread_error();
154 va_list args;
155
d5b13b9b 156 BT_ASSERT_PRE_COMP_CLS_NON_NULL(self_comp_class);
1778c2a4
PP
157 BT_ASSERT_PRE_FILE_NAME_NON_NULL(file_name);
158 BT_ASSERT_PRE_MSG_FMT_NON_NULL(msg_fmt);
c77d03eb 159
553c4bab
PP
160 if (status) {
161 goto end;
162 }
163
164 BT_LOGD("Appending error cause to current thread's error from component class actor: "
165 "error-addr=%p", thread_error);
166 va_start(args, msg_fmt);
167 status = bt_error_append_cause_from_component_class(thread_error,
168 self_comp_class, file_name, line_no, msg_fmt, args);
169 va_end(args);
170
171end:
172 return status;
173}
174
1353b066 175BT_EXPORT
553c4bab
PP
176enum bt_current_thread_error_append_cause_status
177bt_current_thread_error_append_cause_from_message_iterator(
178 bt_self_message_iterator *self_iter, const char *file_name,
179 uint64_t line_no, const char *msg_fmt, ...)
180{
181 enum bt_current_thread_error_append_cause_status status =
182 try_create_thread_error();
183 va_list args;
184
d5b13b9b 185 BT_ASSERT_PRE_MSG_ITER_NON_NULL(self_iter);
1778c2a4
PP
186 BT_ASSERT_PRE_FILE_NAME_NON_NULL(file_name);
187 BT_ASSERT_PRE_MSG_FMT_NON_NULL(msg_fmt);
c77d03eb 188
553c4bab
PP
189 if (status) {
190 goto end;
191 }
192
193 BT_LOGD("Appending error cause to current thread's error from message iterator actor: "
194 "error-addr=%p", thread_error);
195 va_start(args, msg_fmt);
196 status = bt_error_append_cause_from_message_iterator(thread_error,
197 self_iter, file_name, line_no, msg_fmt, args);
198 va_end(args);
199
200end:
201 return status;
202}
This page took 0.061525 seconds and 4 git commands to generate.