From: "Darrick J. Wong" <djwong@kernel.org>
To: Theodore Ts'o <tytso@mit.edu>
Cc: Ext4 Developers List <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH 2/3] libsupport: add a portable get_thread_id() function
Date: Thu, 2 Apr 2026 21:17:52 -0700 [thread overview]
Message-ID: <20260403041752.GE6254@frogsfrogsfrogs> (raw)
In-Reply-To: <20260403040328.2385083-3-tytso@mit.edu>
On Fri, Apr 03, 2026 at 12:03:27AM -0400, Theodore Ts'o wrote:
> The gettid() system call is only available on Linux. So create a new
> function, get_thread_id() which implements a number of different ways
> of providing a thread id as an integer.
>
> Use get_thread_id() instead of gettid() in fuse2fs.
>
> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
> ---
> configure | 12 ++++++++++++
> configure.ac | 2 ++
> lib/config.h.in | 6 ++++++
> lib/support/Makefile.in | 13 +++++++++++--
> lib/support/thread.c | 36 ++++++++++++++++++++++++++++++++++++
> lib/support/thread.h | 5 +++++
> misc/fuse2fs.c | 3 ++-
> 7 files changed, 74 insertions(+), 3 deletions(-)
> create mode 100644 lib/support/thread.c
> create mode 100644 lib/support/thread.h
>
> diff --git a/configure b/configure
> index b9a82dcec..b04b31aff 100755
> --- a/configure
> +++ b/configure
> @@ -13749,6 +13749,12 @@ if test "x$ac_cv_func_getrusage" = xyes
> then :
> printf "%s\n" "#define HAVE_GETRUSAGE 1" >>confdefs.h
>
> +fi
> +ac_fn_c_check_func "$LINENO" "gettid" "ac_cv_func_gettid"
> +if test "x$ac_cv_func_gettid" = xyes
> +then :
> + printf "%s\n" "#define HAVE_GETTID 1" >>confdefs.h
> +
> fi
> ac_fn_c_check_func "$LINENO" "jrand48" "ac_cv_func_jrand48"
> if test "x$ac_cv_func_jrand48" = xyes
> @@ -13893,6 +13899,12 @@ if test "x$ac_cv_func_pthread_setname_np" = xyes
> then :
> printf "%s\n" "#define HAVE_PTHREAD_SETNAME_NP 1" >>confdefs.h
>
> +fi
> +ac_fn_c_check_func "$LINENO" "pthread_threadid_np" "ac_cv_func_pthread_threadid_np"
> +if test "x$ac_cv_func_pthread_threadid_np" = xyes
> +then :
> + printf "%s\n" "#define HAVE_PTHREAD_THREADID_NP 1" >>confdefs.h
> +
> fi
> ac_fn_c_check_func "$LINENO" "qsort_r" "ac_cv_func_qsort_r"
> if test "x$ac_cv_func_qsort_r" = xyes
> diff --git a/configure.ac b/configure.ac
> index 2473879fd..4921f81f7 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1246,6 +1246,7 @@ AC_CHECK_FUNCS(m4_flatten([
> getrandom
> getrlimit
> getrusage
> + gettid
> jrand48
> keyctl
> llistxattr
> @@ -1270,6 +1271,7 @@ AC_CHECK_FUNCS(m4_flatten([
> pread64
> pwrite64
> pthread_setname_np
> + pthread_threadid_np
> qsort_r
> secure_getenv
> setmntent
> diff --git a/lib/config.h.in b/lib/config.h.in
> index c6cbced5f..f129abfe7 100644
> --- a/lib/config.h.in
> +++ b/lib/config.h.in
> @@ -181,6 +181,9 @@
> /* Define if the GNU gettext() function is already present or preinstalled. */
> #undef HAVE_GETTEXT
>
> +/* Define to 1 if you have the 'gettid' function. */
> +#undef HAVE_GETTID
> +
> /* Define to 1 if you have the GNU-style 'qsort_r' function. */
> #undef HAVE_GNU_QSORT_R
>
> @@ -331,6 +334,9 @@
> /* Define to 1 if you have the 'pthread_setname_np' function. */
> #undef HAVE_PTHREAD_SETNAME_NP
>
> +/* Define to 1 if you have the 'pthread_threadid_np' function. */
> +#undef HAVE_PTHREAD_THREADID_NP
> +
> /* Define to 1 if you have the 'pwrite' function. */
> #undef HAVE_PWRITE
>
> diff --git a/lib/support/Makefile.in b/lib/support/Makefile.in
> index 6383816fd..9aac9cf00 100644
> --- a/lib/support/Makefile.in
> +++ b/lib/support/Makefile.in
> @@ -25,6 +25,7 @@ OBJS= bthread.o \
> quotaio.o \
> quotaio_v2.o \
> quotaio_tree.o \
> + thread.o \
> dict.o \
> devname.o
>
> @@ -41,6 +42,7 @@ SRCS= $(srcdir)/argv_parse.c \
> $(srcdir)/quotaio.c \
> $(srcdir)/quotaio_tree.c \
> $(srcdir)/quotaio_v2.c \
> + $(srcdir)/thread.c \
> $(srcdir)/dict.c \
> $(srcdir)/devname.c
>
> @@ -81,10 +83,15 @@ test_cstring: $(srcdir)/cstring.c
> $(Q) $(CC) -o test_cstring -DDEBUG_PROGRAM $(srcdir)/cstring.c \
> $(ALL_CFLAGS)
>
> +test_thread: $(srcdir)/thread.c
> + $(E) " CC $@"
> + $(Q) $(CC) -o test_thread -DDEBUG_PROGRAM $(srcdir)/thread.c \
> + $(ALL_CFLAGS)
> +
> clean::
> $(RM) -f \#* *.s *.o *.a *~ *.bak core profiled/* \
> ../libsupport.a ../libsupport_p.a $(SMANPAGES) \
> - prof_err.c prof_err.h test_profile test_cstring
> + prof_err.c prof_err.h test_profile test_cstring test_thread
>
> #fullcheck check:: tst_uuid
> # LD_LIBRARY_PATH=$(LIB) DYLD_LIBRARY_PATH=$(LIB) ./tst_uuid
> @@ -111,7 +118,7 @@ $(OBJS):
> argv_parse.o: $(srcdir)/argv_parse.c $(top_builddir)/lib/config.h \
> $(top_builddir)/lib/dirpaths.h $(srcdir)/argv_parse.h
> bthread.o: $(srcdir)/bthread.c $(top_builddir)/lib/config.h \
> - $(srcdir)/bthread.h
> + $(top_builddir)/lib/dirpaths.h $(srcdir)/bthread.h
> cstring.o: $(srcdir)/cstring.c $(top_builddir)/lib/config.h \
> $(top_builddir)/lib/dirpaths.h $(srcdir)/cstring.h
> mkquota.o: $(srcdir)/mkquota.c $(top_builddir)/lib/config.h \
> @@ -183,6 +190,8 @@ quotaio_v2.o: $(srcdir)/quotaio_v2.c $(top_builddir)/lib/config.h \
> $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/hashmap.h \
> $(top_srcdir)/lib/ext2fs/bitops.h $(srcdir)/dqblk_v2.h \
> $(srcdir)/quotaio_tree.h
> +thread.o: $(srcdir)/thread.c $(top_builddir)/lib/config.h \
> + $(top_builddir)/lib/dirpaths.h $(srcdir)/thread.h
> dict.o: $(srcdir)/dict.c $(top_builddir)/lib/config.h \
> $(top_builddir)/lib/dirpaths.h $(srcdir)/dict.h
> devname.o: $(srcdir)/devname.c $(top_builddir)/lib/config.h \
> diff --git a/lib/support/thread.c b/lib/support/thread.c
> new file mode 100644
> index 000000000..a9a10940c
> --- /dev/null
> +++ b/lib/support/thread.c
> @@ -0,0 +1,36 @@
> +/*
> + * thread.c - utility functions for Posix threads
Should these new files have an explicit license specification?
Other than that,
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> + */
> +
> +#include "config.h"
> +#ifdef HAVE_PTHREAD
> +#include <pthread.h>
> +#endif
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +
> +#include "support/thread.h"
> +
> +uint64_t get_thread_id(void)
> +{
> +#if defined(HAVE_GETTID)
> + return gettid();
> +#elif defined(HAVE_PTHREAD_THREADID_NP)
> + uint64_t tid;
> +
> + if (pthread_threadid_np(NULL, &tid))
> + return tid;
> +#elif defined(HAVE_PTHREAD)
> + return (__u64)(uintptr_t) pthread_self();
> +#endif
> + return getpid();
> +}
> +
> +#ifdef DEBUG_PROGRAM
> +int main(int argc, char **argv)
> +{
> + printf("Thread id: %llu\n", get_thread_id());
> + return 0;
> +}
> +#endif
> diff --git a/lib/support/thread.h b/lib/support/thread.h
> new file mode 100644
> index 000000000..9a7f5c9db
> --- /dev/null
> +++ b/lib/support/thread.h
> @@ -0,0 +1,5 @@
> +/*
> + * thread.h -- header file for thread utilities
> + */
> +
> +uint64_t get_thread_id(void);
> diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
> index 0b43ec0fb..dfbc98636 100644
> --- a/misc/fuse2fs.c
> +++ b/misc/fuse2fs.c
> @@ -48,6 +48,7 @@
> #include "ext2fs/ext2_fs.h"
> #include "ext2fs/ext2fsP.h"
> #include "support/bthread.h"
> +#include "support/thread.h"
> #if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 0)
> # define FUSE_PLATFORM_OPTS ""
> #else
> @@ -148,7 +149,7 @@ static inline uint64_t round_down(uint64_t b, unsigned int align)
>
> #define dbg_printf(fuse2fs, format, ...) \
> while ((fuse2fs)->debug) { \
> - printf("FUSE2FS (%s): tid=%d " format, (fuse2fs)->shortdev, gettid(), ##__VA_ARGS__); \
> + printf("FUSE2FS (%s): tid=%llu " format, (fuse2fs)->shortdev, get_thread_id(), ##__VA_ARGS__); \
> fflush(stdout); \
> break; \
> }
> --
> 2.51.0
>
next prev parent reply other threads:[~2026-04-03 4:17 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-03 4:03 [PATCH -e2fsprogs 0/3] Fix portability issues on MacOS Theodore Ts'o
2026-04-03 4:03 ` [PATCH 1/3] libsupport: fix portability issues with the bthread.c Theodore Ts'o
2026-04-03 4:16 ` Darrick J. Wong
2026-04-03 11:53 ` Theodore Tso
2026-04-03 15:15 ` Darrick J. Wong
2026-04-03 21:00 ` Theodore Tso
2026-04-03 4:03 ` [PATCH 2/3] libsupport: add a portable get_thread_id() function Theodore Ts'o
2026-04-03 4:17 ` Darrick J. Wong [this message]
2026-04-03 4:03 ` [PATCH 3/3] fuse2fs: fix build failure on systems which don't define EUCLEAN Theodore Ts'o
2026-04-03 4:18 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260403041752.GE6254@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.