diff options
-rw-r--r-- | config/user.m4 | 2 | ||||
-rw-r--r-- | lib/libspl/assert.c | 36 |
2 files changed, 35 insertions, 3 deletions
diff --git a/config/user.m4 b/config/user.m4 index 87df8c7cc..3a69086a9 100644 --- a/config/user.m4 +++ b/config/user.m4 @@ -31,7 +31,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [ ZFS_AC_CONFIG_USER_MAKEDEV_IN_MKDEV ZFS_AC_CONFIG_USER_ZFSEXEC - AC_CHECK_FUNCS([execvpe issetugid mlockall strlcat strlcpy]) + AC_CHECK_FUNCS([execvpe issetugid mlockall strlcat strlcpy gettid]) AC_SUBST(RM) ]) diff --git a/lib/libspl/assert.c b/lib/libspl/assert.c index 9d44740d4..185ec65cb 100644 --- a/lib/libspl/assert.c +++ b/lib/libspl/assert.c @@ -22,9 +22,32 @@ * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* + * Copyright (c) 2024, Rob Norris <[email protected]> + */ #include <assert.h> +#if defined(__linux__) +#include <errno.h> +#include <sys/prctl.h> +#ifdef HAVE_GETTID +#define libspl_gettid() gettid() +#else +#include <sys/syscall.h> +#define libspl_gettid() ((pid_t)syscall(__NR_gettid)) +#endif +#define libspl_getprogname() (program_invocation_short_name) +#define libspl_getthreadname(buf, len) \ + prctl(PR_GET_NAME, (unsigned long)(buf), 0, 0, 0) +#elif defined(__FreeBSD__) +#include <pthread_np.h> +#define libspl_gettid() pthread_getthreadid_np() +#define libspl_getprogname() getprogname() +#define libspl_getthreadname(buf, len) \ + pthread_getname_np(pthread_self(), buf, len); +#endif + static boolean_t libspl_assert_ok = B_FALSE; void @@ -39,13 +62,22 @@ libspl_assertf(const char *file, const char *func, int line, const char *format, ...) { va_list args; + char tname[64]; + + libspl_getthreadname(tname, sizeof (tname)); + + fprintf(stderr, "ASSERT at %s:%d:%s()\n", file, line, func); va_start(args, format); vfprintf(stderr, format, args); - fprintf(stderr, "\n"); - fprintf(stderr, "ASSERT at %s:%d:%s()", file, line, func); va_end(args); + fprintf(stderr, "\n" + " PID: %-8u COMM: %s\n" + " TID: %-8u NAME: %s\n", + getpid(), libspl_getprogname(), + libspl_gettid(), tname); + #if !__has_feature(attribute_analyzer_noreturn) && !defined(__COVERITY__) if (libspl_assert_ok) { return; |