Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
test whether ucontext actually work, not only whether they're here
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 3 Mar 2005 21:57:16 +0000 (21:57 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 3 Mar 2005 21:57:16 +0000 (21:57 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1141 48e7efb5-ca39-0410-a469-dd3cf9ba447f

acmacro/context.m4 [new file with mode: 0644]
configure.ac
include/xbt/sysdep.h
src/portable.h
src/xbt/context.c

diff --git a/acmacro/context.m4 b/acmacro/context.m4
new file mode 100644 (file)
index 0000000..d0836c1
--- /dev/null
@@ -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.h>],
+                              [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)
+])
index 8e9d8bc..bd78f56 100644 (file)
@@ -53,36 +53,44 @@ GRAS_ARCH
 # Check architecture signature end
 GRAS_CHECK_STRUCT_COMPACTION
 
 # 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)
 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_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
   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
     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
     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_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.)
   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
 
 #########################################
 ## Check for libraries extra-dependencies
index 4f65736..b405a7a 100644 (file)
@@ -22,8 +22,9 @@ BEGIN_DECL()
  *  @{
  */
 
  *  @{
  */
 
+#ifdef __GNUC__
 /** @brief like strdup, but xbt_die() on error */
 /** @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);
   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 */
 }
 /** @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");
   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 */
 
 /** @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");
   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 */
   
 /** @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) {
   void *res=res;
   if (s) {
     if (p) {
@@ -69,6 +70,13 @@ static __inline__ void *xbt_realloc(void*p,int s){
   }
   return res;
 }
   }
   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?*/
 /** @brief like free
     @hideinitializer */
 #define xbt_free free /*nothing specific to do here. A poor valgrind replacement?*/
index bd7c397..af3342f 100644 (file)
@@ -121,7 +121,7 @@ const char *gras_wsa_err2string(int errcode);
  **** Contexts
  ****/
 
  **** Contexts
  ****/
 
-#ifdef HAVE_UCONTEXT_H
+#ifdef USE_UCONTEXT
 # ifndef S_SPLINT_S /* This header drives splint into the wall */
 #   include <ucontext.h>
 # endif 
 # ifndef S_SPLINT_S /* This header drives splint into the wall */
 #   include <ucontext.h>
 # endif 
index bc16f82..5ab348d 100644 (file)
@@ -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 */
 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" 
 /* 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"