summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Bingner <sam@bingner.com>2020-04-09 15:04:38 -1000
committerSam Bingner <sam@bingner.com>2020-04-09 15:04:38 -1000
commite4718f05d049c1a09fb9662cc3db2d4c5122defe (patch)
tree287912d2fcd30c8c549607641b1dea28cbd17763
parent129877e1be3d88d6f761d619085ca39ef01b1b09 (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.in3
-rw-r--r--CMakeLists.txt6
-rw-r--r--apt-pkg/contrib/error.cc26
-rw-r--r--test/interactive-helper/aptwebserver.cc1
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>