diff OrthancServer/Plugins/Engine/OrthancPlugins.cpp @ 4364:d527a081f92d

Allow concurrency on the OrthancPluginRegisterIncomingHttpRequestFilter() callbacks
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 09 Dec 2020 16:17:46 +0100
parents e1e918e790e8
children 79ef2b6d8e76
line wrap: on
line diff
--- a/OrthancServer/Plugins/Engine/OrthancPlugins.cpp	Wed Dec 09 10:07:48 2020 +0100
+++ b/OrthancServer/Plugins/Engine/OrthancPlugins.cpp	Wed Dec 09 16:17:46 2020 +0100
@@ -930,6 +930,7 @@
     boost::mutex refreshMetricsMutex_;
     boost::mutex storageCommitmentScpMutex_;
     boost::recursive_mutex invokeServiceMutex_;
+    boost::shared_mutex incomingHttpRequestFilterMutex_;  // New in Orthanc 1.9.0
 
     Properties properties_;
     int argc_;
@@ -2155,6 +2156,8 @@
     const _OrthancPluginIncomingHttpRequestFilter& p = 
       *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter*>(parameters);
 
+    boost::unique_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
+    
     CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming HTTP requests";
     pimpl_->incomingHttpRequestFilters_.push_back(p.callback);
   }
@@ -2165,6 +2168,8 @@
     const _OrthancPluginIncomingHttpRequestFilter2& p = 
       *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter2*>(parameters);
 
+    boost::unique_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
+    
     CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming HTTP requests";
     pimpl_->incomingHttpRequestFilters2_.push_back(p.callback);
   }
@@ -4423,6 +4428,14 @@
         return true;
       }
         
+      case _OrthancPluginService_RegisterIncomingHttpRequestFilter:
+        RegisterIncomingHttpRequestFilter(parameters);
+        return true;
+
+      case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
+        RegisterIncomingHttpRequestFilter2(parameters);
+        return true;
+
       default:
         return false;
     }
@@ -4484,14 +4497,6 @@
         RegisterJobsUnserializer(parameters);
         return true;
 
-      case _OrthancPluginService_RegisterIncomingHttpRequestFilter:
-        RegisterIncomingHttpRequestFilter(parameters);
-        return true;
-
-      case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
-        RegisterIncomingHttpRequestFilter2(parameters);
-        return true;
-
       case _OrthancPluginService_RegisterIncomingDicomInstanceFilter:
         RegisterIncomingDicomInstanceFilter(parameters);
         return true;
@@ -4940,7 +4945,7 @@
     }
 
     {
-      boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_);
+      boost::shared_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
     
       // Improved callback with support for GET arguments, since Orthanc 1.3.0
       for (PImpl::IncomingHttpRequestFilters2::const_iterator