From 1fd15d2c07a6c04bc8dd130ea48abd79ae714731 Mon Sep 17 00:00:00 2001 From: navarrop Date: Wed, 5 Jan 2011 13:56:25 +0000 Subject: [PATCH] Test if having futex.h. 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 | 2 + buildtools/Cmake/gras_config.h.in | 3 + src/xbt/parmap.c | 94 ++++++++++++++++++-------- src/xbt/parmap_private.h | 8 ++- src/xbt/xbt_os_thread.c | 1 + 5 files changed, 76 insertions(+), 32 deletions(-) diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index 56e92e4a80..c15c13b5db 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -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) diff --git a/buildtools/Cmake/gras_config.h.in b/buildtools/Cmake/gras_config.h.in index 72f723ef17..b07a0c7fc7 100644 --- a/buildtools/Cmake/gras_config.h.in +++ b/buildtools/Cmake/gras_config.h.in @@ -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@ diff --git a/src/xbt/parmap.c b/src/xbt/parmap.c index 38ca6198a8..61c94f8f67 100644 --- a/src/xbt/parmap.c +++ b/src/xbt/parmap.c @@ -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 #include -#include +#ifdef HAVE_FUTEX_H + #include +#else + #include "xbt/xbt_os_thread.h" +#endif #include #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" diff --git a/src/xbt/parmap_private.h b/src/xbt/parmap_private.h index 02da424924..c81e05f29d 100644 --- a/src/xbt/parmap_private.h +++ b/src/xbt/parmap_private.h @@ -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; diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 6a124dedae..c3f56888b6 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -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 */ -- 2.20.1