From f45a43325db5d399fa487680132a891fa87b6d9e Mon Sep 17 00:00:00 2001
From: Russell Taylor <taylorrj@ornl.gov>
Date: Mon, 26 Nov 2012 14:14:33 -0500
Subject: [PATCH] Re #5729. Add critical section around filling of static
 variable.

Need for this highlighted by performance test failure (GetDetOffsetsMultiPeaksTestPerformance).
---
 .../Framework/DataObjects/src/PeakColumn.cpp  | 42 +++++++++++--------
 1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/Code/Mantid/Framework/DataObjects/src/PeakColumn.cpp b/Code/Mantid/Framework/DataObjects/src/PeakColumn.cpp
index e6307e51ddc..04c241b1164 100644
--- a/Code/Mantid/Framework/DataObjects/src/PeakColumn.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/PeakColumn.cpp
@@ -25,24 +25,30 @@ namespace DataObjects
       static std::map<std::string, std::string> index;
       if(index.empty())
       {
-        // Assume double if not in this map
-        index.insert(std::make_pair("DetID", "int"));
-        index.insert(std::make_pair("RunNumber", "int"));
-        index.insert(std::make_pair("h", "double"));
-        index.insert(std::make_pair("k", "double"));
-        index.insert(std::make_pair("l", "double"));
-        index.insert(std::make_pair("Wavelength", "double"));
-        index.insert(std::make_pair("Energy", "double"));
-        index.insert(std::make_pair("TOF", "double"));
-        index.insert(std::make_pair("DSpacing", "double"));
-        index.insert(std::make_pair("Intens", "double"));
-        index.insert(std::make_pair("SigInt", "double"));
-        index.insert(std::make_pair("BinCount", "double"));
-        index.insert(std::make_pair("BankName", "str"));
-        index.insert(std::make_pair("Row", "double"));
-        index.insert(std::make_pair("Col", "double"));
-        index.insert(std::make_pair("QLab", "V3D"));
-        index.insert(std::make_pair("QSample", "V3D"));
+        PARALLEL_CRITICAL(fill_column_index_map)
+        {
+          if (index.empty()) // check again inside the critical block
+          {
+            // Assume double if not in this map
+            index.insert(std::make_pair("DetID", "int"));
+            index.insert(std::make_pair("RunNumber", "int"));
+            index.insert(std::make_pair("h", "double"));
+            index.insert(std::make_pair("k", "double"));
+            index.insert(std::make_pair("l", "double"));
+            index.insert(std::make_pair("Wavelength", "double"));
+            index.insert(std::make_pair("Energy", "double"));
+            index.insert(std::make_pair("TOF", "double"));
+            index.insert(std::make_pair("DSpacing", "double"));
+            index.insert(std::make_pair("Intens", "double"));
+            index.insert(std::make_pair("SigInt", "double"));
+            index.insert(std::make_pair("BinCount", "double"));
+            index.insert(std::make_pair("BankName", "str"));
+            index.insert(std::make_pair("Row", "double"));
+            index.insert(std::make_pair("Col", "double"));
+            index.insert(std::make_pair("QLab", "V3D"));
+            index.insert(std::make_pair("QSample", "V3D"));
+          }
+        }
       }
       auto iter = index.find(name);
       if(iter != index.end())
-- 
GitLab