[PATCH 05/12] util: add API to fetch the current thread id

Daniel P. Berrangé via Devel posted 12 patches 2 weeks, 5 days ago
There is a newer version of this series
[PATCH 05/12] util: add API to fetch the current thread id
Posted by Daniel P. Berrangé 2 weeks, 5 days ago
For logging it is useful to include the current thread id. On
POSIX there is no standard API for this, so try the Linux gettid()
syscall preferentially, otherwise fallback to casting the result
of thread_self() to an integer.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 include/qemu/thread.h    |  1 +
 util/qemu-thread-posix.c | 11 +++++++++++
 util/qemu-thread-win32.c |  5 +++++
 3 files changed, 17 insertions(+)

diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index 3a286bb3ef..96eee82679 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -215,6 +215,7 @@ void *qemu_thread_join(QemuThread *thread);
 void qemu_thread_get_self(QemuThread *thread);
 bool qemu_thread_is_self(QemuThread *thread);
 G_NORETURN void qemu_thread_exit(void *retval);
+uint64_t qemu_thread_get_id(void);
 
 struct Notifier;
 /**
diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
index 121d7ed69b..f240a93632 100644
--- a/util/qemu-thread-posix.c
+++ b/util/qemu-thread-posix.c
@@ -532,3 +532,14 @@ void *qemu_thread_join(QemuThread *thread)
     }
     return ret;
 }
+
+uint64_t qemu_thread_get_id(void)
+{
+#ifdef CONFIG_GETTID
+    return (uint64_t)gettid();
+#elif defined(SYS_gettid)
+    return (uint64_t)syscall(SYS_gettid);
+#else
+    return (uint64_t)pthread_self();
+#endif
+}
diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c
index 5e6ca0c12f..f6956717b2 100644
--- a/util/qemu-thread-win32.c
+++ b/util/qemu-thread-win32.c
@@ -412,3 +412,8 @@ bool qemu_thread_is_self(QemuThread *thread)
 {
     return GetCurrentThreadId() == thread->tid;
 }
+
+uint64_t qemu_thread_get_id(void)
+{
+    return (uint64_t)GetCurrentThreadId();
+}
-- 
2.50.1


Re: [PATCH 05/12] util: add API to fetch the current thread id
Posted by Dr. David Alan Gilbert 2 weeks, 5 days ago
* Daniel P. Berrangé (berrange@redhat.com) wrote:
> For logging it is useful to include the current thread id. On
> POSIX there is no standard API for this, so try the Linux gettid()
> syscall preferentially, otherwise fallback to casting the result
> of thread_self() to an integer.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>  include/qemu/thread.h    |  1 +
>  util/qemu-thread-posix.c | 11 +++++++++++
>  util/qemu-thread-win32.c |  5 +++++
>  3 files changed, 17 insertions(+)
> 
> diff --git a/include/qemu/thread.h b/include/qemu/thread.h
> index 3a286bb3ef..96eee82679 100644
> --- a/include/qemu/thread.h
> +++ b/include/qemu/thread.h
> @@ -215,6 +215,7 @@ void *qemu_thread_join(QemuThread *thread);
>  void qemu_thread_get_self(QemuThread *thread);
>  bool qemu_thread_is_self(QemuThread *thread);
>  G_NORETURN void qemu_thread_exit(void *retval);
> +uint64_t qemu_thread_get_id(void);
>  
>  struct Notifier;
>  /**
> diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
> index 121d7ed69b..f240a93632 100644
> --- a/util/qemu-thread-posix.c
> +++ b/util/qemu-thread-posix.c
> @@ -532,3 +532,14 @@ void *qemu_thread_join(QemuThread *thread)
>      }
>      return ret;
>  }
> +
> +uint64_t qemu_thread_get_id(void)
> +{
> +#ifdef CONFIG_GETTID
> +    return (uint64_t)gettid();
> +#elif defined(SYS_gettid)
> +    return (uint64_t)syscall(SYS_gettid);
> +#else
> +    return (uint64_t)pthread_self();

My reading of the manpage is that is not guaranteed to be castable.
It also explicitly says it's not the same as gettid.  Albeit probably is.

Dave

> +#endif
> +}
> diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c
> index 5e6ca0c12f..f6956717b2 100644
> --- a/util/qemu-thread-win32.c
> +++ b/util/qemu-thread-win32.c
> @@ -412,3 +412,8 @@ bool qemu_thread_is_self(QemuThread *thread)
>  {
>      return GetCurrentThreadId() == thread->tid;
>  }
> +
> +uint64_t qemu_thread_get_id(void)
> +{
> +    return (uint64_t)GetCurrentThreadId();
> +}
> -- 
> 2.50.1
> 
-- 
 -----Open up your eyes, open up your mind, open up your code -------   
/ Dr. David Alan Gilbert    |       Running GNU/Linux       | Happy  \ 
\        dave @ treblig.org |                               | In Hex /
 \ _________________________|_____ http://www.treblig.org   |_______/
Re: [PATCH 05/12] util: add API to fetch the current thread id
Posted by Daniel P. Berrangé 2 weeks, 4 days ago
On Tue, Aug 19, 2025 at 11:35:26PM +0000, Dr. David Alan Gilbert wrote:
> * Daniel P. Berrangé (berrange@redhat.com) wrote:
> > For logging it is useful to include the current thread id. On
> > POSIX there is no standard API for this, so try the Linux gettid()
> > syscall preferentially, otherwise fallback to casting the result
> > of thread_self() to an integer.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >  include/qemu/thread.h    |  1 +
> >  util/qemu-thread-posix.c | 11 +++++++++++
> >  util/qemu-thread-win32.c |  5 +++++
> >  3 files changed, 17 insertions(+)
> > 
> > diff --git a/include/qemu/thread.h b/include/qemu/thread.h
> > index 3a286bb3ef..96eee82679 100644
> > --- a/include/qemu/thread.h
> > +++ b/include/qemu/thread.h
> > @@ -215,6 +215,7 @@ void *qemu_thread_join(QemuThread *thread);
> >  void qemu_thread_get_self(QemuThread *thread);
> >  bool qemu_thread_is_self(QemuThread *thread);
> >  G_NORETURN void qemu_thread_exit(void *retval);
> > +uint64_t qemu_thread_get_id(void);
> >  
> >  struct Notifier;
> >  /**
> > diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
> > index 121d7ed69b..f240a93632 100644
> > --- a/util/qemu-thread-posix.c
> > +++ b/util/qemu-thread-posix.c
> > @@ -532,3 +532,14 @@ void *qemu_thread_join(QemuThread *thread)
> >      }
> >      return ret;
> >  }
> > +
> > +uint64_t qemu_thread_get_id(void)
> > +{
> > +#ifdef CONFIG_GETTID
> > +    return (uint64_t)gettid();
> > +#elif defined(SYS_gettid)
> > +    return (uint64_t)syscall(SYS_gettid);
> > +#else
> > +    return (uint64_t)pthread_self();
> 
> My reading of the manpage is that is not guaranteed to be castable.
> It also explicitly says it's not the same as gettid.  Albeit probably is.

Yeah, technically pthread_t could be a struct. Guess it depends how much
we care about strict standards portability, vs portability to our tested
set of platforms (macOS, *BSD)[1]. We could hardcode to 0 as an alternative.

With regards,
Daniel

[1] admittedly i've not actually compile tested this yet on non-Linux,
    aside from Windows which uses the non-pthreads code.
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Re: [PATCH 05/12] util: add API to fetch the current thread id
Posted by Richard Henderson 2 weeks, 5 days ago
On 8/20/25 06:27, Daniel P. Berrangé wrote:
> +uint64_t qemu_thread_get_id(void)
> +{
> +#ifdef CONFIG_GETTID
> +    return (uint64_t)gettid();
> +#elif defined(SYS_gettid)
> +    return (uint64_t)syscall(SYS_gettid);

No cast required here; extension to uint64_t will happen automatically.

> +#else
> +    return (uint64_t)pthread_self();

Incorrect cast here: you want uintptr_t.


r~