comparison 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
comparison
equal deleted inserted replaced
4363:1382c908d67c 4364:d527a081f92d
928 boost::shared_mutex decoderTranscoderMutex_; // Changed from "boost::mutex" in Orthanc 1.7.0 928 boost::shared_mutex decoderTranscoderMutex_; // Changed from "boost::mutex" in Orthanc 1.7.0
929 boost::mutex jobsUnserializersMutex_; 929 boost::mutex jobsUnserializersMutex_;
930 boost::mutex refreshMetricsMutex_; 930 boost::mutex refreshMetricsMutex_;
931 boost::mutex storageCommitmentScpMutex_; 931 boost::mutex storageCommitmentScpMutex_;
932 boost::recursive_mutex invokeServiceMutex_; 932 boost::recursive_mutex invokeServiceMutex_;
933 boost::shared_mutex incomingHttpRequestFilterMutex_; // New in Orthanc 1.9.0
933 934
934 Properties properties_; 935 Properties properties_;
935 int argc_; 936 int argc_;
936 char** argv_; 937 char** argv_;
937 std::unique_ptr<OrthancPluginDatabase> database_; 938 std::unique_ptr<OrthancPluginDatabase> database_;
2153 void OrthancPlugins::RegisterIncomingHttpRequestFilter(const void* parameters) 2154 void OrthancPlugins::RegisterIncomingHttpRequestFilter(const void* parameters)
2154 { 2155 {
2155 const _OrthancPluginIncomingHttpRequestFilter& p = 2156 const _OrthancPluginIncomingHttpRequestFilter& p =
2156 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter*>(parameters); 2157 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter*>(parameters);
2157 2158
2159 boost::unique_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
2160
2158 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming HTTP requests"; 2161 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming HTTP requests";
2159 pimpl_->incomingHttpRequestFilters_.push_back(p.callback); 2162 pimpl_->incomingHttpRequestFilters_.push_back(p.callback);
2160 } 2163 }
2161 2164
2162 2165
2163 void OrthancPlugins::RegisterIncomingHttpRequestFilter2(const void* parameters) 2166 void OrthancPlugins::RegisterIncomingHttpRequestFilter2(const void* parameters)
2164 { 2167 {
2165 const _OrthancPluginIncomingHttpRequestFilter2& p = 2168 const _OrthancPluginIncomingHttpRequestFilter2& p =
2166 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter2*>(parameters); 2169 *reinterpret_cast<const _OrthancPluginIncomingHttpRequestFilter2*>(parameters);
2167 2170
2171 boost::unique_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
2172
2168 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming HTTP requests"; 2173 CLOG(INFO, PLUGINS) << "Plugin has registered a callback to filter incoming HTTP requests";
2169 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback); 2174 pimpl_->incomingHttpRequestFilters2_.push_back(p.callback);
2170 } 2175 }
2171 2176
2172 2177
4421 } 4426 }
4422 4427
4423 return true; 4428 return true;
4424 } 4429 }
4425 4430
4431 case _OrthancPluginService_RegisterIncomingHttpRequestFilter:
4432 RegisterIncomingHttpRequestFilter(parameters);
4433 return true;
4434
4435 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
4436 RegisterIncomingHttpRequestFilter2(parameters);
4437 return true;
4438
4426 default: 4439 default:
4427 return false; 4440 return false;
4428 } 4441 }
4429 } 4442 }
4430 4443
4480 RegisterTranscoderCallback(parameters); 4493 RegisterTranscoderCallback(parameters);
4481 return true; 4494 return true;
4482 4495
4483 case _OrthancPluginService_RegisterJobsUnserializer: 4496 case _OrthancPluginService_RegisterJobsUnserializer:
4484 RegisterJobsUnserializer(parameters); 4497 RegisterJobsUnserializer(parameters);
4485 return true;
4486
4487 case _OrthancPluginService_RegisterIncomingHttpRequestFilter:
4488 RegisterIncomingHttpRequestFilter(parameters);
4489 return true;
4490
4491 case _OrthancPluginService_RegisterIncomingHttpRequestFilter2:
4492 RegisterIncomingHttpRequestFilter2(parameters);
4493 return true; 4498 return true;
4494 4499
4495 case _OrthancPluginService_RegisterIncomingDicomInstanceFilter: 4500 case _OrthancPluginService_RegisterIncomingDicomInstanceFilter:
4496 RegisterIncomingDicomInstanceFilter(parameters); 4501 RegisterIncomingDicomInstanceFilter(parameters);
4497 return true; 4502 return true;
4938 getKeys[i] = getArguments[i].first.c_str(); 4943 getKeys[i] = getArguments[i].first.c_str();
4939 getValues[i] = getArguments[i].second.c_str(); 4944 getValues[i] = getArguments[i].second.c_str();
4940 } 4945 }
4941 4946
4942 { 4947 {
4943 boost::recursive_mutex::scoped_lock lock(pimpl_->invokeServiceMutex_); 4948 boost::shared_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
4944 4949
4945 // Improved callback with support for GET arguments, since Orthanc 1.3.0 4950 // Improved callback with support for GET arguments, since Orthanc 1.3.0
4946 for (PImpl::IncomingHttpRequestFilters2::const_iterator 4951 for (PImpl::IncomingHttpRequestFilters2::const_iterator
4947 filter = pimpl_->incomingHttpRequestFilters2_.begin(); 4952 filter = pimpl_->incomingHttpRequestFilters2_.begin();
4948 filter != pimpl_->incomingHttpRequestFilters2_.end(); ++filter) 4953 filter != pimpl_->incomingHttpRequestFilters2_.end(); ++filter)