aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Norris <robn@despairlabs.com>2024-04-28 02:49:58 +0000
committerBrian Behlendorf <behlendorf1@llnl.gov>2024-05-01 17:51:54 +0000
commitdec697ad683ecfdf9833455af0568ce4ddc7c885 (patch)
tree56664c278f46e44a783ac4a42a901d2a3bd943ad
parent394800200e033f3a21dcbbf38a1e71b9d33b3b70 (diff)
downloadsrc-dec697ad683ecfdf9833455af0568ce4ddc7c885.tar.gz
src-dec697ad683ecfdf9833455af0568ce4ddc7c885.zip
libspl/assert: add lock around assertion output
If multiple threads trip an assertion at the same moment (quite common), they can be printing at the same time, and their output gets messy. This adds a simple lock around the whole thing, to prevent a second task printing assert output before the first has finished. Additionally, if libspl_assert_ok is not set, abort() is called without dropping the lock, so that any other asserting tasks will be killed before starting any output, rather than only getting part-way through. This is a tradeoff; it's assumed that multiple threads asserting at the same moment are likely the same fault in different instances of a thread, and so there won't be any more useful information from the other tasks anyway. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rob Norris <robn@despairlabs.com> Sponsored-by: https://despairlabs.com/sponsor/ Closes #16140
-rw-r--r--lib/libspl/assert.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/libspl/assert.c b/lib/libspl/assert.c
index 185ec65cb894..d402462531b6 100644
--- a/lib/libspl/assert.c
+++ b/lib/libspl/assert.c
@@ -27,6 +27,7 @@
*/
#include <assert.h>
+#include <pthread.h>
#if defined(__linux__)
#include <errno.h>
@@ -56,11 +57,15 @@ libspl_set_assert_ok(boolean_t val)
libspl_assert_ok = val;
}
+static pthread_mutex_t assert_lock = PTHREAD_MUTEX_INITIALIZER;
+
/* printf version of libspl_assert */
void
libspl_assertf(const char *file, const char *func, int line,
const char *format, ...)
{
+ pthread_mutex_lock(&assert_lock);
+
va_list args;
char tname[64];
@@ -80,6 +85,7 @@ libspl_assertf(const char *file, const char *func, int line,
#if !__has_feature(attribute_analyzer_noreturn) && !defined(__COVERITY__)
if (libspl_assert_ok) {
+ pthread_mutex_unlock(&assert_lock);
return;
}
#endif