Mercurial > hg > orthanc
changeset 2556:91e944c8389b jobs
IJob
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 03 May 2018 10:27:39 +0200 |
parents | 50d80af0719e |
children | b4516a6f214b |
files | UnitTestsSources/MultiThreadingTests.cpp |
diffstat | 1 files changed, 182 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/UnitTestsSources/MultiThreadingTests.cpp Wed May 02 16:00:16 2018 +0200 +++ b/UnitTestsSources/MultiThreadingTests.cpp Thu May 03 10:27:39 2018 +0200 @@ -259,3 +259,185 @@ t.join(); } } + + + + + +#if !defined(ORTHANC_SANDBOXED) +# error The macro ORTHANC_SANDBOXED must be defined +#endif + +#if ORTHANC_SANDBOXED == 1 +# error The job engine cannot be used in sandboxed environments +#endif + +#include <boost/date_time/posix_time/posix_time.hpp> + +namespace Orthanc +{ + enum JobState + { + JobState_Pending, + JobState_Running, + JobState_Success, + JobState_Failure, + JobState_Paused, + JobState_Retry + }; + + enum JobStepStatus + { + JobStepStatus_Success, + JobStepStatus_Error, + JobStepStatus_Continue, + JobStepStatus_Retry + }; + + + class IJobStepResult : public boost::noncopyable + { + private: + JobStepStatus status_; + + public: + explicit IJobStepResult(JobStepStatus status) : + status_(status) + { + } + + virtual ~IJobStepResult() + { + } + + JobStepStatus GetStatus() const + { + return status_; + } + }; + + + class RetryResult : public IJobStepResult + { + private: + unsigned int timeout_; // Retry after "timeout_" milliseconds + + public: + RetryResult(unsigned int timeout) : + IJobStepResult(JobStepStatus_Retry), + timeout_(timeout) + { + } + + unsigned int GetTimeout() const + { + return timeout_; + } + }; + + + class IJob : public boost::noncopyable + { + public: + virtual ~IJob() + { + } + + virtual IJobStepResult* ExecuteStep() = 0; + + virtual void ReleaseResources() = 0; // For pausing jobs + + virtual float GetProgress() = 0; + + virtual void FormatStatus(Json::Value& value) = 0; + }; + + + class JobsMonitor : public boost::noncopyable + { + private: + class JobHandler : public boost::noncopyable + { + private: + std::string id_; + JobState state_; + std::auto_ptr<IJob> job_; + int priority_; // "+inf()" means highest priority + boost::posix_time::ptime creationTime_; + boost::posix_time::ptime lastUpdateTime_; + uint64_t runtime_; // In milliseconds + + public: + JobHandler(IJob* job, + int priority) : + id_(Toolbox::GenerateUuid()), + state_(JobState_Pending), + job_(job), + priority_(priority), + creationTime_(boost::posix_time::microsec_clock::universal_time()), + lastUpdateTime_(creationTime_), + runtime_(0) + { + if (job == NULL) + { + throw OrthancException(ErrorCode_NullPointer); + } + } + + const std::string& GetId() const + { + return id_; + } + }; + + public: + void Submit(std::string& id, + IJob* job, + int priority) + { + std::auto_ptr<JobHandler> handler(new JobHandler(job, priority)); + id = handler->GetId(); + } + + void SetPriority(const std::string& id, + int priority) + { + // TODO + } + + void Pause(const std::string& id) + { + // TODO + } + + void Resume(const std::string& id) + { + // TODO + } + + void Resubmit(const std::string& id) + { + // TODO + } + + class JobToRun : public boost::noncopyable + { + private: + JobHandler* handler_; + + public: + JobToRun(JobsMonitor& that, + unsigned int timeout) : + handler_(NULL) + { + } + + bool IsValid() const + { + return handler_ != NULL; + } + + + }; + }; +}