From 469fd180ed9bbdf1480ae2172e9696c644a44c07 Mon Sep 17 00:00:00 2001
From: Peter van Gemmeren <gemmeren@anl.gov>
Date: Wed, 19 Apr 2017 15:45:58 -0500
Subject: [PATCH] Fix context creation for AthenaMP: Rather than reinit()
 PoolSvc, create a new PersistencySvc on demand.

Former-commit-id: acc7af79f02e994f6cf746c2d3acaceafb2e86e7
---
 Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx | 25 ++++++++++++++-------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx b/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx
index 0166e957d7d..b4224da7d7b 100644
--- a/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx
+++ b/Database/AthenaPOOL/PoolSvc/src/PoolSvc.cxx
@@ -444,14 +444,17 @@ pool::ICollection* PoolSvc::createCollection(const std::string& collectionType,
 	 collection = "PFN:" + collectionName;
       }
    }
-   if (contextId >= m_persistencySvcVec.size()) {
-      contextId = IPoolSvc::kInputStream;
-   }
-   if (contextId == IPoolSvc::kInputStream && openMode != pool::ICollection::READ) {
+   std::lock_guard<CallMutex> lock(m_pool_mut);
+   if (openMode != pool::ICollection::READ) {
       contextId = IPoolSvc::kOutputStream;
+   } else {
+      if (contextId > m_persistencySvcVec.size()) {
+         contextId = IPoolSvc::kInputStream;
+      } else if (contextId == m_persistencySvcVec.size()) {
+         contextId = const_cast<PoolSvc*>(this)->getInputContext("");
+      }
    }
-   std::lock_guard<CallMutex> lock(m_pool_mut);
-   if (contextId >= m_persistencySvcVec.size() && !const_cast<PoolSvc*>(this)->reinit().isSuccess()) {
+   if (contextId >= m_persistencySvcVec.size()) {
       return(nullptr);
    }
    std::lock_guard<CallMutex> lockC(*m_pers_mut[contextId]);
@@ -579,11 +582,17 @@ Token* PoolSvc::getToken(const std::string& connection,
 }
 //__________________________________________________________________________
 StatusCode PoolSvc::connect(pool::ITransaction::Type type, unsigned int contextId) const {
+   std::lock_guard<CallMutex> lock(m_pool_mut);
    if (type != pool::ITransaction::READ) {
       contextId = IPoolSvc::kOutputStream;
+   } else {
+      if (contextId > m_persistencySvcVec.size()) {
+         contextId = IPoolSvc::kInputStream;
+      } else if (contextId == m_persistencySvcVec.size()) {
+         contextId = const_cast<PoolSvc*>(this)->getInputContext("");
+      }
    }
-   std::lock_guard<CallMutex> lock(m_pool_mut);
-   if (contextId >= m_persistencySvcVec.size() && !const_cast<PoolSvc*>(this)->reinit().isSuccess()) {
+   if (contextId >= m_persistencySvcVec.size()) {
       return(StatusCode::FAILURE);
    }
    std::lock_guard<CallMutex> lockC(*m_pers_mut[contextId]);
-- 
GitLab