diff --git a/CMakeLists.txt b/CMakeLists.txt index 588cb58cdb0585d4e30c1e25e028b8e337f10624..06617e683ce703cff2edf8dc0566fc1ca652904c 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 0000000000000000000000000000000000000000..1e9d95846f79bcecbdddf4c3debbf0d572798269 --- /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 0000000000000000000000000000000000000000..bc99b81bae6df1276c89920527b75a566dc6d3c2 --- /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 0000000000000000000000000000000000000000..ef6a37581a979536130dcef4cb6ccceab41244c9 --- /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 da6eb03154d78815fd34573db71fc5042713f538..f3234f58d01f7d58e31d47f475a336ad71e58218 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 .)