Commit 5c312079 authored by Dr. David Alan Gilbert's avatar Dr. David Alan Gilbert Committed by Michael S. Tsirkin

Detect pthread_setname_np at configure time

Warn if no way of setting thread name is available.
Signed-off-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent f7bc8ef8
...@@ -2696,6 +2696,24 @@ if test "$mingw32" != yes -a "$pthread" = no; then ...@@ -2696,6 +2696,24 @@ if test "$mingw32" != yes -a "$pthread" = no; then
"Make sure to have the pthread libs and headers installed." "Make sure to have the pthread libs and headers installed."
fi fi
# check for pthread_setname_np
pthread_setname_np=no
cat > $TMPC << EOF
#include <pthread.h>
static void *f(void *p) { return NULL; }
int main(void)
{
pthread_t thread;
pthread_create(&thread, 0, f, 0);
pthread_setname_np(thread, "QEMU");
return 0;
}
EOF
if compile_prog "" "$pthread_lib" ; then
pthread_setname_np=yes
fi
########################################## ##########################################
# rbd probe # rbd probe
if test "$rbd" != "no" ; then if test "$rbd" != "no" ; then
...@@ -4628,6 +4646,16 @@ if test "$rdma" = "yes" ; then ...@@ -4628,6 +4646,16 @@ if test "$rdma" = "yes" ; then
echo "CONFIG_RDMA=y" >> $config_host_mak echo "CONFIG_RDMA=y" >> $config_host_mak
fi fi
# Hold two types of flag:
# CONFIG_THREAD_SETNAME_BYTHREAD - we've got a way of setting the name on
# a thread we have a handle to
# CONFIG_PTHREAD_SETNAME_NP - A way of doing it on a particular
# platform
if test "$pthread_setname_np" = "yes" ; then
echo "CONFIG_THREAD_SETNAME_BYTHREAD=y" >> $config_host_mak
echo "CONFIG_PTHREAD_SETNAME_NP=y" >> $config_host_mak
fi
if test "$tcg_interpreter" = "yes"; then if test "$tcg_interpreter" = "yes"; then
QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES" QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/tci $QEMU_INCLUDES"
elif test "$ARCH" = "sparc64" ; then elif test "$ARCH" = "sparc64" ; then
......
...@@ -32,6 +32,13 @@ static bool name_threads; ...@@ -32,6 +32,13 @@ static bool name_threads;
void qemu_thread_naming(bool enable) void qemu_thread_naming(bool enable)
{ {
name_threads = enable; name_threads = enable;
#ifndef CONFIG_THREAD_SETNAME_BYTHREAD
/* This is a debugging option, not fatal */
if (enable) {
fprintf(stderr, "qemu: thread naming not supported on this host\n");
}
#endif
} }
static void error_exit(int err, const char *msg) static void error_exit(int err, const char *msg)
...@@ -394,6 +401,16 @@ void qemu_event_wait(QemuEvent *ev) ...@@ -394,6 +401,16 @@ void qemu_event_wait(QemuEvent *ev)
} }
} }
/* Attempt to set the threads name; note that this is for debug, so
* we're not going to fail if we can't set it.
*/
static void qemu_thread_set_name(QemuThread *thread, const char *name)
{
#ifdef CONFIG_PTHREAD_SETNAME_NP
pthread_setname_np(thread->thread, name);
#endif
}
void qemu_thread_create(QemuThread *thread, const char *name, void qemu_thread_create(QemuThread *thread, const char *name,
void *(*start_routine)(void*), void *(*start_routine)(void*),
void *arg, int mode) void *arg, int mode)
...@@ -420,11 +437,9 @@ void qemu_thread_create(QemuThread *thread, const char *name, ...@@ -420,11 +437,9 @@ void qemu_thread_create(QemuThread *thread, const char *name,
if (err) if (err)
error_exit(err, __func__); error_exit(err, __func__);
#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12))
if (name_threads) { if (name_threads) {
pthread_setname_np(thread->thread, name); qemu_thread_set_name(thread, name);
} }
#endif
pthread_sigmask(SIG_SETMASK, &oldset, NULL); pthread_sigmask(SIG_SETMASK, &oldset, NULL);
......
...@@ -22,6 +22,8 @@ void qemu_thread_naming(bool enable) ...@@ -22,6 +22,8 @@ void qemu_thread_naming(bool enable)
{ {
/* But note we don't actually name them on Windows yet */ /* But note we don't actually name them on Windows yet */
name_threads = enable; name_threads = enable;
fprintf(stderr, "qemu: thread naming not supported on this host\n");
} }
static void error_exit(int err, const char *msg) static void error_exit(int err, const char *msg)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment