16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/Iterator.h"
18#include "arcane/utils/List.h"
19#include "arcane/utils/ScopedPtr.h"
20#include "arcane/utils/Deleter.h"
21#include "arcane/utils/PlatformUtils.h"
22#include "arcane/utils/ValueConvert.h"
23#include "arcane/utils/OStringStream.h"
24#include "arcane/utils/ITraceMng.h"
25#include "arcane/utils/TraceClassConfig.h"
26#include "arcane/utils/IMemoryInfo.h"
27#include "arcane/utils/IStackTraceService.h"
28#include "arcane/utils/ISymbolizerService.h"
29#include "arcane/utils/IProcessorAffinityService.h"
30#include "arcane/utils/IOnlineDebuggerService.h"
31#include "arcane/utils/StringBuilder.h"
32#include "arcane/utils/IProfilingService.h"
33#include "arcane/utils/IThreadImplementationService.h"
34#include "arccore/base/internal/IDynamicLibraryLoader.h"
35#include "arcane/utils/IPerformanceCounterService.h"
36#include "arcane/utils/ITraceMngPolicy.h"
37#include "arcane/utils/JSONReader.h"
38#include "arcane/utils/Profiling.h"
40#include "arccore/base/internal/DependencyInjection.h"
42#include "arccore/concurrency/internal/ConcurrencyApplication.h"
44#include "arcane/core/ArcaneVersion.h"
45#include "arcane/core/ISubDomain.h"
46#include "arcane/core/IIOMng.h"
47#include "arcane/core/IXmlDocumentHolder.h"
48#include "arcane/core/IParallelSuperMng.h"
49#include "arcane/core/IMainFactory.h"
50#include "arcane/core/IArcaneMain.h"
51#include "arcane/core/IRessourceMng.h"
52#include "arcane/core/IServiceLoader.h"
53#include "arcane/core/IServiceMng.h"
54#include "arcane/core/ICodeService.h"
55#include "arcane/core/ISession.h"
56#include "arcane/core/IDataFactory.h"
57#include "arcane/core/IDataFactoryMng.h"
58#include "arcane/core/IXmlDocumentHolder.h"
59#include "arcane/core/XmlNode.h"
60#include "arcane/core/XmlNodeList.h"
61#include "arcane/core/ItemTypeMng.h"
63#include "arcane/core/IPhysicalUnitSystemService.h"
64#include "arcane/core/ServiceBuilder.h"
65#include "arcane/core/Configuration.h"
66#include "arcane/core/Directory.h"
67#include "arcane/core/IServiceAndModuleFactoryMng.h"
68#include "arcane/core/ApplicationBuildInfo.h"
70#include "arcane/core/IItemEnumeratorTracer.h"
71#include "arcane/impl/Application.h"
72#include "arcane/impl/ConfigurationReader.h"
73#include "arcane/impl/ArcaneMain.h"
78#include "arcane/core/Item.h"
79#include "arcane/core/IndexedItemConnectivityView.h"
80#include "arcane/core/UnstructuredMeshConnectivity.h"
82#include "arccore_version.h"
97extern "C++" ARCANE_UTILS_EXPORT
void
98arcaneSetPauseOnError(
bool v);
104createNullPhysicalUnitSystemService();
106arcaneCreateConfigurationMng(
ITraceMng* tm);
108arcaneCreateServiceAndModuleFactoryMng(
ITraceMng* tm);
113extern "C++" ARCANE_CORE_EXPORT
void
136 for (
const String& s : slist)
141 _stringListToCoreArray(
const StringList& slist)
144 for (
const String& s : slist)
154class Application::CoreApplication
158 void setTraceMng(ReferenceCounter<ITraceMng> tm) { m_trace = tm; }
159 void setCoreServices(
const ApplicationCoreBuildInfo& build_info);
161 template <
typename InterfaceType> Ref<InterfaceType>
162 tryCreateServiceUsingInjector(
const StringList& names, String* found_name,
bool has_trace);
166 ReferenceCounter<ITraceMng> m_trace;
167 Ref<IStackTraceService> m_stack_trace_service;
168 Ref<ISymbolizerService> m_symbolizer_service;
169 Ref<IThreadImplementationService> m_thread_implementation_service;
170 Ref<IThreadImplementation> m_thread_implementation;
171 Ref<ITaskImplementation> m_task_implementation;
173 String m_used_thread_service_name;
175 String m_used_task_service_name;
189, m_namespace_uri(arcaneNamespaceURI())
190, m_local_name(
"Application")
197 m_core_application = std::make_unique<ConcurrencyApplication>();
214 m_core_application->m_task_implementation.reset();
232 delete m_service_and_module_factory_mng;
236 delete m_configuration_mng;
239 m_owned_sequential_parallel_super_mng.reset();
249 delete m_trace_policy;
303 DependencyInjection::Injector injector;
304 injector.fillWithGlobalFactories();
311 auto t = injector.createInstance<InterfaceType>(s,
true);
341 Int32 output_level = build_info.outputLevel();
342 if (output_level != Trace::UNSPECIFIED_VERBOSITY_LEVEL) {
343 m_trace_policy->setVerbosityLevel(output_level);
344 m_trace_policy->setStandardOutputVerbosityLevel(output_level);
346 Int32 verbosity_level = build_info.verbosityLevel();
347 if (verbosity_level != Trace::UNSPECIFIED_VERBOSITY_LEVEL) {
348 m_trace_policy->setVerbosityLevel(verbosity_level);
351 bool has_output_file = build_info.isMasterHasOutputFile();
352 m_trace_policy->setIsMasterHasOutputFile(has_output_file);
357 Int32 minimal_verbosity_level = build_info.minimalVerbosityLevel();
358 if (minimal_verbosity_level == Trace::UNSPECIFIED_VERBOSITY_LEVEL)
359 minimal_verbosity_level = Trace::DEFAULT_VERBOSITY_LEVEL;
360 m_trace_policy->setDefaultVerboseLevel(
m_trace.get(), minimal_verbosity_level);
363 arcaneGlobalMemoryInfo()->setTraceMng(
traceMng());
367 m_trace->info(4) <<
"*** Initialization informations:";
372 if (dynamic_library_loader) {
374#ifdef ARCANE_OS_WIN32
391 m_trace->info(4) <<
"Adding '" << os_dir <<
"' to search library path";
393 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
394 AddDllDirectory(wide_os_dir.c_str());
399 m_trace->info(4) <<
"*** Trying to load dynamic library: " << name;
402 m_trace->info(4) <<
"WARNING: Can not load library '" << name <<
"'";
406#ifdef ARCANE_OS_WIN32
407 if (dynamic_library_loader) {
411 String dyn_lib_names[5] = {
418 for (
Integer i = 0; i < 5; ++i)
419 dynamic_library_loader->
open(os_dir, dyn_lib_names[i]);
423 m_configuration_mng = arcaneCreateConfigurationMng(
traceMng());
426 m_service_and_module_factory_mng = arcaneCreateServiceAndModuleFactoryMng(
traceMng());
428 m_service_and_module_factory_mng->addGlobalFactory(*i);
430 m_service_and_module_factory_mng->addGlobalFactory(*i);
432 m_service_and_module_factory_mng->createAllServiceRegistererFactories();
438 if (!pause_on_error.
null())
439 arcaneSetPauseOnError(
true);
442 m_core_application->setTraceMng(
m_trace);
444 auto task_names = _stringListToCoreArray(b.taskImplementationServices());
445 auto thread_names = _stringListToCoreArray(b.threadImplementationServices());
446 Int32 nb_task_thread = b.nbTaskThread();
448 m_core_application->setCoreServices(c);
457 if (!profile_str.
null()) {
461 m_profiling_service = sv;
465 ARCANE_FATAL(
"Can not find profiling service (name='{0}')", profile_str);
474 m_online_debugger = sv;
484 auto sv = _tryCreateServiceUsingInjector<IProcessorAffinityService>(names, &found_name,
m_trace.get());
486 m_processor_affinity_service = sv;
490 m_trace->info(4) <<
"Can not find implementation for IProcessorAffinityService "
491 <<
"(names=" << _stringListToArray(names) <<
").";
496 String message_passing_service = build_info.messagePassingService();
497 if (message_passing_service.
null())
498 message_passing_service = build_info.internalDefaultMessagePassingService();
502 ARCANE_FATAL(
"Can not find message passing service '{0}'", message_passing_service);
508 if (sm->isParallel()) {
510 seq_sm = m_owned_sequential_parallel_super_mng.get();
512 ARCANE_FATAL(
"Can not find service 'SequentialParallelSuperMng'");
557 m_trace_policy->setIsParallel(is_parallel);
558 m_trace_policy->setIsDebug(is_debug);
559 bool is_parallel_output = is_parallel && is_debug;
564 is_parallel_output =
true;
566 is_parallel_output =
false;
568 m_trace_policy->setIsParallelOutput(is_parallel_output);
576#ifdef ARCANE_CHECK_MEMORY
577 arcaneGlobalMemoryInfo()->setTraceMng(
m_trace);
588 m_trace->warning() <<
"Application is already initialised";
598 m_trace_policy->setDefaultClassConfigXmlBuffer(userConfigBuffer());
601 m_trace->logdate() <<
"Begin execution.";
604 m_trace->info() <<
"WARNING: Execution in DEBUG mode!";
607 m_trace->info() <<
"WARNING: Compilation in CHECK mode !";
613 if (!check_str.
null()) {
614 bool is_check = check_str !=
"0";
615 m_trace->info() <<
"WARNING: Setting CHECK mode to " << is_check;
619 m_trace->info() <<
"WARNING: Execution in CHECK mode!";
623 m_trace->info() <<
"WARNING: Execution in TRACE mode !";
626 m_trace->info() <<
"Using 64bits version!";
629 m_trace->info() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
630 m_trace->info() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
642 m_trace->info() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
643 m_trace->info() <<
"** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
646 m_trace->info() <<
"ArccoreVersion: " << ARCCORE_VERSION_STR_FULL;
647 m_trace->info() <<
"ArcaneVersion: " << ARCANE_VERSION_STR_FULL
654 m_trace->info() <<
"Stack trace service is available";
657 m_trace->info() <<
"Symbolizer service is available";
660#ifdef ARCANE_USE_LIBXML2
661 m_trace->info() <<
"Using 'libxml2' for XML parsing";
674 m_trace->info() <<
"Hyoda service is now hooked";
677 m_trace->info() <<
"Unknown online debugger service";
683 _readCodeConfigurationFile();
691 ByteConstSpan runtime_config =
m_exe_info.runtimeConfigFileContent();
692 if (!runtime_config.empty()) {
693 m_trace->info() <<
"Reading configuration parameters from runtime config file";
695 jdoc.
parse(runtime_config);
704 if (!configuration_elem.
null()) {
705 m_trace->info() <<
"Reading configuration parameters from code config file";
712 _initDataInitialisationPolicy();
715 if (!m_core_application->m_used_thread_service_name.null())
716 m_trace->info() <<
"Service used for thread management : '" << m_core_application->m_used_thread_service_name <<
"'";
718 m_trace->info() <<
"No thread management active";
720 if (!m_core_application->m_used_task_service_name.null()) {
721 m_trace->info() <<
"Service used for task management : '" << m_core_application->m_used_task_service_name
723 std::ostringstream ostr;
725 m_trace->info() <<
"TaskManagement infos:" << ostr.str();
728 m_trace->info() <<
"No task management active";
734 String service_name =
"Udunits";
737 m_trace->info() <<
"UnitSystem service found name=" << service_name;
740 m_trace->info() <<
"No unit system service found";
741 sv =
makeRef(createNullPhysicalUnitSystemService());
743 m_physical_unit_system_service = sv;
748 String service_name =
"LinuxPerfPerformanceCounterService";
750 if (!env_service_name.
null())
751 service_name = env_service_name +
"PerformanceCounterService";
754 m_performance_counter_service = p;
756 m_trace->info() <<
"PerformanceCounterService found name=" << service_name;
759 m_trace->info() <<
"No performance counter service found";
765 bool force_tracer =
false;
770 auto p = m_performance_counter_service;
772 m_trace->info() <<
"Enumerator tracing is enabled";
774 arcaneSetSingletonItemEnumeratorTracer(tracer);
779 m_trace->info() <<
"WARNING: enumerator tracing is not available because no performance counter service is available.";
782 m_trace->info() <<
"WARNING: enumerator tracing is not available when using multi-tasking.";
796 <<
" ItemEnumeratorVersion=" << ItemEnumerator::version();
802 if (init_time_accelerator != 0.0)
803 m_trace->info() <<
"Time (in ms) to initialize Accelerators = " << init_time_accelerator;
811_readCodeConfigurationFile()
825 bool use_config_file =
true;
826 if (config_file_name.
null()) {
827 use_config_file =
false;
829 else if (config_file_name.
empty()) {
845 m_trace->info() <<
"Using configuration file in current directory.";
848 config_file_name = buf.toString();
850 m_trace->info() <<
"Using configuration file: '" << config_file_name <<
"'";
852 if (use_config_file) {
855 ARCANE_FATAL(
"Can not read configuration file '{0}'", config_file_name);
858 ARCANE_FATAL(
"Can not parse configuration file '{0}'", config_file_name);
873 String buf = user_config_dir.
file(
"config.xml");
879 m_trace->log() <<
"No user configuration file '" << buf <<
"'";
886 m_trace->log() <<
"Can not parse user configuration file '" << buf <<
"'";
903 if ((*j) == extension)
923 bool has_arc_extension =
false;
924 for (
Integer i = 0, n = services.size(); i < n; ++i) {
926 if (_hasExtension(code_service,
"arc")) {
927 has_arc_extension =
true;
931 if (!has_arc_extension) {
932 services.add(createArcaneCodeService(
this));
938 std::size_t extension_pos = fview.find_last_of(
'.');
939 if (extension_pos == std::string_view::npos)
941 fview.remove_prefix(extension_pos + 1);
945 for (
const auto& code_service : services) {
948 if (case_ext == (*j)) {
949 found_service = code_service;
953 if (found_service.
get())
957 return found_service;
984 return m_service_and_module_factory_mng->serviceFactories2();
993 return m_service_and_module_factory_mng->moduleFactoryInfos();
1000_initDataInitialisationPolicy()
1004 bool is_changed =
false;
1005 if (data_init_policy ==
"DEFAULT") {
1009 else if (data_init_policy ==
"NAN") {
1013 else if (data_init_policy ==
"NONE") {
1017 else if (data_init_policy ==
"LEGACY") {
1021 else if (data_init_policy ==
"NAN_AND_DEFAULT") {
1028 m_trace->info() <<
"Change data initialisation policy: " << data_init_policy
1029 <<
" (" << (int)init_policy <<
")";
1031 m_trace->info() <<
"Data initialisation policy is : " << (int)init_policy;
1040 return m_arcane_main->applicationBuildInfo();
1049 return m_arcane_main->dotnetRuntimeInitialisationInfo();
1058 return m_arcane_main->acceleratorRuntimeInitialisationInfo();
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Classes, Types, and macros for managing concurrency.
Utility functions for character strings.
std::wstring convertToStdWString(const String &str)
Returns the conversion of str to std::wstring.
Information for accelerator initialization.
Information for constructing an instance of IApplication.
String configFileName() const
Name of the code configuration file.
const String & dataDir() const
Returns the path where data files are located.
const String & codeName() const
Returns the name of the calculation code linked to the application.
bool isDebug() const
Returns true if running in debug mode.
String m_user_config_path
User configuration directory.
void _openUserConfig()
Analyzes the user configuration file.
ReferenceCounter< ITraceMng > m_trace
Trace manager.
~Application() override
Destroys the manager.
ModuleFactoryInfoCollection m_main_module_factory_infos
Array of module factories.
IDataFactory * dataFactory() override
Data factory.
ScopedPtrT< IXmlDocumentHolder > m_config_document
Configuration DOM tree.
const ApplicationBuildInfo & applicationBuildInfo() const override
Instance build parameter information.
ApplicationInfo m_exe_info
Executable information.
String m_major_and_minor_version_str
Version M.m.
ITraceMngPolicy * getTraceMngPolicy() override
Trace manager configuration policy.
String m_version_str
Configuration info.
ITraceMng * createAndInitializeTraceMng(ITraceMng *parent_trace, const String &file_suffix) override
Creates and initializes an instance of ITraceMng.
IMainFactory * m_main_factory
Main factory.
const DotNetRuntimeInitialisationInfo & dotnetRuntimeInitialisationInfo() const override
'.Net' runtime initialization information.
IMainFactory * mainFactory() const override
Main factory.
SessionList m_sessions
List of sessions.
Ref< InterfaceType > _tryCreateService(const StringList &names, String *found_name)
const AcceleratorRuntimeInitialisationInfo & acceleratorRuntimeInitialisationInfo() const override
Runtime initialization information for accelerators.
String m_user_name
User name.
IRessourceMng * m_ressource_mng
Resource manager.
const ApplicationInfo & applicationInfo() const override
Executable information.
IDataFactoryMng * dataFactoryMng() const override
Data factory.
XmlNode m_user_config_root_element
User configuration root element.
String m_main_version_str
Version in Major.minor.beta format.
void initialize() override
Initializes the instance. The instance is not usable until this method has been called.
ModuleFactoryInfoCollection moduleFactoryInfos() override
List of module factory information.
UniqueArray< Byte > m_user_config_bytes
File containing the user configuration.
bool m_is_init
true if already initialized
void build() override
Constructs the instance members. The instance is not usable until this method has been called....
ITraceMng * traceMng() const override
Trace manager.
XmlNode m_config_root_element
Configuration root element.
String m_application_name
Application name.
String m_targetinfo_str
Configuration info.
ScopedPtrT< IXmlDocumentHolder > m_user_config_document
User configuration DOM tree.
ServiceFactoryInfoCollection m_main_service_factory_infos
Array of service factories.
ServiceFactory2Collection serviceFactories2() override
List of service factories.
bool hasGarbageCollector() const override
Indicates that certain objects are managed via a garbage collector.
Ref< ICodeService > getCodeService(const String &file_name) override
Returns the case loader corresponding to the file given by file_name.
Ref< IParallelSuperMng > m_parallel_super_mng
Parallelism manager.
IServiceMng * m_service_mng
Service manager.
void removeSession(ISession *s) override
Removes the session session.
IIOMng * m_io_mng
Input/output manager.
UniqueArray< Byte > m_config_bytes
File containing the configuration.
void addSession(ISession *s) override
Adds the session session.
Ref< IDataFactoryMng > m_data_factory_mng
Data factory.
IParallelSuperMng * m_sequential_parallel_super_mng
Sequential parallelism manager.
Application(IArcaneMain *)
Constructs a supervisor with execution information, e.g.
IParallelSuperMng * parallelSuperMng() override
Supervisory parallelism manager.
static Real initializationTimeForAccelerator()
Returns the time (in seconds) for the initialization of accelerator runtimes for this process.
EnumeratorT< String > Enumerator
Configuration file readers.
void addValuesFromXmlNode(const XmlNode &element, Integer priority)
Adds values to the configuration.
void addValuesFromJSON(const JSONValue &jv, Integer priority)
Adds values to the configuration.
Template class for converting a type.
Utility class for destroying objects allocated by new.
Class managing a directory.
String file(const String &file_name) const override
Returns the full path of the file file_name in the directory.
String path() const override
Returns the path of the directory.
Information for the initialization of the '.Net' runtime.
Interface of the code management class.
Interface of a case loader.
virtual StringCollection validExtensions() const =0
Returns the list of file extensions processed by the instance. The extension does not include the '....
Interface of the data factory manager.
Interface of a data factory.
Interface of a dynamic library loader.
virtual IDynamicLibrary * open(const String &directory, const String &name)=0
Loads a dynamic library.
static IDynamicLibraryLoader * getDefault()
Service used for dynamically loading libraries.
Interface of a dynamic library.
virtual ITraceMng * createTraceMng()=0
Creates a trace manager.
Abstract class of the parallelism supervisor.
virtual bool isParallel() const =0
Returns true if the execution is parallel.
virtual void initialize()=0
Initializes the instance.
Interface of a service managing a unit system.
Interface of a CPU core affinity management service.
virtual void printInfos()=0
Displays complete topology information via info().
static IRessourceMng * createDefault(IApplication *)
Creation of a default history manager.
Interface of a service and module factory manager.
Interface for a case execution session.
Interface for the configuration manager of a trace manager.
virtual void initializeTraceMng(ITraceMng *trace, Int32 rank)=0
Initializes trace.
Manager of a DOM document.
virtual XmlNode documentNode()=0
Document node. This node is null if the document does not exist.
Internal array for Arccore.
Base class for a view on unstructured connectivity.
Views of containers holding connectivity. This class allows the containers used to be opaque outside ...
Connectivity information, for an entity family, allowing transition between old and new connectivity ...
Internal structure of a mesh entity.
Index of an Item in a variable.
Internal shared structure of a mesh entity.
void build(IParallelSuperMng *parallel_mng, ITraceMng *trace)
Effective constructor.
static ItemTypeMng * _singleton()
Singleton instance of the type.
Iterator for the ItemVectorView class.
View on a vector of entities.
Base class for a mesh element.
Management of a JSON document.
void parse(Span< const Byte > bytes)
Reads the file in UTF-8 format.
JSONValue root() const
Root element.
JSONValue child(StringView name) const
Child value with name name. Returns a null value if not found.
static void setProfilingLevel(Int32 level)
Sets the profiling level.
static Int32 profilingLevel()
Profiling level.
InstanceType * get() const
Associated instance or nullptr if none.
Reference to an instance.
Utility class for instantiating a service of a given interface.
UniqueArray< Ref< InterfaceType > > createAllInstances()
Creates an instance of every service that implements InterfaceType.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Creates an instance implementing the InterfaceType interface.
Unicode character string.
bool null() const
Returns true if the string is null.
bool empty() const
True if the string is empty (null or "").
std::string_view toStdStringView() const
Returns an STL view of the current string.
static Int32 nbAllowedThread()
Maximum number of threads used to manage tasks.
static void terminate()
Indicates that threads will no longer be used. This method must not be called when tasks are active.
static bool isActive()
Indicates whether tasks are active. Tasks are active if an implementation is available and if the req...
static void printInfos(std::ostream &o)
Prints information about the implementation.
1D data vector with value semantics (STL style).
View of the standard connectivities of an unstructured mesh.
Information about a version.
int versionMajor() const
Returns the major version number.
int versionMinor() const
Returns the minor version number.
int versionPatch() const
Returns the patch version number.
XmlNode documentElement() const
Returns the document element.
bool null() const
True if the node is null.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
void setGlobalDataInitialisationPolicy(eDataInitialisationPolicy init_policy)
Sets the initialization policy for variables.
@ SB_AllowNull
Allows the service to be absent.
bool arcaneIsCheck()
True if running in check mode.
eDataInitialisationPolicy
Possible data initialization policy.
@ DIP_InitInitialWithNanResizeWithDefault
Initialization with NaN upon creation and default constructor thereafter.
@ DIP_Legacy
Initialization in historical mode.
@ DIP_None
No forced initialization.
@ DIP_InitWithNan
Initialization with NaN (Not a Number).
@ DIP_InitWithDefault
Initialization with the default constructor.
std::int64_t Int64
Signed integer type of 64 bits.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Gets the initialization policy for variables.
Int32 Integer
Type representing an integer.
Collection< String > StringCollection
Collection of strings.
Collection< Internal::IServiceFactory2 * > ServiceFactory2Collection
Collection of service factories.
List< String > StringList
Unicode string list.
Collection< IModuleFactoryInfo * > ModuleFactoryInfoCollection
Collection of module factory information.
void arcaneSetCheck(bool v)
Activates or deactivates verification mode.
eItemKind
Mesh entity type.
double Real
Type representing a real number.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.
std::int32_t Int32
Signed integer type of 32 bits.