1 /** 2 * Orthanc - A Lightweight, RESTful DICOM Store 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics 4 * Department, University Hospital of Liege, Belgium 5 * Copyright (C) 2017-2021 Osimis S.A., Belgium 6 * 7 * This program is free software: you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public License 9 * as published by the Free Software Foundation, either version 3 of 10 * the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this program. If not, see 19 * <http://www.gnu.org/licenses/>. 20 **/ 21 22 23 #pragma once 24 25 #include "JobsRegistry.h" 26 27 #include "../Compatibility.h" 28 29 #include <boost/thread.hpp> 30 31 namespace Orthanc 32 { 33 class ORTHANC_PUBLIC JobsEngine : public boost::noncopyable 34 { 35 private: 36 enum State 37 { 38 State_Setup, 39 State_Running, 40 State_Stopping, 41 State_Done 42 }; 43 44 boost::mutex stateMutex_; 45 State state_; 46 std::unique_ptr<JobsRegistry> registry_; 47 boost::thread retryHandler_; 48 unsigned int threadSleep_; 49 std::vector<boost::thread*> workers_; 50 51 bool IsRunning(); 52 53 bool ExecuteStep(JobsRegistry::RunningJob& running, 54 size_t workerIndex); 55 56 static void RetryHandler(JobsEngine* engine); 57 58 static void Worker(JobsEngine* engine, 59 size_t workerIndex); 60 61 public: 62 explicit JobsEngine(size_t maxCompletedJobs); 63 64 ~JobsEngine(); 65 66 JobsRegistry& GetRegistry(); 67 68 void LoadRegistryFromJson(IJobUnserializer& unserializer, 69 const Json::Value& serialized); 70 71 void LoadRegistryFromString(IJobUnserializer& unserializer, 72 const std::string& serialized); 73 74 void SetWorkersCount(size_t count); 75 76 void SetThreadSleep(unsigned int sleep); 77 78 void Start(); 79 80 void Stop(); 81 }; 82 } 83