annotate Framework/MultiThreading/BagOfTasksProcessor.cpp @ 214:1e864138f0da

upgrade to year 2021
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 06 Jan 2021 18:10:07 +0100
parents a1c265cb2174
children b0ee417b667a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
151
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
214
1e864138f0da upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 199
diff changeset
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium
151
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * modify it under the terms of the GNU Affero General Public License
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * as published by the Free Software Foundation, either version 3 of
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * the License, or (at your option) any later version.
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 *
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * This program is distributed in the hope that it will be useful, but
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * Affero General Public License for more details.
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 *
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * You should have received a copy of the GNU Affero General Public License
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 **/
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 #include "BagOfTasksProcessor.h"
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
199
a1c265cb2174 replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 192
diff changeset
24 #include <Compatibility.h> // For std::unique_ptr
192
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 175
diff changeset
25 #include <Logging.h>
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 175
diff changeset
26 #include <OrthancException.h>
151
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 #include <stdio.h>
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 namespace Orthanc
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 class BagOfTasksProcessor::Task : public IDynamicObject
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 private:
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 uint64_t bag_;
199
a1c265cb2174 replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 192
diff changeset
36 std::unique_ptr<ICommand> command_;
151
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 public:
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 Task(uint64_t bag,
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 ICommand* command) :
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 bag_(bag),
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 command_(command)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 bool Execute()
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 try
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 return command_->Execute();
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 catch (OrthancException& e)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 LOG(ERROR) << "Exception while processing a bag of tasks: " << e.What();
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 return false;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 catch (std::runtime_error& e)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 LOG(ERROR) << "Runtime exception while processing a bag of tasks: " << e.what();
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 return false;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 catch (...)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 LOG(ERROR) << "Native exception while processing a bag of tasks";
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 return false;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 uint64_t GetBag()
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 return bag_;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 };
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 void BagOfTasksProcessor::SignalProgress(Task& task,
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 Bag& bag)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 assert(bag.done_ < bag.size_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 bag.done_ += 1;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 if (bag.done_ == bag.size_)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 exitStatus_[task.GetBag()] = (bag.status_ == BagStatus_Running);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 bagFinished_.notify_all();
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 void BagOfTasksProcessor::Worker(BagOfTasksProcessor* that)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 while (that->continue_)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
199
a1c265cb2174 replacing deprecated std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 192
diff changeset
94 std::unique_ptr<IDynamicObject> obj(that->queue_.Dequeue(100));
151
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 if (obj.get() != NULL)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 Task& task = *dynamic_cast<Task*>(obj.get());
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 boost::mutex::scoped_lock lock(that->mutex_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 Bags::iterator bag = that->bags_.find(task.GetBag());
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 assert(bag != that->bags_.end());
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 assert(bag->second.done_ < bag->second.size_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 if (bag->second.status_ != BagStatus_Running)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 // Do not execute this task, as its parent bag of tasks
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 // has failed or is tagged as canceled
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 that->SignalProgress(task, bag->second);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 continue;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 bool success = task.Execute();
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 boost::mutex::scoped_lock lock(that->mutex_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 Bags::iterator bag = that->bags_.find(task.GetBag());
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 assert(bag != that->bags_.end());
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 if (!success)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 bag->second.status_ = BagStatus_Failed;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 that->SignalProgress(task, bag->second);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 void BagOfTasksProcessor::Cancel(int64_t bag)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 boost::mutex::scoped_lock lock(mutex_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 Bags::iterator it = bags_.find(bag);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 if (it != bags_.end())
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 it->second.status_ = BagStatus_Canceled;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 bool BagOfTasksProcessor::Join(int64_t bag)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 boost::mutex::scoped_lock lock(mutex_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 while (continue_)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 ExitStatus::iterator it = exitStatus_.find(bag);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 if (it == exitStatus_.end()) // The bag is still running
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 bagFinished_.wait(lock);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 else
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 bool status = it->second;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 exitStatus_.erase(it);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 return status;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 return false; // The processor is stopping
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 float BagOfTasksProcessor::GetProgress(int64_t bag)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 boost::mutex::scoped_lock lock(mutex_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 Bags::const_iterator it = bags_.find(bag);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 if (it == bags_.end())
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 // The bag of tasks has finished
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 return 1.0f;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 else
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 return (static_cast<float>(it->second.done_) /
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 static_cast<float>(it->second.size_));
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 bool BagOfTasksProcessor::Handle::Join()
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 if (hasJoined_)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 return status_;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 else
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 status_ = that_.Join(bag_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 hasJoined_ = true;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 return status_;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 BagOfTasksProcessor::BagOfTasksProcessor(size_t countThreads) :
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 countBags_(0),
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 continue_(true)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 if (countThreads == 0)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 throw OrthancException(ErrorCode_ParameterOutOfRange);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 threads_.resize(countThreads);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 for (size_t i = 0; i < threads_.size(); i++)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 threads_[i] = new boost::thread(Worker, this);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 BagOfTasksProcessor::~BagOfTasksProcessor()
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 continue_ = false;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 bagFinished_.notify_all(); // Wakes up all the pending "Join()"
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 for (size_t i = 0; i < threads_.size(); i++)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 if (threads_[i])
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 if (threads_[i]->joinable())
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 threads_[i]->join();
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 delete threads_[i];
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 threads_[i] = NULL;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 BagOfTasksProcessor::Handle* BagOfTasksProcessor::Submit(BagOfTasks& tasks)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 if (tasks.GetSize() == 0)
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 return new Handle(*this, 0, true);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 boost::mutex::scoped_lock lock(mutex_);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 uint64_t id = countBags_;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 countBags_ += 1;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 Bag bag(tasks.GetSize());
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 bags_[id] = bag;
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 while (!tasks.IsEmpty())
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 {
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 queue_.Enqueue(new Task(id, tasks.Pop()));
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 return new Handle(*this, id, false);
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 }
fb8d4cd2f618 fix applications
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 }