Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ArcaneMain.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ArcaneMain.h (C) 2000-2025 */
9/* */
10/* Class managing execution. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_IMPL_ARCANEMAIN_H
13#define ARCANE_IMPL_ARCANEMAIN_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/List.h"
18#include "arcane/utils/IFunctor.h"
19#include "arcane/core/IArcaneMain.h"
20
21#include <atomic>
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32class ApplicationInfo;
33class IMainFactory;
34class IApplication;
35class ICodeService;
36class ServiceFactoryInfo;
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43class ARCANE_IMPL_EXPORT ArcaneMainExecutionOverrideFunctor
44{
45 friend class ArcaneMain;
46 friend class ArcaneMainExecInfo;
47
48 public:
49
50 explicit ArcaneMainExecutionOverrideFunctor(IFunctor* functor)
51 : m_functor(functor)
52 , m_application(nullptr)
53 {}
54 IFunctor* functor() { return m_functor; }
55 IApplication* application() { return m_application; }
56
57 private:
58
59 IFunctor* m_functor;
60 IApplication* m_application;
61};
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66class ARCANE_IMPL_EXPORT IApplicationBuildInfoVisitor
67{
68 public:
69
71
72 public:
73
74 virtual void visit(ApplicationBuildInfo& app_build_info) = 0;
75};
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
87class ARCANE_IMPL_EXPORT ArcaneMain
88: public IArcaneMain
89{
90 friend class ArcaneMainExecInfo;
91 friend class ArcaneLauncher;
92 friend class ArcaneMainAutoDetectRuntimeHelper;
93 class Impl;
94
95 public:
96
97 // TODO: to be removed.
98 ArcaneMain(const ApplicationInfo& infos, IMainFactory* factory);
99
100 public:
101
102 ArcaneMain(const ApplicationInfo& app_info, IMainFactory* factory,
103 const ApplicationBuildInfo& app_build_info,
104 const DotNetRuntimeInitialisationInfo& dotnet_init_info,
105 const AcceleratorRuntimeInitialisationInfo& accelerator_init_info);
106 ~ArcaneMain() override;
107
108 public:
109
139 static int arcaneMain(const ApplicationInfo& app_info, IMainFactory* factory = nullptr);
140
148 static int run();
149
160 static void arcaneInitialize();
161
173 static void arcaneFinalize();
174
181 static void setHasGarbageCollector();
182
189 static void setHasDotNETRuntime();
190
199 static void setDefaultMainFactory(IMainFactory* mf);
200
211
219
227
235
252
253 static int callFunctorWithCatchedException(IFunctor* functor, IArcaneMain* amain,
254 bool* clean_abort,
255 bool is_print = true);
256
270
272 static bool hasDotNetWrapper();
273
281
282 public:
283
289 static void addServiceFactoryInfo(IServiceFactoryInfo* factory);
290
296 static void addModuleFactoryInfo(IModuleFactoryInfo* factory);
297
298 public:
299
307
308 public:
309
310 static void redirectSignals();
311 static bool isMasterIO() { return m_is_master_io; }
312 static void setUseTestLogger(bool v);
313
314 public:
315
316 void build() override;
317 void initialize() override;
318 bool parseArgs(StringList args) override;
319 int execute() override;
320 void doAbort() override;
321 void setErrorCode(int errcode) override;
322 int errorCode() const override { return m_error_code; }
323 void finalize() override {}
324
325 public:
326
327 const ApplicationInfo& applicationInfo() const override;
328 const ApplicationBuildInfo& applicationBuildInfo() const override;
329 const DotNetRuntimeInitialisationInfo& dotnetRuntimeInitialisationInfo() const override;
330 const AcceleratorRuntimeInitialisationInfo& acceleratorRuntimeInitialisationInfo() const override;
331 IMainFactory* mainFactory() const override { return m_main_factory; }
332 IApplication* application() const override { return m_application; }
333 ServiceFactoryInfoCollection registeredServiceFactoryInfos() override;
334 ModuleFactoryInfoCollection registeredModuleFactoryInfos() override;
335 bool hasGarbageCollector() const override { return m_has_garbage_collector; }
336 void setDirectExecuteFunctor(IDirectSubDomainExecuteFunctor* f) override { m_direct_sub_domain_execute_functor = f; }
337 IDirectSubDomainExecuteFunctor* _directExecuteFunctor() const { return m_direct_sub_domain_execute_functor; }
338
339 protected:
340
341 IApplication* _application() { return m_application; }
342 ApplicationBuildInfo& _applicationBuildInfo();
343 static int _internalRun(IDirectSubDomainExecuteFunctor* func);
344
345 private:
346
347 Impl* m_p;
348 IMainFactory* m_main_factory = nullptr;
349 IApplication* m_application = nullptr;
350 int m_error_code = 0;
351 IDirectSubDomainExecuteFunctor* m_direct_sub_domain_execute_functor = nullptr;
352 static bool m_has_garbage_collector;
353 static bool m_is_master_io;
354 static bool m_is_use_test_logger;
355 static IMainFactory* m_default_main_factory;
356 static ArcaneMainExecutionOverrideFunctor* m_exec_override_functor;
357
358 private:
359
360 static int _arcaneMain(const ApplicationInfo&, IMainFactory*);
361 void _dumpHelp();
362 void _parseApplicationBuildInfoArgs();
364 static std::atomic<Int32> m_nb_arcane_init;
366 static std::atomic<Int32> m_is_init_done;
367 static void _launchMissingInitException();
368 static void _checkHasInit();
369 static int _runDotNet();
370 static void _checkAutoDetectMPI();
371 static int _checkAutoDetectAccelerator(bool& has_accelerator);
372 static void _setArcaneLibraryPath();
373 static int _initRuntimes();
374 static int _checkTestLoggerResult();
375};
376
377/*---------------------------------------------------------------------------*/
378/*---------------------------------------------------------------------------*/
379
380} // End namespace Arcane
381
382/*---------------------------------------------------------------------------*/
383/*---------------------------------------------------------------------------*/
384
385#endif
Information for constructing an instance of IApplication.
Application information.
Execution information.
static int arcaneMain(const ApplicationInfo &app_info, IMainFactory *factory=nullptr)
Entry point of the executable in Arcane.
static ApplicationBuildInfo & defaultApplicationBuildInfo()
Information for accelerator initialization.
static AcceleratorRuntimeInitialisationInfo & defaultAcceleratorRuntimeInitialisationInfo()
Information for accelerator initialization.
static std::atomic< Int32 > m_nb_arcane_init
Number of times arcaneInitialize() has been called.
Definition ArcaneMain.h:364
static DotNetRuntimeInitialisationInfo & defaultDotNetRuntimeInitialisationInfo()
Information for .Net runtime initialization.
static void arcaneInitialize()
Initializes Arcane.
static void addApplicationBuildInfoVisitor(IApplicationBuildInfoVisitor *visitor)
Adds a visitor to fill ApplicationBuildInfo.
static int _checkAutoDetectAccelerator(bool &has_accelerator)
Detects and loads accelerator runtime management.
static void arcaneFinalize()
Terminates Arcane usage.
static Real initializationTimeForAccelerator()
Returns the time (in seconds) for the initialization of accelerator runtimes for this process.
bool hasGarbageCollector() const override
Indicates that certain objects are managed via a garbage collector.
Definition ArcaneMain.h:335
static int callFunctorWithCatchedException(IFunctor *functor, IArcaneMain *amain, bool *clean_abort, bool is_print=true)
Calls the functor functor while catching possible exceptions.
void setErrorCode(int errcode) override
Sets the return code.
void finalize() override
Performs the last operations before instance destruction.
Definition ArcaneMain.h:323
static void setHasDotNETRuntime()
Indicates that we are running in the .NET runtime.
IApplication * application() const override
Application.
Definition ArcaneMain.h:332
static void setHasGarbageCollector()
Indicates that certain objects are managed by a garbage collector.
static std::atomic< Int32 > m_is_init_done
1 if init finished, 0 otherwise
Definition ArcaneMain.h:366
static int run()
Entry point of the executable in Arcane.
static void addServiceFactoryInfo(IServiceFactoryInfo *factory)
Adds a service factory.
void build() override
Constructs the class members. The instance is not usable until this method has been called....
static ApplicationInfo & defaultApplicationInfo()
Default application info.
static void setExecuteOverrideFunctor(ArcaneMainExecutionOverrideFunctor *functor)
static bool hasDotNetWrapper()
Indicates if a '.Net' assembly is being executed from a C++ main.
int execute() override
Starts execution. This method only returns when the program exits.
void doAbort() override
Performs an abort.
int errorCode() const override
Execution error code.
Definition ArcaneMain.h:322
static void setDefaultMainFactory(IMainFactory *mf)
Sets the default factory.
void initialize() override
Initializes the instance. The instance is not usable until this method has been called.
IMainFactory * mainFactory() const override
Main factory.
Definition ArcaneMain.h:331
bool parseArgs(StringList args) override
Parses arguments.
static void addModuleFactoryInfo(IModuleFactoryInfo *factory)
Adds a module factory.
Information for the initialization of the '.Net' runtime.
Application interface.
Interface of the code management class.
Definition IArcaneMain.h:55
Interface of a case loader.
Interface of a functor to execute code directly after the creation of a subdomain without going throu...
Factory for Arcane classes.
Information about a module factory.
Information about a service factory.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Collection< IServiceFactoryInfo * > ServiceFactoryInfoCollection
Collection of service factory information.
List< String > StringList
Unicode string list.
Definition UtilsTypes.h:509
Collection< IModuleFactoryInfo * > ModuleFactoryInfoCollection
Collection of module factory information.
double Real
Type representing a real number.