aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2012-01-25 17:42:22 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2012-01-25 17:42:22 +0100
commit606e204f6d87a109110b074862cd39d71948f567 (patch)
tree9f58e9d94c9b9490345990ca9ad28d91ab93f286 /Eigen/src/Core
parentc68616b3b5f25ec07579e9776593af0d0f92dfea (diff)
fix bug #406: Using OpenMP and Eigen causes infinite loop/deadlock
Diffstat (limited to 'Eigen/src/Core')
-rw-r--r--Eigen/src/Core/products/GeneralBlockPanelKernel.h17
1 files changed, 7 insertions, 10 deletions
diff --git a/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/Eigen/src/Core/products/GeneralBlockPanelKernel.h
index e8a0fbbde..8ace428ab 100644
--- a/Eigen/src/Core/products/GeneralBlockPanelKernel.h
+++ b/Eigen/src/Core/products/GeneralBlockPanelKernel.h
@@ -30,19 +30,16 @@ namespace internal {
template<typename _LhsScalar, typename _RhsScalar, bool _ConjLhs=false, bool _ConjRhs=false>
class gebp_traits;
+std::ptrdiff_t manage_caching_sizes_second_if_negative(std::ptrdiff_t a, std::ptrdiff_t b)
+{
+ return a<=0 ? b : a;
+}
+
/** \internal */
inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1=0, std::ptrdiff_t* l2=0)
{
- static std::ptrdiff_t m_l1CacheSize = 0;
- static std::ptrdiff_t m_l2CacheSize = 0;
- if(m_l1CacheSize==0)
- {
- m_l1CacheSize = queryL1CacheSize();
- m_l2CacheSize = queryTopLevelCacheSize();
-
- if(m_l1CacheSize<=0) m_l1CacheSize = 8 * 1024;
- if(m_l2CacheSize<=0) m_l2CacheSize = 1 * 1024 * 1024;
- }
+ static std::ptrdiff_t m_l1CacheSize = manage_caching_sizes_second_if_negative(queryL1CacheSize(),8 * 1024);
+ static std::ptrdiff_t m_l2CacheSize = manage_caching_sizes_second_if_negative(queryTopLevelCacheSize(),1*1024*1024);
if(action==SetAction)
{