From 3262f111028093ed31da3fe9e3ed7efcc0e8b769 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Fri, 1 Apr 2011 16:37:32 +0100 Subject: [PATCH] Linux: Fix USE_UCONTEXT detection On Linux, afs/param.h determines whether to use the ucontext() function based on the glibc version. However, the glibc version macros aren't available until a C library header has been included. There have been a couple of attempts to fix this. The first included afs_sysnames.h before the C library check, but this wasn't sufficient to pull in a header for all builds. The second included stdio.h before including afs/param.h in process.c. Whilst the second approach works, it has the drawback that it breaks our convention that afsconfig.h and afs/param.h must always be the first includes in a file. More seriously, it means that the behaviour of afs/param.h is different depending on where it appears in the include order - which is especially dangerous for 3rd party user. So, this patch tries to resolve all of this by explicitly including features.h before doing the glibc version checks. The only danger I can see here is that Linux platforms without glibc may lack a features.h, but I suspect we have trouble building on such platforms in any case. Reviewed-on: http://gerrit.openafs.org/4389 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit f5f0ce525a63264098cd0625769d642fe6f106ba) Change-Id: Ia94487f35ad0fc3143faafd2fa12a6c71d40f116 Reviewed-on: http://gerrit.openafs.org/6278 Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear --- src/config/param.linux24.h | 7 +++++-- src/config/param.linux26.h | 7 +++++-- src/lwp/process.c | 7 +------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/config/param.linux24.h b/src/config/param.linux24.h index 9f81afb08..19839b2b1 100644 --- a/src/config/param.linux24.h +++ b/src/config/param.linux24.h @@ -114,8 +114,9 @@ #endif /* !defined(UKERNEL) */ -/* needed so glibc version will be defined */ -#include +#if defined(UKERNEL) || !defined(KERNEL) +#include +#endif #ifdef __GLIBC__ #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3) @@ -123,4 +124,6 @@ #endif #endif +#include + #endif /* AFS_PARAM_COMMON_H */ diff --git a/src/config/param.linux26.h b/src/config/param.linux26.h index aba4a9843..8f6382be4 100644 --- a/src/config/param.linux26.h +++ b/src/config/param.linux26.h @@ -95,8 +95,9 @@ #endif /* !defined(UKERNEL) */ -/* needed so glibc version will be defined */ -#include +#if defined(UKERNEL) || !defined(KERNEL) +#include +#endif #ifdef __GLIBC__ #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3) @@ -104,4 +105,6 @@ #endif #endif +#include + #endif /* AFS_PARAM_COMMON_H */ diff --git a/src/lwp/process.c b/src/lwp/process.c index 06efcfb3c..bd18de6e0 100644 --- a/src/lwp/process.c +++ b/src/lwp/process.c @@ -10,19 +10,14 @@ /* process.c - manage lwp context switches be means of setjmp/longjmp. */ #include +#include -/* - * We must include at least one system header on Linux prior to including - * afs/param.h, or the __GLIBC__ and __GLIBC_MINOR__ macros will not yet be - * defined and we won't know whether we're using ucontext. - */ #include #include #ifdef HAVE_STDLIB_H # include #endif -#include #include "lwp.h" -- 2.39.5