diff OrthancServer/QueryRetrieveHandler.cpp @ 2616:2f3007bf0708 jobs

event queues in Lua, serialization of sequence of operations
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 22 May 2018 12:25:37 +0200
parents 6f9225dcfc32
children 912a767911b0
line wrap: on
line diff
--- a/OrthancServer/QueryRetrieveHandler.cpp	Mon May 21 09:00:20 2018 +0200
+++ b/OrthancServer/QueryRetrieveHandler.cpp	Tue May 22 12:25:37 2018 +0200
@@ -35,21 +35,43 @@
 #include "QueryRetrieveHandler.h"
 
 #include "OrthancInitialization.h"
+
 #include "../Core/DicomParsing/FromDcmtkBridge.h"
+#include "../Core/Logging.h"
 
 
 namespace Orthanc
 {
-  static void FixQuery(DicomMap& query,
-                       ServerContext& context,
-                       const std::string& modality)
+  static LuaScripting& GetLuaScripting(ServerContext& context)
+  {
+    // Returns a singleton Lua context
+    static boost::mutex mutex_;
+    static std::auto_ptr<LuaScripting>  lua_;
+    
+    boost::mutex::scoped_lock lock(mutex_);
+
+    if (lua_.get() == NULL)
+    {
+      LOG(INFO) << "Initializing Lua for QueryRetrieveHandler";
+      lua_.reset(new LuaScripting(context));
+      lua_->LoadGlobalConfiguration();
+    }
+
+    return *lua_;
+  }
+
+
+  static void FixQueryLua(DicomMap& query,
+                          ServerContext& context,
+                          const std::string& modality)
   {
     static const char* LUA_CALLBACK = "OutgoingFindRequestFilter";
 
-    LuaScripting::Locker locker(context.GetLuaScripting());
-    if (locker.GetLua().IsExistingFunction(LUA_CALLBACK))
+    LuaScripting::Lock lock(GetLuaScripting(context));
+
+    if (lock.GetLua().IsExistingFunction(LUA_CALLBACK))
     {
-      LuaFunctionCall call(locker.GetLua(), LUA_CALLBACK);
+      LuaFunctionCall call(lock.GetLua(), LUA_CALLBACK);
       call.PushDicom(query);
       call.PushJson(modality);
       FromDcmtkBridge::ExecuteToDicom(query, call);
@@ -57,8 +79,8 @@
   }
 
 
-  static void FixQuery(DicomMap& query,
-                       ModalityManufacturer manufacturer)
+  static void FixQueryBuiltin(DicomMap& query,
+                              ModalityManufacturer manufacturer)
   {
     /**
      * Introduce patches for specific manufacturers below.
@@ -99,10 +121,10 @@
       // Firstly, fix the content of the query for specific manufacturers
       DicomMap fixed;
       fixed.Assign(query_);
-      FixQuery(fixed, modality_.GetManufacturer());
+      FixQueryBuiltin(fixed, modality_.GetManufacturer());
 
       // Secondly, possibly fix the query with the user-provider Lua callback
-      FixQuery(fixed, context_, modality_.GetApplicationEntityTitle()); 
+      FixQueryLua(fixed, context_, modality_.GetApplicationEntityTitle()); 
 
       GetConnection().Find(answers_, level_, fixed);