| From ad79670d6d1e7ef2aad6935715921e5317cbe618 Mon Sep 17 00:00:00 2001 |
| From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
| Date: Mon, 23 May 2016 22:28:12 +0200 |
| Subject: [PATCH] Improve check for ucontext |
| |
| The ucontext functionality is not available on all CPUs with all C |
| libraries. Instead of making just assumptions based on the CPU |
| architecture, this commit adds the necessary checks in wscript to verify |
| the availability of the ucontext functionality, before using it in |
| dbus/sigsegv.c. |
| |
| This avoids the long list of architecture exclusions, and make it more |
| robust when building jack2 for new CPU architectures. |
| |
| Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
| --- |
| dbus/sigsegv.c | 12 ++++++------ |
| wscript | 16 +++++++++++++++- |
| 2 files changed, 21 insertions(+), 7 deletions(-) |
| |
| diff --git a/dbus/sigsegv.c b/dbus/sigsegv.c |
| index df2c42c..00a62b5 100644 |
| --- a/dbus/sigsegv.c |
| +++ b/dbus/sigsegv.c |
| @@ -106,20 +106,20 @@ static void signal_segv(int signum, siginfo_t* info, void*ptr) { |
| jack_error("info.si_errno = %d", info->si_errno); |
| jack_error("info.si_code = %d (%s)", info->si_code, si_code_str); |
| jack_error("info.si_addr = %p", info->si_addr); |
| -#if !defined(__alpha__) && !defined(__ia64__) && !defined(__FreeBSD_kernel__) && !defined(__arm__) && !defined(__hppa__) && !defined(__sh__) && !defined(__aarch64__) |
| +#if defined(HAVE_UCONTEXT) && defined(HAVE_NGREG) |
| for(i = 0; i < NGREG; i++) |
| jack_error("reg[%02d] = 0x" REGFORMAT, i, |
| -#if defined(__powerpc64__) |
| +#if defined(HAVE_UCONTEXT_GP_REGS) |
| ucontext->uc_mcontext.gp_regs[i] |
| -#elif defined(__powerpc__) |
| +#elif defined(HAVE_UCONTEXT_UC_REGS) |
| ucontext->uc_mcontext.uc_regs[i] |
| -#elif defined(__sparc__) && defined(__arch64__) |
| +#elif defined(HAVE_UCONTEXT_MC_GREGS) |
| ucontext->uc_mcontext.mc_gregs[i] |
| -#else |
| +#elif defined(HAVE_UCONTEXT_GREGS) |
| ucontext->uc_mcontext.gregs[i] |
| #endif |
| ); |
| -#endif /* alpha, ia64, kFreeBSD, arm, hppa */ |
| +#endif /* defined(HAVE_UCONTEXT) && defined(HAVE_NGREG) */ |
| |
| #if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64) |
| # if defined(SIGSEGV_STACK_IA64) |
| diff --git a/wscript b/wscript |
| index 63ba3aa..34a56fc 100644 |
| --- a/wscript |
| +++ b/wscript |
| @@ -168,10 +168,24 @@ def configure(conf): |
| |
| conf.check_cc(header_name='execinfo.h', define_name="HAVE_EXECINFO_H", mandatory=False) |
| conf.check_cc(header_name='samplerate.h', define_name="HAVE_SAMPLERATE") |
| - |
| if conf.is_defined('HAVE_SAMPLERATE'): |
| conf.env['LIB_SAMPLERATE'] = ['samplerate'] |
| |
| + # test for the availability of ucontext, and how it should be used |
| + for t in ("gp_regs", "uc_regs", "mc_gregs", "gregs"): |
| + fragment = "#include <ucontext.h>\n" |
| + fragment += "int main() { ucontext_t *ucontext; return (int) ucontext->uc_mcontext.%s[0]; }" % t |
| + confvar = "HAVE_UCONTEXT_%s" % t.upper() |
| + conf.check_cc(fragment=fragment, define_name=confvar, mandatory=False, |
| + msg="Checking for ucontext->uc_mcontext.%s" % t) |
| + if conf.is_defined(confvar): |
| + conf.define('HAVE_UCONTEXT', 1) |
| + |
| + fragment = "#include <ucontext.h>\n" |
| + fragment += "int main() { return NGREG; }" |
| + conf.check_cc(fragment=fragment, define_name="HAVE_NGREG", mandatory=False, |
| + msg="Checking for NGREG") |
| + |
| conf.sub_config('example-clients') |
| |
| if conf.check_cfg(package='celt', atleast_version='0.11.0', args='--cflags --libs', mandatory=False): |
| -- |
| 2.7.4 |
| |