diff --git a/CMakeExt/Threading.cmake b/CMakeExt/Threading.cmake new file mode 100644 index 000000000..7bc15f919 --- /dev/null +++ b/CMakeExt/Threading.cmake @@ -0,0 +1,16 @@ + + +set(ENABLE_MULTITHREADING ${ENABLE_MULTITHREADING} + PARENT_SCOPE) + +if (ENABLE_MULTITHREADING) + + # Find support for pthreads + find_package(Threads REQUIRED) + set(CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} -pthread -DDART_ENABLE_THREADING -DHAVE_PTHREADS") + set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -pthread -DDART_ENABLE_THREADING -DHAVE_PTHREADS") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -pthread") +endif() \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index a6edf6732..1604f1173 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,8 @@ option(ENABLE_HDF5 "Specify whether HDF5 features are enabled" on) option(ENABLE_NASTYMPI "Specify whether the NastyMPI proxy should be enabled" off) +option(ENABLE_MULTITHREADING + "Specify whether support for multithreading should be compiled" off) if (BUILD_COVERAGE_TESTS) set(BUILD_TESTS TRUE CACHE BOOLEAN @@ -127,6 +129,9 @@ endif() if (ENABLE_NASTYMPI) include(${CMAKE_SOURCE_DIR}/CMakeExt/NastyMPI.cmake) endif() +if (ENABLE_MULTITHREADING) + include(${CMAKE_SOURCE_DIR}/CMakeExt/Threading.cmake) +endif() # prepare StaticConfig.h generation include(${CMAKE_SOURCE_DIR}/CMakeExt/GenerateConfig.cmake) @@ -282,6 +287,8 @@ message(INFO "HDF5 support: (ENABLE_HDF5) " ${ENABLE_HDF5}) message(INFO "Enabled DART backends: (DART_IMPLEMENTATIONS) " ${DART_IMPLEMENTATIONS}) +message(INFO "Enable multithreading: (ENABLE_MULTITHREADING) " + ${ENABLE_MULTITHREADING}) message(INFO "C compiler id: ${CMAKE_C_COMPILER_ID}") message(INFO "C++ compiler id: ${CMAKE_CXX_COMPILER_ID}") if (MPI_FOUND) diff --git a/build.sh b/build.sh index 0852bff02..a1e9c2f26 100755 --- a/build.sh +++ b/build.sh @@ -59,6 +59,7 @@ rm -Rf $BUILD_DIR/* -DDART_IF_VERSION=3.2 \ -DINSTALL_PREFIX=$HOME/opt/dash-0.3.0/ \ -DDART_IMPLEMENTATIONS=mpi \ + -DENABLE_MULTITHREADING=ON \ -DENABLE_DEVELOPER_COMPILER_WARNINGS=OFF \ -DENABLE_EXTENDED_COMPILER_WARNINGS=OFF \ -DENABLE_LT_OPTIMIZATION=OFF \ diff --git a/dart-impl/base/include/dash/dart/base/mutex.h b/dart-impl/base/include/dash/dart/base/mutex.h new file mode 100644 index 000000000..ac57bc7d6 --- /dev/null +++ b/dart-impl/base/include/dash/dart/base/mutex.h @@ -0,0 +1,77 @@ +#ifndef DASH_DART_BASE_MUTEX__H_ +#define DASH_DART_BASE_MUTEX__H_ + +#include + + +#ifdef HAVE_PTHREADS +#include +#endif + +typedef struct dart_mutex { +#ifdef HAVE_PTHREADS +pthread_mutex_t mutex; +#endif +} dart_mutex_t; + +static inline +dart_ret_t +dart_mutex_init(dart_mutex_t *mutex) +{ +#ifdef HAVE_PTHREADS + pthread_mutex_init(&mutex->mutex, NULL); + return DART_OK; +#else + return DART_ERR_INVAL; +#endif +} + +static inline +dart_ret_t +dart_mutex_lock(dart_mutex_t *mutex) +{ +#ifdef HAVE_PTHREADS + pthread_mutex_lock(&mutex->mutex); + return DART_OK; +#else + return DART_ERR_INVAL; +#endif +} + +static inline +dart_ret_t +dart_mutex_unlock(dart_mutex_t *mutex) +{ +#ifdef HAVE_PTHREADS + pthread_mutex_unlock(&mutex->mutex); + return DART_OK; +#else + return DART_ERR_INVAL; +#endif +} + +static inline +dart_ret_t +dart_mutex_trylock(dart_mutex_t *mutex) +{ +#ifdef HAVE_PTHREADS + pthread_mutex_trylock(&mutex->mutex); + return DART_OK; +#else + return DART_ERR_INVAL; +#endif +} + + +dart_ret_t +dart_mutex_destroy(dart_mutex_t *mutex) +{ +#ifdef HAVE_PTHREADS + pthread_mutex_destroy(&mutex->mutex); + return DART_OK; +#else + return DART_ERR_INVAL; +#endif +} + +#endif /* DASH_DART_BASE_MUTEX__H_ */