aboutsummaryrefslogtreecommitdiff
path: root/package/opencv3/0002-fix-support-for-pthreads-parallel_for.patch
blob: 6eeb270eead80085619a17c4c92c5d576655f597 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
Backport from https://github.com/Itseez/opencv/commit/a482dcce464acbd5368fb93c6c3d52ba8401776a

From a482dcce464acbd5368fb93c6c3d52ba8401776a Mon Sep 17 00:00:00 2001
From: Alexander Alekhin <alexander.alekhin@itseez.com>
Date: Thu, 11 Jun 2015 16:53:07 +0300
Subject: [PATCH] fix support for pthreads parallel_for

Signed-off-by: Samuel Martin <s.martin49@gmail.com>
---
 CMakeLists.txt                         | 29 ++++++++++++++++++++++-------
 cmake/OpenCVFindLibsPerf.cmake         | 14 +++++++++-----
 cmake/templates/cvconfig.h.in          |  6 ++++++
 modules/core/src/parallel.cpp          | 13 ++++++++-----
 modules/core/src/parallel_pthreads.cpp |  2 +-
 modules/core/src/precomp.hpp           |  6 ------
 6 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d9a17b3..27d8470 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -188,7 +188,7 @@ OCV_OPTION(WITH_QUICKTIME      "Use QuickTime for Video I/O insted of QTKit" OFF
 OCV_OPTION(WITH_TBB            "Include Intel TBB support"                   OFF  IF (NOT IOS AND NOT WINRT) )
 OCV_OPTION(WITH_OPENMP         "Include OpenMP support"                      OFF)
 OCV_OPTION(WITH_CSTRIPES       "Include C= support"                          OFF  IF (WIN32 AND NOT WINRT)  )
-OCV_OPTION(WITH_PTHREADS_PF    "Use pthreads-based parallel_for"             OFF  IF (NOT WIN32) )
+OCV_OPTION(WITH_PTHREADS_PF    "Use pthreads-based parallel_for"             ON   IF (NOT WIN32) )
 OCV_OPTION(WITH_TIFF           "Include TIFF support"                        ON   IF (NOT IOS) )
 OCV_OPTION(WITH_UNICAP         "Include Unicap support (GPL)"                OFF  IF (UNIX AND NOT APPLE AND NOT ANDROID) )
 OCV_OPTION(WITH_V4L            "Include Video 4 Linux support"               ON   IF (UNIX AND NOT ANDROID) )
@@ -1026,6 +1026,27 @@ if(DEFINED WITH_GPHOTO2)
 endif(DEFINED WITH_GPHOTO2)
 
 
+# Order is similar to CV_PARALLEL_FRAMEWORK in core/src/parallel.cpp
+ocv_clear_vars(CV_PARALLEL_FRAMEWORK)
+if(HAVE_TBB)
+  set(CV_PARALLEL_FRAMEWORK "TBB (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})")
+elseif(HAVE_CSTRIPES)
+  set(CV_PARALLEL_FRAMEWORK "C=")
+elseif(HAVE_OPENMP)
+  set(CV_PARALLEL_FRAMEWORK "OpenMP")
+elseif(HAVE_GCD)
+  set(CV_PARALLEL_FRAMEWORK "GCD")
+elseif(WINRT OR HAVE_CONCURRENCY)
+  set(CV_PARALLEL_FRAMEWORK "Concurrency")
+elseif(HAVE_PTHREADS_PF)
+  set(CV_PARALLEL_FRAMEWORK "pthreads")
+else()
+  set(CV_PARALLEL_FRAMEWORK "none")
+endif()
+status("")
+status("  Parallel framework:" TRUE THEN "${CV_PARALLEL_FRAMEWORK}" ELSE NO)
+
+
 # ========================== Other third-party libraries ==========================
 status("")
 status("  Other third-party libraries:")
@@ -1045,12 +1066,6 @@ status("    Use IPP Async:"  HAVE_IPP_A       THEN "YES" ELSE NO)
 endif(DEFINED WITH_IPP_A)
 
 status("    Use Eigen:"      HAVE_EIGEN       THEN "YES (ver ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})" ELSE NO)
-status("    Use TBB:"        HAVE_TBB         THEN "YES (ver ${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} interface ${TBB_INTERFACE_VERSION})" ELSE NO)
-status("    Use OpenMP:"     HAVE_OPENMP      THEN YES ELSE NO)
-status("    Use GCD"         HAVE_GCD         THEN YES ELSE NO)
-status("    Use Concurrency" HAVE_CONCURRENCY THEN YES ELSE NO)
-status("    Use C=:"         HAVE_CSTRIPES    THEN YES ELSE NO)
-status("    Use pthreads for parallel for:"   HAVE_PTHREADS_PF THEN YES ELSE NO)
 status("    Use Cuda:"       HAVE_CUDA        THEN "YES (ver ${CUDA_VERSION_STRING})" ELSE NO)
 status("    Use OpenCL:"     HAVE_OPENCL      THEN YES ELSE NO)
 
diff --git a/cmake/OpenCVFindLibsPerf.cmake b/cmake/OpenCVFindLibsPerf.cmake
index bda5d79..d1bc541 100644
--- a/cmake/OpenCVFindLibsPerf.cmake
+++ b/cmake/OpenCVFindLibsPerf.cmake
@@ -120,12 +120,16 @@ if(WITH_OPENMP)
   set(HAVE_OPENMP "${OPENMP_FOUND}")
 endif()
 
-if(UNIX OR ANDROID)
-if(NOT APPLE AND NOT HAVE_TBB AND NOT HAVE_OPENMP)
-  set(HAVE_PTHREADS_PF 1)
-else()
-  set(HAVE_PTHREADS_PF 0)
+if(NOT MSVC AND NOT DEFINED HAVE_PTHREADS)
+  set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/pthread_test.cpp")
+  file(WRITE "${_fname}" "#include <pthread.h>\nint main() { (void)pthread_self(); return 0; }\n")
+  try_compile(HAVE_PTHREADS "${CMAKE_BINARY_DIR}" "${_fname}")
+  file(REMOVE "${_fname}")
 endif()
+
+ocv_clear_vars(HAVE_PTHREADS_PF)
+if(WITH_PTHREADS_PF)
+  set(HAVE_PTHREADS_PF ${HAVE_PTHREADS})
 else()
   set(HAVE_PTHREADS_PF 0)
 endif()
diff --git a/cmake/templates/cvconfig.h.in b/cmake/templates/cvconfig.h.in
index 4a1d1c6..3330774 100644
--- a/cmake/templates/cvconfig.h.in
+++ b/cmake/templates/cvconfig.h.in
@@ -139,6 +139,12 @@
 /* PNG codec */
 #cmakedefine HAVE_PNG
 
+/* Posix threads (pthreads) */
+#cmakedefine HAVE_PTHREADS
+
+/* parallel_for with pthreads */
+#cmakedefine HAVE_PTHREADS_PF
+
 /* Qt support */
 #cmakedefine HAVE_QT
 
diff --git a/modules/core/src/parallel.cpp b/modules/core/src/parallel.cpp
index 0b593ee..caa8129 100644
--- a/modules/core/src/parallel.cpp
+++ b/modules/core/src/parallel.cpp
@@ -80,6 +80,7 @@
    4. HAVE_GCD         - system wide, used automatically        (APPLE only)
    5. WINRT            - system wide, used automatically        (Windows RT only)
    6. HAVE_CONCURRENCY - part of runtime, used automatically    (Windows only - MSVS 10, MSVS 11)
+   7. HAVE_PTHREADS_PF - pthreads if available
 */
 
 #if defined HAVE_TBB
@@ -125,14 +126,14 @@
 #  define CV_PARALLEL_FRAMEWORK "winrt-concurrency"
 #elif defined HAVE_CONCURRENCY
 #  define CV_PARALLEL_FRAMEWORK "ms-concurrency"
-#elif defined HAVE_PTHREADS
+#elif defined HAVE_PTHREADS_PF
 #  define CV_PARALLEL_FRAMEWORK "pthreads"
 #endif
 
 namespace cv
 {
     ParallelLoopBody::~ParallelLoopBody() {}
-#if defined HAVE_PTHREADS && HAVE_PTHREADS
+#ifdef HAVE_PTHREADS_PF
     void parallel_for_pthreads(const cv::Range& range, const cv::ParallelLoopBody& body, double nstripes);
     size_t parallel_pthreads_get_threads_num();
     void parallel_pthreads_set_threads_num(int num);
@@ -306,7 +307,7 @@ void cv::parallel_for_(const cv::Range& range, const cv::ParallelLoopBody& body,
             Concurrency::CurrentScheduler::Detach();
         }
 
-#elif defined HAVE_PTHREADS
+#elif defined HAVE_PTHREADS_PF
 
         parallel_for_pthreads(range, body, nstripes);
 
@@ -365,7 +366,7 @@ int cv::getNumThreads(void)
         ? Concurrency::CurrentScheduler::Get()->GetNumberOfVirtualProcessors()
         : pplScheduler->GetNumberOfVirtualProcessors());
 
-#elif defined HAVE_PTHREADS
+#elif defined HAVE_PTHREADS_PF
 
         return parallel_pthreads_get_threads_num();
 
@@ -426,7 +427,7 @@ void cv::setNumThreads( int threads )
                        Concurrency::MaxConcurrency, threads-1));
     }
 
