Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Test if having futex.h.
authornavarrop <navarrop@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 5 Jan 2011 13:56:25 +0000 (13:56 +0000)
committernavarrop <navarrop@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 5 Jan 2011 13:56:25 +0000 (13:56 +0000)
If it's not present use xbt_os_thread.h

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9360 48e7efb5-ca39-0410-a469-dd3cf9ba447f

buildtools/Cmake/CompleteInFiles.cmake
buildtools/Cmake/gras_config.h.in
src/xbt/parmap.c
src/xbt/parmap_private.h
src/xbt/xbt_os_thread.c

index 56e92e4..c15c13b 100644 (file)
@@ -62,6 +62,8 @@ CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
 CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
 CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H)
 CHECK_INCLUDE_FILE("stdio.h" HAVE_STDIO_H)
+CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H)
+
 
 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
 CHECK_FUNCTION_EXISTS(usleep HAVE_USLEEP)
index 72f723e..b07a0c7 100644 (file)
@@ -42,6 +42,9 @@
 /* Set to true if lib pcre is present */
 #cmakedefine HAVE_PCRE_LIB @HAVE_PCRE_LIB@
 
+/* If have linux_futex.h */
+#cmakedefine HAVE_FUTEX_H @HAVE_FUTEX_H@
+
 /* Some variable for graphviz */
 #cmakedefine HAVE_GRAPH_H @GRAPH_H@
 #cmakedefine HAVE_CGRAPH_H @CGRAPH_H@
index 38ca619..61c94f8 100644 (file)
@@ -3,9 +3,14 @@
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
+#include "gras_config.h"
 #include <unistd.h>
 #include <sys/syscall.h>
-#include <linux/futex.h>
+#ifdef HAVE_FUTEX_H
+       #include <linux/futex.h>
+#else
+       #include "xbt/xbt_os_thread.h"
+#endif
 #include <errno.h>
 #include "parmap_private.h"
 
@@ -13,10 +18,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_parmap, xbt, "parmap: parallel map");
 XBT_LOG_NEW_SUBCATEGORY(xbt_parmap_unit, xbt_parmap, "parmap unit testing");
 
 static void *_xbt_parmap_worker_main(void *parmap);
-
-static void futex_wait(int *uaddr, int val);
-static void futex_wake(int *uaddr, int val);
-
+#ifdef HAVE_FUTEX_H
+       static void futex_wait(int *uaddr, int val);
+       static void futex_wake(int *uaddr, int val);
+#endif
 xbt_parmap_t xbt_parmap_new(unsigned int num_workers)
 {
   unsigned int i;
@@ -26,6 +31,10 @@ xbt_parmap_t xbt_parmap_new(unsigned int num_workers)
 
   /* Initialize the thread pool data structure */
   xbt_parmap_t parmap = xbt_new0(s_xbt_parmap_t, 1);
+  #ifndef HAVE_FUTEX_H
+         parmap->workers_ready->mutex = xbt_os_mutex_init();
+         parmap->workers_ready->cond = xbt_os_cond_init();
+  #endif
   parmap->num_workers = num_workers;
   parmap->status = PARMAP_WORK;
 
@@ -121,17 +130,19 @@ static void *_xbt_parmap_worker_main(void *arg)
   }
 }
 
-static void futex_wait(int *uaddr, int val)
-{
-  DEBUG1("Waiting on futex %d", *uaddr);
-  syscall(SYS_futex, uaddr, FUTEX_WAIT_PRIVATE, val, NULL, NULL, 0);
-}
+#ifdef HAVE_FUTEX_H
+       static void futex_wait(int *uaddr, int val)
+       {
+         DEBUG1("Waiting on futex %d", *uaddr);
+         syscall(SYS_futex, uaddr, FUTEX_WAIT_PRIVATE, val, NULL, NULL, 0);
+       }
 
