diff options
author | Sam Bingner <sam@bingner.com> | 2020-04-09 15:04:38 -1000 |
---|---|---|
committer | Sam Bingner <sam@bingner.com> | 2020-04-09 15:04:38 -1000 |
commit | e4718f05d049c1a09fb9662cc3db2d4c5122defe (patch) | |
tree | 287912d2fcd30c8c549607641b1dea28cbd17763 | |
parent | 129877e1be3d88d6f761d619085ca39ef01b1b09 (diff) |
Revert "Use C++11 threading support instead of pthread"cydia
C++ threading support is on available on iOS7
This reverts commit b28636e54f682dc65aef169f201a34a8e2893369.
-rw-r--r-- | CMake/config.h.in | 3 | ||||
-rw-r--r-- | CMakeLists.txt | 6 | ||||
-rw-r--r-- | apt-pkg/contrib/error.cc | 26 | ||||
-rw-r--r-- | test/interactive-helper/aptwebserver.cc | 1 |
4 files changed, 33 insertions, 3 deletions
diff --git a/CMake/config.h.in b/CMake/config.h.in index a9528ccfa..7db2b855d 100644 --- a/CMake/config.h.in +++ b/CMake/config.h.in @@ -43,6 +43,9 @@ /* Define if we have machine/endian.h */ #cmakedefine HAVE_MACHINE_ENDIAN_H +/* Define if we have enabled pthread support */ +#cmakedefine HAVE_PTHREAD + /* Check for getresuid() function and similar ones */ #cmakedefine HAVE_GETRESUID #cmakedefine HAVE_GETRESGID diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ff7728e1..2b07ee20b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ include(CheckFunctionExists) include(CheckStructHasMember) include(GNUInstallDirs) include(TestBigEndian) -find_package(Threads REQUIRED) +find_package(Threads) find_package(LFS REQUIRED) find_package(Iconv REQUIRED) @@ -152,6 +152,10 @@ test_big_endian(WORDS_BIGENDIAN) # FreeBSD add_definitions(-D_WITH_GETLINE=1) +if (CMAKE_USE_PTHREADS_INIT) + set(HAVE_PTHREAD 1) +endif() + CHECK_INCLUDE_FILES(machine/endian.h HAVE_MACHINE_ENDIAN_H) CHECK_INCLUDE_FILES(sys/endian.h HAVE_SYS_ENDIAN_H) CHECK_INCLUDE_FILES(endian.h HAVE_ENDIAN_H) diff --git a/apt-pkg/contrib/error.cc b/apt-pkg/contrib/error.cc index 143b99557..2de13b4ae 100644 --- a/apt-pkg/contrib/error.cc +++ b/apt-pkg/contrib/error.cc @@ -32,11 +32,33 @@ /*}}}*/ // Global Error Object /*{{{*/ +/* If the implementation supports posix threads then the accessor function + is compiled to be thread safe otherwise a non-safe version is used. A + Per-Thread error object is maintained in much the same manner as libc + manages errno */ +#if defined(_POSIX_THREADS) && defined(HAVE_PTHREAD) +#include <pthread.h> + +static pthread_key_t ErrorKey; +static void ErrorDestroy(void *Obj) { delete (GlobalError *)Obj; }; +static void KeyAlloc() { pthread_key_create(&ErrorKey, ErrorDestroy); }; + GlobalError *_GetErrorObj() { - static thread_local GlobalError Obj; - return &Obj; + static pthread_once_t Once = PTHREAD_ONCE_INIT; + pthread_once(&Once, KeyAlloc); + + void *Res = pthread_getspecific(ErrorKey); + if (Res == 0) + pthread_setspecific(ErrorKey, Res = new GlobalError); + return (GlobalError *)Res; +} +#else +GlobalError *_GetErrorObj() { + static GlobalError *Obj = new GlobalError; + return Obj; } +#endif /*}}}*/ // GlobalError::GlobalError - Constructor /*{{{*/ GlobalError::GlobalError() : PendingFlag(false) {} diff --git a/test/interactive-helper/aptwebserver.cc b/test/interactive-helper/aptwebserver.cc index 2243ccea9..5c891f33a 100644 --- a/test/interactive-helper/aptwebserver.cc +++ b/test/interactive-helper/aptwebserver.cc @@ -11,6 +11,7 @@ #include <dirent.h> #include <errno.h> #include <netinet/in.h> +#include <pthread.h> #include <regex.h> #include <signal.h> #include <stddef.h> |