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.
This commit is contained in:
parent
a0e02f5d52
commit
ae5aa47370
@ -258,6 +258,9 @@ AC_CHECK_TYPES([struct user_desc],,, [#include <asm/ldt.h>])
|
||||
|
||||
AC_CHECK_MEMBERS([struct utsname.domainname],,, [#include <sys/utsname.h>])
|
||||
|
||||
AC_CHECK_MEMBERS([struct sigevent._sigev_un._pad,
|
||||
struct sigevent.__pad],,, [#include <signal.h>])
|
||||
|
||||
AC_CHECK_DECLS([sys_errlist])
|
||||
AC_CHECK_DECLS([sys_siglist, _sys_siglist],,, [#include <signal.h>])
|
||||
AC_CHECK_DECLS(m4_normalize([
|
||||
|
7
time.c
7
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);
|
||||
|
Loading…
Reference in New Issue
Block a user