-#elif defined HAVE_PTHREADS
+#elif defined HAVE_PTHREADS_PF
 
     parallel_pthreads_set_threads_num(threads);
 
@@ -452,6 +453,8 @@ int cv::getThreadNum(void)
     return 0;
 #elif defined HAVE_CONCURRENCY
     return std::max(0, (int)Concurrency::Context::VirtualProcessorId()); // zero for master thread, unique number for others but not necessary 1,2,3,...
+#elif defined HAVE_PTHREADS_PF
+    return (int)(size_t)(void*)pthread_self(); // no zero-based indexing
 #else
     return 0;
 #endif
diff --git a/modules/core/src/parallel_pthreads.cpp b/modules/core/src/parallel_pthreads.cpp
index 8c34959..091ea2d 100644
--- a/modules/core/src/parallel_pthreads.cpp
+++ b/modules/core/src/parallel_pthreads.cpp
@@ -42,7 +42,7 @@
 
 #include "precomp.hpp"
 
-#if defined HAVE_PTHREADS && HAVE_PTHREADS
+#ifdef HAVE_PTHREADS_PF
 
 #include <algorithm>
 #include <pthread.h>
diff --git a/modules/core/src/precomp.hpp b/modules/core/src/precomp.hpp
index d463126..88b60e4 100644
--- a/modules/core/src/precomp.hpp
+++ b/modules/core/src/precomp.hpp
@@ -292,12 +292,6 @@ TLSData<CoreTLSData>& getCoreTlsData();
 #define CL_RUNTIME_EXPORT
 #endif
 
-#ifndef HAVE_PTHREADS
-#if !(defined WIN32 || defined _WIN32 || defined WINCE || defined HAVE_WINRT)
-#define HAVE_PTHREADS 1
-#endif
-#endif
-
 extern bool __termination; // skip some cleanups, because process is terminating
                            // (for example, if ExitProcess() was already called)
 
-- 
2.4.4