From 8f69bf7dbd54b11289adb45f14d96c22d2a08c3c Mon Sep 17 00:00:00 2001 From: alexandrmruchok <alexandrmruchok@gmail.com> Date: Mon, 25 Nov 2019 18:58:01 +0200 Subject: [PATCH] [+] Added pthread_barrier_init for Android --- CMakeLists.txt | 5 ++++ src/android/CMakeLists.txt | 14 +++++++++ src/android/pthread_barrier.c | 54 +++++++++++++++++++++++++++++++++++ src/android/pthread_barrier.h | 25 ++++++++++++++++ src/unix/CMakeLists.txt | 6 +++- 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100755 src/android/CMakeLists.txt create mode 100755 src/android/pthread_barrier.c create mode 100755 src/android/pthread_barrier.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 588cb58..06617e6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,6 +104,11 @@ if(DARWIN) target_link_libraries(${PROJECT_NAME} dap_core_darwin) endif() +if(ANDROID) + add_subdirectory(src/android) + target_link_libraries(${PROJECT_NAME} dap_core_android) +endif() + if(BUILD_DAP_TESTS) enable_testing() add_subdirectory(test) diff --git a/src/android/CMakeLists.txt b/src/android/CMakeLists.txt new file mode 100755 index 0000000..1e9d958 --- /dev/null +++ b/src/android/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.0) + +project (dap_core_android C) + +file(GLOB CORE_ANDROID_SRCS *.c) +file(GLOB CORE_ANDROID_HEADERS *.h) + +add_library(${PROJECT_NAME} STATIC ${CORE_ANDROID_SRCS} ${CORE_ANDROID_HEADERS}) + +#target_link_libraries(${PROJECT_NAME} dap_core pthread) + +target_include_directories(${PROJECT_NAME} INTERFACE .) + + diff --git a/src/android/pthread_barrier.c b/src/android/pthread_barrier.c new file mode 100755 index 0000000..bc99b81 --- /dev/null +++ b/src/android/pthread_barrier.c @@ -0,0 +1,54 @@ +#if __ANDROID_API__ < __ANDROID_API_N__ +#include "pthread_barrier.h" + +#include <errno.h> + +int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) + { + errno = EINVAL; + return -1; + } + if(pthread_mutex_init(&barrier->mutex, 0) < 0) + { + return -2; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) + { + pthread_mutex_destroy(&barrier->mutex); + return -3; + } + barrier->tripCount = count; + barrier->count = 0; + + return 0; +} + +int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->tripCount) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return 1; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +#endif diff --git a/src/android/pthread_barrier.h b/src/android/pthread_barrier.h new file mode 100755 index 0000000..ef6a375 --- /dev/null +++ b/src/android/pthread_barrier.h @@ -0,0 +1,25 @@ +#ifndef PTHREAD_BARRIER_H +#define PTHREAD_BARRIER_H + +#include <pthread.h> + +#if __ANDROID_API__ < __ANDROID_API_N__ +typedef int pthread_barrierattr_t; +typedef struct +{ + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int tripCount; +} pthread_barrier_t; + + +int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count); + +int pthread_barrier_destroy(pthread_barrier_t *barrier); + +int pthread_barrier_wait(pthread_barrier_t *barrier); + + +#endif // PTHREAD_BARRIER_H +#endif // PTHREAD_BARRIER_H diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index da6eb03..f3234f5 100755 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -13,7 +13,11 @@ endif() add_library(${PROJECT_NAME} STATIC ${CORE_UNIX_SRCS} ${CORE_UNIX_HEADERS} ${CORE_LINUX_SRCS} ${CORE_LINUX_HEADERS}) -target_link_libraries(${PROJECT_NAME} dap_core pthread) +target_link_libraries(${PROJECT_NAME} dap_core) + +if (NOT ANDROID) + target_link_libraries(${PROJECT_NAME} pthread) +endif() target_include_directories(dap_core_unix INTERFACE .) -- GitLab