From 59a1aff0fbe12fa74b7d0b9fb46492fa7a822acc Mon Sep 17 00:00:00 2001 From: mquinson Date: Thu, 3 Mar 2005 21:57:16 +0000 Subject: [PATCH] test whether ucontext actually work, not only whether they're here git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1141 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- acmacro/context.m4 | 18 ++++++++++++++++++ configure.ac | 42 +++++++++++++++++++++++++----------------- include/xbt/sysdep.h | 16 ++++++++++++---- src/portable.h | 2 +- src/xbt/context.c | 2 +- 5 files changed, 57 insertions(+), 23 deletions(-) create mode 100644 acmacro/context.m4 diff --git a/acmacro/context.m4 b/acmacro/context.m4 new file mode 100644 index 0000000000..d0836c1e4e --- /dev/null +++ b/acmacro/context.m4 @@ -0,0 +1,18 @@ +dnl AC_CHECK_UCONTEXT: Check whether ucontext are working + +dnl it uses AC_RUN and assume the worse while cross-compiling + +AC_DEFUN([AC_CHECK_UCONTEXT], + [ +AC_MSG_CHECKING([whether ucontext'es exist and are usable...]) +AC_RUN_IFELSE(AC_LANG_PROGRAM([#include ], + [ucontext_t uc; + if (getcontext (&uc) != 0) return -1; + ]), + AC_MSG_RESULT(yes) + ac_check_ucontext=yes, + AC_MSG_RESULT(no) + ac_check_ucontext=no, + AC_MSG_RESULT(assuming the worse in cross-compilation) + ac_check_ucontext=no) +]) diff --git a/configure.ac b/configure.ac index 8e9d8bc121..bd78f56659 100644 --- a/configure.ac +++ b/configure.ac @@ -53,36 +53,44 @@ GRAS_ARCH # Check architecture signature end GRAS_CHECK_STRUCT_COMPACTION -AC_ARG_ENABLE(context, - [ --enable-context=[ucontext/pthread] Use either (System V) swapcontext or pthread [[default=pthread]].],, - enable_context=pthread) + +AC_CHECK_UCONTEXT AC_MSG_CHECKING(on top of what can we build the contexts) -if test "x$enable_context" = "xucontext"; then - AC_CHECK_HEADERS([ucontext.h]) - ac_header=ucontext.h - as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` - if test `eval echo '${'$as_ac_Header'}'` = yes; then +AC_ARG_WITH(context, + [ --with-context=[ucontext/pthread] Use either (System V) swapcontext or pthread [[default=auto]].],, + with_context=auto) + +case $with_context in + ucontext) ;; + pthread) ;; + auto) with_context=ucontext;; + *) AC_MSG_ERROR("--with-context must be either ucontext or pthread") ;; +esac + +if test "x$with_context" = "xucontext" ; then + if test "x$ac_check_ucontext" = "xyes"; then AC_MSG_RESULT(found ucontext.h. Great!) + AC_DEFINE([USE_UCONTEXT],1,[Define if we use ucontext or not]) else ac_header=windows.h as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if test `eval echo '${'$as_ac_Header'}'` = yes; then - AC_MSG_RESULT(you don't have ucontext.h but we provide an alternative for windows so you should be fine.") + AC_MSG_RESULT(there is no ucontext on windows, and none is needed.") else - AC_MSG_RESULT([[cannot find ucontext. I'm going to try as if you had set --enable-context=pthreads !]]) - enable_context=pthreads + AC_MSG_RESULT([[no working ucontext found. Falling back to pthreads]]) + with_context=pthreads fi fi -else if test "x$enable_context" = "xpthread"; then +fi + +if test "x$with_context" = "xpthread"; then AC_CHECK_HEADERS([pthread.h]) dnl A C_CHECK_LIB(pthread, pthread_mutex_lock, LIBS="$LIBS -lpthread") AC_CHECK_LIB(pthread,pthread_create,, - [AC_MSG_ERROR([[Cannot find pthreads, no way (try --enable-context=ucontext if you haven't already tried).]])]) - AC_DEFINE([USE_PTHREADS],1,[Define if we USE pthreads or not]) + [AC_MSG_ERROR([[Cannot find pthreads, no way (try --with-context=ucontext if you haven't already tried).]])]) + AC_DEFINE([USE_PTHREADS],1,[Define if we use pthreads or not]) AC_MSG_RESULT(You have pthreads. Let's use them.) -else - AC_MSG_ERROR("--enable-context must be either ucontext or pthread") -fi fi +fi ######################################### ## Check for libraries extra-dependencies diff --git a/include/xbt/sysdep.h b/include/xbt/sysdep.h index 4f6573608a..b405a7afd2 100644 --- a/include/xbt/sysdep.h +++ b/include/xbt/sysdep.h @@ -22,8 +22,9 @@ BEGIN_DECL() * @{ */ +#ifdef __GNUC__ /** @brief like strdup, but xbt_die() on error */ -static __inline__ char *xbt_strdup(const char *s) { +static inline char *xbt_strdup(const char *s) { char *res = NULL; if (s) { res=strdup(s); @@ -34,7 +35,7 @@ static __inline__ char *xbt_strdup(const char *s) { } /** @brief like malloc, but xbt_die() on error @hideinitializer */ -static __inline__ void *xbt_malloc(int n){ +static inline void *xbt_malloc(int n){ void *res=malloc(n); if (!res) xbt_die("Memory allocation failed"); @@ -43,7 +44,7 @@ static __inline__ void *xbt_malloc(int n){ /** @brief like malloc, but xbt_die() on error and memset data to 0 @hideinitializer */ -static __inline__ void *xbt_malloc0(int n) { +static inline void *xbt_malloc0(int n) { void *res=calloc(n,1); if (!res) xbt_die("Memory callocation failed"); @@ -52,7 +53,7 @@ static __inline__ void *xbt_malloc0(int n) { /** @brief like realloc, but xbt_die() on error @hideinitializer */ -static __inline__ void *xbt_realloc(void*p,int s){ +static inline void *xbt_realloc(void*p,int s){ void *res=res; if (s) { if (p) { @@ -69,6 +70,13 @@ static __inline__ void *xbt_realloc(void*p,int s){ } return res; } +#else /* non __GNUC__ */ +# define xbt_strdup(s) strdup(s) +# define xbt_malloc(n) malloc(n) +# define xbt_malloc0(n) calloc(n,1) +# define xbt_realloc(p,s) realloc(p,s) +#endif /* __GNUC__ ? */ + /** @brief like free @hideinitializer */ #define xbt_free free /*nothing specific to do here. A poor valgrind replacement?*/ diff --git a/src/portable.h b/src/portable.h index bd7c397e03..af3342febd 100644 --- a/src/portable.h +++ b/src/portable.h @@ -121,7 +121,7 @@ const char *gras_wsa_err2string(int errcode); **** Contexts ****/ -#ifdef HAVE_UCONTEXT_H +#ifdef USE_UCONTEXT # ifndef S_SPLINT_S /* This header drives splint into the wall */ # include # endif diff --git a/src/xbt/context.c b/src/xbt/context.c index bc16f82279..5ab348db85 100644 --- a/src/xbt/context.c +++ b/src/xbt/context.c @@ -25,7 +25,7 @@ static xbt_swag_t context_to_destroy = NULL; static xbt_swag_t context_living = NULL; #ifndef USE_PTHREADS /* USE_PTHREADS and USE_CONTEXT are exclusive */ -# ifndef HAVE_UCONTEXT_H +# ifndef USE_UCONTEXT /* don't want to play with conditional compilation in automake tonight, sorry. include directly the c file from here when needed. */ # include "context_win32.c" -- 2.20.1