-static void futex_wake(int *uaddr, int val)
-{
-  DEBUG1("Waking futex %d", *uaddr);
-  syscall(SYS_futex, uaddr, FUTEX_WAKE_PRIVATE, val, NULL, NULL, 0);
-}
+       static void futex_wake(int *uaddr, int val)
+       {
+         DEBUG1("Waking futex %d", *uaddr);
+         syscall(SYS_futex, uaddr, FUTEX_WAKE_PRIVATE, val, NULL, NULL, 0);
+       }
+#endif
 
 /* Futex based implementation of the barrier */
 void xbt_barrier_init(xbt_barrier_t barrier, unsigned int threads_to_wait)
@@ -140,21 +151,44 @@ void xbt_barrier_init(xbt_barrier_t barrier, unsigned int threads_to_wait)
   barrier->thread_count = 0;
 }
 
-void xbt_barrier_wait(xbt_barrier_t barrier)
-{
-  int myflag = 0;
-  unsigned int mycount = 0;
-
-  myflag = barrier->futex;
-  mycount = __sync_add_and_fetch(&barrier->thread_count, 1);
-  if(mycount < barrier->threads_to_wait){
-    futex_wait(&barrier->futex, myflag);
-  }else{
-    barrier->futex = __sync_add_and_fetch(&barrier->futex, 1);
-    barrier->thread_count = 0;
-    futex_wake(&barrier->futex, barrier->threads_to_wait);
-  }
-}
+#ifdef HAVE_FUTEX_H
+       void xbt_barrier_wait(xbt_barrier_t barrier)
+       {
+         int myflag = 0;
+         unsigned int mycount = 0;
+
+         myflag = barrier->futex;
+         mycount = __sync_add_and_fetch(&barrier->thread_count, 1);
+         if(mycount < barrier->threads_to_wait){
+               futex_wait(&barrier->futex, myflag);
+         }else{
+               barrier->futex = __sync_add_and_fetch(&barrier->futex, 1);
+               barrier->thread_count = 0;
+               futex_wake(&barrier->futex, barrier->threads_to_wait);
+         }
+       }
+#else
+       void xbt_barrier_wait(xbt_barrier_t barrier)
+       {
+         int myflag = 0;
+         unsigned int mycount = 0;
+
+         xbt_os_mutex_acquire(barrier->mutex);
+         //pthread_mutex_lock(&barrier->mutex);
+
+         barrier->thread_count++;
+         if(barrier->thread_count < barrier->threads_to_wait){
+                 xbt_os_cond_wait(barrier->cond,barrier->mutex);
+                 //pthread_cond_wait(&barrier->mutex,&barrier->cond);
+         }else{
+               barrier->thread_count = 0;
+               xbt_os_cond_broadcast(barrier->cond);
+               //pthread_cond_broadcast(&barrier->mutex, &barrier->cond);
+         }
+         xbt_os_mutex_release(barrier->mutex);
+         //pthread_mutex_unlock(&barrier->mutex);
+       }
+#endif
 
 #ifdef SIMGRID_TEST
 #include "xbt.h"
index 02da424..c81e05f 100644 (file)
@@ -18,9 +18,13 @@ typedef enum{
   PARMAP_WORK = 0,
   PARMAP_DESTROY
 } e_xbt_parmap_flag_t;
-
 typedef struct s_xbt_barrier{
-  int futex;
+#ifdef HAVE_FUTEX_H
+       int futex;
+#else
+       xbt_os_mutex_t mutex;
+       xbt_os_cond_t cond;
+#endif
   unsigned int thread_count;
   unsigned int threads_to_wait;
 } s_xbt_barrier_t, *xbt_barrier_t;
index 6a124de..c3f5688 100644 (file)
@@ -8,6 +8,7 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include "gras_config.h"
 #include "xbt/sysdep.h"
 #include "xbt/ex.h"
 #include "xbt/ex_interface.h"   /* We play crude games with exceptions */