14#include "arccore/concurrency/ITaskImplementation.h"
16#include "arccore/concurrency/Task.h"
17#include "arccore/concurrency/ParallelFor.h"
18#include "arccore/concurrency/internal/TaskFactoryInternal.h"
20#include "arccore/base/Observable.h"
42 static const int FUNCTOR_CLASS_SIZE =
sizeof(TaskType);
54 m_functor = f->clone(functor_buf, FUNCTOR_CLASS_SIZE);
72 tasks[i]->launchAndWait();
95 char functor_buf[FUNCTOR_CLASS_SIZE];
110 void initialize([[maybe_unused]]
Int32 nb_thread)
override
113 void terminate()
override
137 loop_info.functor()->
executeFunctor(loop_info.beginIndex(), loop_info.size());
143 functor->executeFunctor(loop_ranges);
149 functor->executeFunctor(loop_ranges);
155 functor->executeFunctor(loop_ranges);
161 functor->executeFunctor(loop_ranges);
178 o <<
"NullTaskImplementation";
185NullTaskImplementation NullTaskImplementation::singleton;
186ITaskImplementation* TaskFactory::m_impl = &NullTaskImplementation::singleton;
187Int32 TaskFactory::m_verbose_level = 0;
194 IObservable* global_created_thread_observable = 0;
195 IObservable* global_destroyed_thread_observable = 0;
196 std::mutex global_observable_mutex;
199 _checkCreateGlobalThreadObservable()
201 if (!global_created_thread_observable)
202 global_created_thread_observable =
new Observable();
203 return global_created_thread_observable;
210void TaskFactoryInternal::
213 if (TaskFactory::m_impl && TaskFactory::m_impl != &NullTaskImplementation::singleton)
215 TaskFactory::m_impl = task_impl;
218void TaskFactoryInternal::
221 std::scoped_lock slock(global_observable_mutex);
222 _checkCreateGlobalThreadObservable();
223 global_created_thread_observable->attachObserver(o);
226void TaskFactoryInternal::
229 std::scoped_lock slock(global_observable_mutex);
230 _checkCreateGlobalThreadObservable();
231 global_created_thread_observable->detachObserver(o);
234void TaskFactoryInternal::
237 std::scoped_lock slock(global_observable_mutex);
238 if (global_created_thread_observable)
239 global_created_thread_observable->notifyAllObservers();
251 TaskFactoryInternal::setImplementation(task_impl);
260 std::scoped_lock slock(global_observable_mutex);
261 return _checkCreateGlobalThreadObservable();
270 if (!global_destroyed_thread_observable)
271 global_destroyed_thread_observable =
new Observable();
272 return global_destroyed_thread_observable;
282 if (m_impl == &NullTaskImplementation::singleton)
286 m_impl = &NullTaskImplementation::singleton;
#define ARCCORE_FATAL(...)
Macro throwing a FatalErrorException.
Constant view of an array of type T.
constexpr Integer size() const noexcept
Number of elements in the array.
Loop execution information.
Interface of a functor on a multi-dimensional iteration interval of dimension RankValue.
Interface of an observable.
Interface of a functor on an iteration interval.
virtual void executeFunctor(Int32 begin, Int32 size)=0
Executes the associated method.
virtual void executeFunctor(const TaskContext &tc)=0
Executes the associated method.
Interface for a concurrent task.
void executeParallelFor(const ComplexForLoopRanges< 4 > &loop_ranges, const ForLoopRunInfo &run_info, IMDRangeFunctor< 4 > *functor) override
Executes a 4D loop in parallel.
void printInfos(std::ostream &o) const final
Prints information about the runtime used.
Int32 currentTaskIndex() const override
Implementation of TaskFactory::currentTaskIndex().
void executeParallelFor(Integer begin, Integer size, IRangeFunctor *f) override
Executes the functor f in parallel.
void executeParallelFor(const ComplexForLoopRanges< 3 > &loop_ranges, const ForLoopRunInfo &run_info, IMDRangeFunctor< 3 > *functor) override
Executes a 3D loop in parallel.
void executeParallelFor(const ComplexForLoopRanges< 1 > &loop_ranges, const ForLoopRunInfo &run_info, IMDRangeFunctor< 1 > *functor) override
Executes a 1D loop in parallel.
void executeParallelFor(const ComplexForLoopRanges< 2 > &loop_ranges, const ForLoopRunInfo &run_info, IMDRangeFunctor< 2 > *functor) override
Executes a 2D loop in parallel.
void executeParallelFor(const ParallelFor1DLoopInfo &loop_info) override
Executes the loop loop_info in parallel.
ITask * createRootTask(ITaskFunctor *f) override
Creates a root task. The implementation must copy the value of f, which is either a TaskFunctor or a ...
bool isActive() const override
Indicates if the implementation is active.
void executeParallelFor(Integer begin, Integer size, Integer block_size, IRangeFunctor *f) override
Executes the functor f in parallel.
Int32 currentTaskThreadIndex() const override
Implementation of TaskFactory::currentTaskThreadIndex().
void executeParallelFor(Integer begin, Integer size, const ParallelLoopOptions &options, IRangeFunctor *f) override
Executes the functor f in parallel.
Base class of an observable.
Characteristics of a multi-thread 1D loop.
Execution options for a parallel loop in multi-threading.
void wait() override
Method allowing to wait the end of the task.
void launchAndWait() override
Launches the task and blocks until it finishes.
void launch() override
Method allowing to launch the task.
void launchAndWait(ConstArrayView< ITask * > tasks) override
Launches the child tasks tasks and blocks until they finish.
Execution context of a task.
static IObservable * destroyThreadObservable()
Observable called when a thread is destroyed for a task.
static IObservable * createThreadObservable()
Observable called when a thread is created for a task.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.
std::int32_t Int32
Signed integer type of 32 bits.