From ae5aa47370455123bf84e52dd8354d26c29efea8 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Mon, 11 Nov 2013 23:54:30 +0000 Subject: [PATCH] Make SIGEV_THREAD_ID decoding less glibc specific SIGEV_THREAD_ID decoding requires access to an internal member of struct sigevent. There seems to be no portable way to do it besides adding a configure check. * configure.ac (AC_CHECK_MEMBERS): Check for struct sigevent._sigev_un._pad and struct sigevent.__pad. * time.c (printsigevent): Use an appropriate struct sigevent member to print thread id. Reported by John Spencer. --- configure.ac | 3 +++ time.c | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/configure.ac b/configure.ac index a2cc89b0..a60b25f2 100644 --- a/configure.ac +++ b/configure.ac @@ -258,6 +258,9 @@ AC_CHECK_TYPES([struct user_desc],,, [#include ]) AC_CHECK_MEMBERS([struct utsname.domainname],,, [#include ]) +AC_CHECK_MEMBERS([struct sigevent._sigev_un._pad, + struct sigevent.__pad],,, [#include ]) + AC_CHECK_DECLS([sys_errlist]) AC_CHECK_DECLS([sys_siglist, _sys_siglist],,, [#include ]) AC_CHECK_DECLS(m4_normalize([ diff --git a/time.c b/time.c index 49ebcea0..23642812 100644 --- a/time.c +++ b/time.c @@ -781,10 +781,17 @@ printsigevent(struct tcb *tcp, long arg) printxval(sigev_value, sev.sigev_notify+1, "SIGEV_???"); tprints(", "); if (sev.sigev_notify == SIGEV_THREAD_ID) +#if defined(HAVE_STRUCT_SIGEVENT__SIGEV_UN__PAD) /* _pad[0] is the _tid field which might not be present in the userlevel definition of the struct. */ tprintf("{%d}", sev._sigev_un._pad[0]); +#elif defined(HAVE_STRUCT_SIGEVENT___PAD) + tprintf("{%d}", sev.__pad[0]); +#else +# warning unfamiliar struct sigevent => incomplete SIGEV_THREAD_ID decoding + tprints("{...}"); +#endif else if (sev.sigev_notify == SIGEV_THREAD) tprintf("{%p, %p}", sev.sigev_notify_function, sev.sigev_notify_attributes); -- 2.40.0