Arcane  v4.1.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Application.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Application.cc (C) 2000-2025 */
9/* */
10/* Superviseur. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
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"
39
40#include "arccore/base/internal/DependencyInjection.h"
41#include "arccore/concurrency/internal/TaskFactoryInternal.h"
42
43#include "arcane/core/ArcaneVersion.h"
44#include "arcane/core/ISubDomain.h"
45#include "arcane/core/IIOMng.h"
46#include "arcane/core/IXmlDocumentHolder.h"
47#include "arcane/core/IParallelSuperMng.h"
48#include "arcane/core/IMainFactory.h"
49#include "arcane/core/IArcaneMain.h"
50#include "arcane/core/IRessourceMng.h"
51#include "arcane/core/IServiceLoader.h"
52#include "arcane/core/IServiceMng.h"
53#include "arcane/core/ICodeService.h"
54#include "arcane/core/ISession.h"
55#include "arcane/core/IDataFactory.h"
56#include "arcane/core/IDataFactoryMng.h"
57#include "arcane/core/IXmlDocumentHolder.h"
58#include "arcane/core/XmlNode.h"
59#include "arcane/core/XmlNodeList.h"
60#include "arcane/core/ItemTypeMng.h"
62#include "arcane/core/IPhysicalUnitSystemService.h"
63#include "arcane/core/ServiceBuilder.h"
64#include "arcane/core/Configuration.h"
65#include "arcane/core/Directory.h"
66#include "arcane/core/IServiceAndModuleFactoryMng.h"
67#include "arcane/core/ApplicationBuildInfo.h"
68
69#include "arcane/core/IItemEnumeratorTracer.h"
70#include "arcane/impl/Application.h"
71#include "arcane/impl/ConfigurationReader.h"
72#include "arcane/impl/ArcaneMain.h"
73
74// Ces fichiers ne sont utilisés que pour afficher des tailles
75// des classes définies dans ces fichiers
77#include "arcane/core/Item.h"
78#include "arcane/core/IndexedItemConnectivityView.h"
79#include "arcane/core/UnstructuredMeshConnectivity.h"
80
81#include "arccore_version.h"
82
83#ifdef ARCANE_OS_WIN32
84#include <windows.h>
85#endif
86
87#include <vector>
88#include <set>
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93namespace Arcane
94{
95
96extern "C++" ARCANE_UTILS_EXPORT void
97arcaneSetPauseOnError(bool v);
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102extern "C++" IPhysicalUnitSystemService*
103createNullPhysicalUnitSystemService();
104extern "C++" IConfigurationMng*
105arcaneCreateConfigurationMng(ITraceMng* tm);
106extern "C++" ARCANE_IMPL_EXPORT IServiceAndModuleFactoryMng*
107arcaneCreateServiceAndModuleFactoryMng(ITraceMng* tm);
108extern "C++" ARCANE_IMPL_EXPORT Ref<IItemEnumeratorTracer>
109arcaneCreateItemEnumeratorTracer(ITraceMng* tm,Ref<IPerformanceCounterService> perf_counter);
110extern "C++" ARCANE_IMPL_EXPORT Ref<ICodeService>
111createArcaneCodeService(IApplication* app);
112extern "C++" ARCANE_CORE_EXPORT void
113arcaneSetSingletonItemEnumeratorTracer(Ref<IItemEnumeratorTracer> tracer);
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
118extern "C++" IApplication*
119arcaneCreateApplication(IArcaneMain* am)
120{
121 IApplication* sm = new Application(am);
122 sm->build();
123 return sm;
124}
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
129namespace
130{
132 _stringListToArray(const StringList& slist)
133 {
135 for (const String& s : slist)
136 a.add(s);
137 return a;
138 }
139} // namespace
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143
145{
146 public:
147
148 void setTraceMng(ReferenceCounter<ITraceMng> tm) { m_trace = tm; }
149 void setCoreServices(const ApplicationCoreBuildInfo& build_info);
150
151 template <typename InterfaceType> Ref<InterfaceType>
152 tryCreateServiceUsingInjector(const StringList& names, String* found_name, bool has_trace);
153
154 public:
155
157 Ref<IStackTraceService> m_stack_trace_service;
158 Ref<ISymbolizerService> m_symbolizer_service;
159 Ref<IThreadImplementationService> m_thread_implementation_service;
160 Ref<IThreadImplementation> m_thread_implementation;
161 Ref<ITaskImplementation> m_task_implementation;
166};
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
177, m_namespace_uri(arcaneNamespaceURI())
178, m_local_name("Application")
179, m_arcane_main(am)
181, m_main_service_factory_infos(am->registeredServiceFactoryInfos())
182, m_main_module_factory_infos(am->registeredModuleFactoryInfos())
183, m_has_garbage_collector(am->hasGarbageCollector())
184{
185 m_core_application = std::make_unique<CoreApplication>();
186 // Initialise les threads avec un service qui ne fait rien.
187 platform::setThreadImplementationService(&m_null_thread_implementation);
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
199{
201 m_core_application->m_task_implementation.reset();
202
203 // Supprime les services que l'instance a positionnée
204 if (platform::getProcessorAffinityService()==m_processor_affinity_service.get())
206
207 if (platform::getStackTraceService() == m_core_application->m_stack_trace_service.get())
209
210 if (platform::getSymbolizerService() == m_core_application->m_symbolizer_service.get())
212
213 if (platform::getProfilingService()==m_profiling_service.get())
215
216 if (platform::getPerformanceCounterService()==m_performance_counter_service.get())
218
219 delete m_service_and_module_factory_mng;
220
221 m_sessions.each(Deleter());
222
223 delete m_configuration_mng;
224 delete m_ressource_mng;
225
226 m_owned_sequential_parallel_super_mng.reset();
227 m_parallel_super_mng.reset();
228
229 m_data_factory_mng.reset();
230 delete m_io_mng;
231 delete m_service_mng;
232
233 m_trace = nullptr;
234 // Il faut détruire le m_trace_policy après m_trace car ce dernier peut
235 // l'utiliser.
236 delete m_trace_policy;
237
238 // Supprime la référence au gestionnaire de thread. Il faut le faire en dernier car
239 // les autres gestionnaires peuvent l'utiliser.
240 if (platform::getThreadImplementationService() == m_core_application->m_thread_implementation.get())
242}
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
256template<typename InterfaceType> Ref<InterfaceType> Application::
257_tryCreateService(const StringList& names,String* found_name)
258{
259 if (found_name)
260 (*found_name) = String();
262 for( String s : names ){
263 auto t = sf.createReference(s,SB_AllowNull);
264 if (t.get()){
265 if (found_name)
266 (*found_name) = s;
267 return t;
268 }
269 }
270 return {};
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
282template <typename InterfaceType> Ref<InterfaceType> Application::CoreApplication::
283tryCreateServiceUsingInjector(const StringList& names, String* found_name, bool has_trace)
284{
285 DependencyInjection::Injector injector;
286 injector.fillWithGlobalFactories();
287 // Ajoute une instance de ITraceMng* pour les services qui en ont besoin
288 if (has_trace)
289 injector.bind(m_trace.get());
290
291 if (found_name)
292 (*found_name) = String();
293 for( String s : names ){
294 auto t = injector.createInstance<InterfaceType>(s,true);
295 if (t.get()){
296 if (found_name)
297 (*found_name) = s;
298 return t;
299 }
300 }
301 return {};
302}
303
304/*---------------------------------------------------------------------------*/
305/*---------------------------------------------------------------------------*/
306
307void Application::CoreApplication::
308setCoreServices(const ApplicationCoreBuildInfo& build_info)
309{
310
311 // Recherche le service utilisé pour connaitre la pile d'appel
312 bool has_dbghelp = false;
313 {
314 String dbghelp_service_name = "DbgHelpStackTraceService";
315 StringList names;
316 String found_name;
318 const auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_USE_BACKWARDCPP", true);
319 if (v && v.value() != 0) {
320 names.add("BackwardCppStackTraceService");
321 }
322 names.add("LibUnwind");
323 names.add("DbgHelpStackTraceService");
324 sv = tryCreateServiceUsingInjector<IStackTraceService>(names, &found_name, true);
325 if (found_name == dbghelp_service_name)
326 has_dbghelp = true;
327 if (sv.get()) {
328 m_stack_trace_service = sv;
330 }
331 }
332
333 // Recherche le service utilisé pour connaitre les infos sur les symboles
334 // du code source. Pour l'instant, on ne supporte que LLVM et on n'active ce service
335 // que si la variable d'environnement ARCANE_LLVMSYMBOLIZER_PATH est définie.
336 {
337 StringList names;
338 String found_name;
339 Ref<ISymbolizerService> sv;
340
341 if (!platform::getEnvironmentVariable("ARCANE_LLVMSYMBOLIZER_PATH").null())
342 names.add("LLVMSymbolizer");
343 if (has_dbghelp)
344 names.add("DbgHelpSymbolizerService");
345 sv = tryCreateServiceUsingInjector<ISymbolizerService>(names, &found_name, true);
346 if (sv.get()) {
347 m_symbolizer_service = sv;
349 }
350 }
351
352 // Recherche le service implémentant le support du multi-threading.
353 {
354 StringList names = build_info.threadImplementationServices();
355 String found_name;
356 auto sv = tryCreateServiceUsingInjector<IThreadImplementationService>(names, &found_name, false);
357 if (!sv.get())
358 ARCANE_FATAL("Can not find implementation for 'IThreadImplementation' (names='{0}').",
359 _stringListToArray(names));
360 m_thread_implementation_service = sv;
361 m_thread_implementation = sv->createImplementation();
362 platform::setThreadImplementationService(m_thread_implementation.get());
363 m_thread_implementation->initialize();
364 m_used_thread_service_name = found_name;
365 }
366
367 // Le gestionnaire de thread a pu changer et il faut donc
368 // reinitialiser le gestionnaire de trace.
369 m_trace->resetThreadStatus();
370
371 // Recherche le service utilisé pour gérer les tâches
372 {
373 Integer nb_task_thread = build_info.nbTaskThread();
374 if (nb_task_thread >= 0) {
375
376 StringList names = build_info.taskImplementationServices();
377 String found_name;
378 auto sv = tryCreateServiceUsingInjector<ITaskImplementation>(names, &found_name, false);
379 if (sv.get()) {
380 TaskFactoryInternal::setImplementation(sv.get());
381 sv->initialize(nb_task_thread);
382 m_used_task_service_name = found_name;
383 m_task_implementation = sv;
384 }
385 else
386 ARCANE_FATAL("Can not find task implementation service (names='{0}')."
387 " Please check if Arcane is configured with Intel TBB library",
388 _stringListToArray(names));
389 }
390
391 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_TASK_VERBOSE_LEVEL", true))
393 }
394}
395
396/*---------------------------------------------------------------------------*/
397/*---------------------------------------------------------------------------*/
398
400build()
401{
402 const ApplicationBuildInfo& build_info = applicationBuildInfo();
403
404 // Création du TraceMngPolicy. L'initialisation complète se fera plus tard
405 // car on a besoin d'informations supplémentaires comme le rang MPI et
406 // d'avoir lu des fichiers de configuration.
407 m_trace_policy = m_main_factory->createTraceMngPolicy(this);
408
409 // Toujours le premier après TraceMngPolicy
410 m_trace = m_main_factory->createTraceMng();
411
412 {
413 // TODO: positionner ces informations dans ApplicationBuildInfo.
414 Int32 output_level = build_info.outputLevel();
415 if (output_level!=Trace::UNSPECIFIED_VERBOSITY_LEVEL){
416 m_trace_policy->setVerbosityLevel(output_level);
417 m_trace_policy->setStandardOutputVerbosityLevel(output_level);
418 }
419 Int32 verbosity_level = build_info.verbosityLevel();
420 if (verbosity_level!=Trace::UNSPECIFIED_VERBOSITY_LEVEL){
421 m_trace_policy->setVerbosityLevel(verbosity_level);
422 }
423
424 bool has_output_file = build_info.isMasterHasOutputFile();
425 m_trace_policy->setIsMasterHasOutputFile(has_output_file);
426
427 // Positionne le niveau de verbosité en laissant au minimum le niveau
428 // par défaut. Sans cela, certains messages d'initialisation peuvent ne
429 // pas s'afficher ce qui peut être génant en cas de problèmes ou de plantage.
430 Int32 minimal_verbosity_level = build_info.minimalVerbosityLevel();
431 if (minimal_verbosity_level==Trace::UNSPECIFIED_VERBOSITY_LEVEL)
432 minimal_verbosity_level = Trace::DEFAULT_VERBOSITY_LEVEL;
433 m_trace_policy->setDefaultVerboseLevel(m_trace.get(),minimal_verbosity_level);
434 }
435
436 arcaneGlobalMemoryInfo()->setTraceMng(traceMng());
437
438 {
439 // Affiche quelques informations à l'initialisation dès le niveau 4
440 m_trace->info(4) << "*** Initialization informations:";
441 m_trace->info(4) << "*** PID: " << platform::getProcessId();
442 m_trace->info(4) << "*** Host: " << platform::getHostName();
443
445 if (dynamic_library_loader){
446 String os_dir(m_exe_info.dataOsDir());
447#ifdef ARCANE_OS_WIN32
448 {
449 // Sous windows, si le processus est lancé via 'dotnet' par exemple,
450 // les chemins de recherche pour LoadLibrary() ont pu être modifiés
451 // et on ne vas plus chercher par défaut dans le répertoire courant
452 // pour charger les bibliothèques natives. Pour corrige ce problème
453 // on repositionne le comportement qui autorise à ajouter des chemins
454 // utilisateurs et on ajoute 'os_dir' à ce chemin.
455 // Sans cela, les dépendances aux bibliothèques chargées par LoadLibrary()
456 // ne seront pas trouvées. Par exemple 'arcane_thread.dll' dépend de 'tbb.dll' et
457 // tous les deux sont le même répertoire mais si répertoire n'est pas
458 // dans la liste autorisé, alors 'tbb.dll' ne sera pas trouvé.
459 //
460 // NOTE: On pourrait peut-être éviter cela en utilisant LoadLibraryEx() et en
461 // spécifiant LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR comme flag de recherche.
462 // A vérifier si cela fonctionne lorsqu'on n'utilisera plus le chargeur
463 // dynamique de la glib.
464 m_trace->info(4) << "Adding '" << os_dir << "' to search library path";
465 std::wstring wide_os_dir = StringUtils::convertToStdWString(os_dir);
466 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
467 AddDllDirectory(wide_os_dir.c_str());
468 }
469#endif
470 for( StringCollection::Enumerator i(m_exe_info.dynamicLibrariesName()); ++i; ){
471 String name = *i;
472 m_trace->info(4) << "*** Trying to load dynamic library: " << name;
473 IDynamicLibrary* dl = dynamic_library_loader->open(os_dir,name);
474 if (!dl)
475 m_trace->info(4) << "WARNING: Can not load library '" << name << "'";
476 }
477 }
478
479#ifdef ARCANE_OS_WIN32
480 if (dynamic_library_loader){
481 String os_dir(m_exe_info.dataOsDir());
482 // TODO: Ajouter le répertoire contenant 'arcane_impl' qui est connu dans ArcaneMain dans m_arcane_lib_path.
483 String dyn_lib_names[5] = { "arcane_mpi", "arcane_std", "arcane_mesh",
484 "arcane_thread", "arcane_mpithread",
485 };
486 for( Integer i=0; i<5; ++i )
487 dynamic_library_loader->open(os_dir,dyn_lib_names[i]);
488 }
489#endif
490
491 m_configuration_mng = arcaneCreateConfigurationMng(traceMng());
492
493 {
494 m_service_and_module_factory_mng = arcaneCreateServiceAndModuleFactoryMng(traceMng());
496 m_service_and_module_factory_mng->addGlobalFactory(*i);
498 m_service_and_module_factory_mng->addGlobalFactory(*i);
499
500 m_service_and_module_factory_mng->createAllServiceRegistererFactories();
501 }
502
503 m_service_mng = m_main_factory->createServiceMng(this);
504
505 String pause_on_error = platform::getEnvironmentVariable("ARCANE_PAUSE_ON_ERROR");
506 if (!pause_on_error.null())
507 arcaneSetPauseOnError(true);
508
509 m_core_application->setTraceMng(m_trace);
510 m_core_application->setCoreServices(applicationBuildInfo());
511
512 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_LOOP_PROFILING_LEVEL",true))
514
515 // Recherche le service utilisé pour le profiling
516 {
517 String profile_str = platform::getEnvironmentVariable("ARCANE_PROFILING");
518 if (!profile_str.null()){
520 auto sv = sf.createReference(profile_str+"ProfilingService",SB_AllowNull);
521 if (sv.get()){
522 m_profiling_service = sv;
524 }
525 else
526 ARCANE_FATAL("Can not find profiling service (name='{0}')",profile_str);
527 }
528 }
529
530 // Par défaut, on accroche le service Hyoda
531 {
533 auto sv = sf.createReference("Hyoda",SB_AllowNull);
534 if (sv.get()){
535 m_online_debugger = sv;
537 }
538 }
539
540 // Recherche le service utilisé pour la gestion de l'affinité processeur
541 {
542 StringList names;
543 names.add("HWLoc");
544 String found_name;
545 auto sv = m_core_application->tryCreateServiceUsingInjector<IProcessorAffinityService>(names, &found_name, true);
546 if (sv.get()) {
547 m_processor_affinity_service = sv;
549 }
550 else {
551 m_trace->info(4) << "Can not find implementation for IProcessorAffinityService "
552 << "(names=" << _stringListToArray(names) << ").";
553 }
554 }
555
556 // Recherche le service utilisé pour le parallélisme
557 String message_passing_service = build_info.messagePassingService();
558 if (message_passing_service.null())
559 message_passing_service = build_info.internalDefaultMessagePassingService();
561 auto sm = sf.createReference(message_passing_service,SB_AllowNull);
562 if (!sm)
563 ARCANE_FATAL("Can not find message passing service '{0}'",message_passing_service);
564
566 m_parallel_super_mng->initialize();
567
568 IParallelSuperMng* seq_sm = nullptr;
569 if (sm->isParallel()){
570 m_owned_sequential_parallel_super_mng = sf.createReference("SequentialParallelSuperMng",SB_AllowNull);
571 seq_sm = m_owned_sequential_parallel_super_mng.get();
572 if (!seq_sm)
573 ARCANE_FATAL("Can not find service 'SequentialParallelSuperMng'");
574 seq_sm->initialize();
575 }
576 else
577 seq_sm = m_parallel_super_mng.get();
578
580
582 m_io_mng = m_main_factory->createIOMng(this);
583 m_data_factory_mng = m_main_factory->createDataFactoryMngRef(this);
584 }
585
586 {
587 VersionInfo version_info = m_exe_info.codeVersion();
588 int vmajor = version_info.versionMajor();
589 int vminor = version_info.versionMinor();
590 int vpatch = version_info.versionPatch();
591 m_main_version_str = String::format("{0}.{1}.{2}",vmajor,vminor,vpatch);
592 m_major_and_minor_version_str = String::format("{0}.{1}",vmajor,vminor);
594 if (vpatch!=0)
596 }
597
598 m_targetinfo_str = m_exe_info.targetFullName();
599 m_application_name = m_exe_info.applicationName();
600 m_code_name = m_exe_info.codeName();
601
602 // Récupère le nom de l'utilisateur
604
605 // Récupère le chemin du répertoire de la configuration utilisateur
606 // TODO: il faut changer car dans les nouvelles recommandations POSIX,
607 // le répertoire de configuration est '.config/arcane'.
609 if (m_user_config_path.null()) {
610 Directory user_home_env(platform::getHomeDirectory());
611 m_user_config_path = Directory(user_home_env, ".arcane").path();
612 }
613
614 {
615 bool is_parallel = parallelSuperMng()->isParallel();
616 bool is_debug = applicationInfo().isDebug();
617 // Création et initialisation du TraceMngPolicy.
618 m_trace_policy->setIsParallel(is_parallel);
619 m_trace_policy->setIsDebug(is_debug);
620 bool is_parallel_output = is_parallel && is_debug;
621 // Permet de forcer les sorties meme en mode optimisé
622 {
623 String s = platform::getEnvironmentVariable("ARCANE_PARALLEL_OUTPUT");
624 if (!s.null())
625 is_parallel_output = true;
626 if (s=="0")
627 is_parallel_output = false;
628 }
629 m_trace_policy->setIsParallelOutput(is_parallel_output);
630 }
631
632 m_is_master = m_parallel_super_mng->commRank() == 0;
633
634 m_trace->info(4) << "*** UserName: " << m_user_name;
635 m_trace->info(4) << "*** HomeDirectory: " << platform::getHomeDirectory();
636
637#ifdef ARCANE_CHECK_MEMORY
638 arcaneGlobalMemoryInfo()->setTraceMng(m_trace);
639#endif
640}
641
642/*---------------------------------------------------------------------------*/
643/*---------------------------------------------------------------------------*/
644
647{
648 if (m_is_init){
649 m_trace->warning() << "Application is already initialised";
650 return;
651 }
652
653 bool is_debug = m_exe_info.isDebug();
654
655 // Analyse le fichier de configuration de l'utilisateur
657
658 //m_trace->info() << "Application init trace mng rank=" << m_parallel_super_mng->traceRank();
659 m_trace_policy->setDefaultClassConfigXmlBuffer(userConfigBuffer());
660 m_trace_policy->initializeTraceMng(m_trace.get(),m_parallel_super_mng->traceRank());
661
662 m_trace->logdate() << "Begin execution.";
663
664 if (is_debug)
665 m_trace->info() << "WARNING: Execution in DEBUG mode!";
666
667#ifdef ARCANE_CHECK
668 m_trace->info() << "WARNING: Compilation in CHECK mode !";
669#endif
670
671 // Active ou désactive un mode vérification partiel si la variable d'environnement
672 // correspondante est positionnée.
673 String check_str = platform::getEnvironmentVariable("ARCANE_CHECK");
674 if (!check_str.null()){
675 bool is_check = check_str != "0";
676 m_trace->info() << "WARNING: Setting CHECK mode to " << is_check;
677 arcaneSetCheck(is_check);
678 }
679 if (arcaneIsCheck()){
680 m_trace->info() << "WARNING: Execution in CHECK mode!";
681 }
682
683#ifdef ARCANE_TRACE
684 m_trace->info() << "WARNING: Execution in TRACE mode !";
685#endif
686#ifdef ARCANE_64BIT
687 m_trace->info() << "Using 64bits version!";
688#endif
689
690 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
691 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
692 m_trace->info() << " ";
693 m_trace->info() << " "
694 << m_exe_info.applicationName();
695 m_trace->info() << " ";
696 VersionInfo version_info = m_exe_info.codeVersion();
697 m_trace->info() << " Version "
698 << version_info.versionMajor() << "."
699 << version_info.versionMinor() << "."
700 << version_info.versionPatch();
701
702 m_trace->info() << " ";
703 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
704 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
705 m_trace->info() << "Date: " << platform::getCurrentDateTime();
706 m_trace->info() << "MemoryUsage: " << static_cast<Int64>(platform::getMemoryUsed() / 1.0e6) << " (MegaBytes)";
707 m_trace->info() << "ArccoreVersion: " << ARCCORE_VERSION_STR_FULL;
708 m_trace->info() << "ArcaneVersion: " << ARCANE_VERSION_STR_FULL
709 << " (Compiler: " << platform::getCompilerId() << ")";
710 m_trace->info() << "Current process pid=" << platform::getProcessId()
711 << " machine=" << platform::getHostName();
712 m_trace->info() << "MessagePassing service=" << applicationBuildInfo().messagePassingService();
713
715 m_trace->info() << "Stack trace service is available";
716 }
718 m_trace->info() << "Symbolizer service is available";
719 }
720
721#ifdef ARCANE_USE_LIBXML2
722 m_trace->info() << "Using 'libxml2' for XML parsing";
723#endif
724
725 // Affiche les infos sur les processeurs
726 {
728 if (pas){
729 pas->printInfos();
730 }
731 }
732
733 // Affiche si l'on a un service de debug
735 m_trace->info() << "Hyoda service is now hooked";
736 }
737 else{
738 m_trace->info() << "Unknown online debugger service";
739 }
740
741 m_is_init = true;
742
743 // Analyse le fichier de configuration du code.
744 _readCodeConfigurationFile();
745
746 {
747 // Construction des types internes
749 }
750
751 {
752 ByteConstSpan runtime_config = m_exe_info.runtimeConfigFileContent();
753 if (!runtime_config.empty()){
754 m_trace->info() << "Reading configuration parameters from runtime config file";
755 JSONDocument jdoc;
756 jdoc.parse(runtime_config);
757 JSONValue config = jdoc.root().child("configuration");
758 ConfigurationReader cr(m_trace.get(),m_configuration_mng->defaultConfiguration());
759 cr.addValuesFromJSON(config,ConfigurationReader::P_GlobalRuntime);
760 }
761 }
762 {
763 if (!m_config_root_element.null()){
764 XmlNode configuration_elem = m_config_root_element.child("configuration");
765 if (!configuration_elem.null()){
766 m_trace->info() << "Reading configuration parameters from code config file";
767 ConfigurationReader cr(m_trace.get(),m_configuration_mng->defaultConfiguration());
768 cr.addValuesFromXmlNode(configuration_elem,ConfigurationReader::P_Global);
769 }
770 }
771 }
772
773 _initDataInitialisationPolicy();
774
775 {
776 if (!m_core_application->m_used_thread_service_name.null())
777 m_trace->info() << "Service used for thread management : '" << m_core_application->m_used_thread_service_name << "'";
778 else
779 m_trace->info() << "No thread management active";
780
781 if (!m_core_application->m_used_task_service_name.null()) {
782 m_trace->info() << "Service used for task management : '" << m_core_application->m_used_task_service_name
783 << "' (max_task_thread=" << TaskFactory::nbAllowedThread() << ")";
784 std::ostringstream ostr;
786 m_trace->info() << "TaskManagement infos:" << ostr.str();
787 }
788 else
789 m_trace->info() << "No task management active";
790 }
791
792 // Recherche le service utilisé pour gérer le système d'unité.
793 {
795 String service_name = "Udunits";
796 auto sv = sf.createReference(service_name,SB_AllowNull);
797 if (sv.get()){
798 m_trace->info() << "UnitSystem service found name=" << service_name;
799 }
800 else{
801 m_trace->info() << "No unit system service found";
802 sv = makeRef(createNullPhysicalUnitSystemService());
803 }
804 m_physical_unit_system_service = sv;
805 }
806
807 // Recherche le service utilisé pour gérer les compteurs de performance.
808 {
809 String service_name = "LinuxPerfPerformanceCounterService";
810 String env_service_name = platform::getEnvironmentVariable("ARCANE_PERFORMANCE_COUNTER_SERVICE");
811 if (!env_service_name.null())
812 service_name = env_service_name + "PerformanceCounterService";
814 auto p = sbuilder.createReference(service_name,SB_AllowNull);
815 m_performance_counter_service = p;
816 if (p.get()){
817 m_trace->info() << "PerformanceCounterService found name=" << service_name;
818 }
819 else{
820 m_trace->info() << "No performance counter service found";
821 }
822 }
823
824 // Initialise le traceur des énumérateurs.
825 {
826 bool force_tracer = false;
827 String trace_str = platform::getEnvironmentVariable("ARCANE_TRACE_ENUMERATOR");
828 if (!trace_str.null() || ProfilingRegistry::profilingLevel()>=1 || force_tracer){
829 if (!TaskFactory::isActive()){
831 auto p = m_performance_counter_service;
832 if (p.get()){
833 m_trace->info() << "Enumerator tracing is enabled";
834 Ref<IItemEnumeratorTracer> tracer(arcaneCreateItemEnumeratorTracer(traceMng(),p));
835 arcaneSetSingletonItemEnumeratorTracer(tracer);
836 p->initialize();
837 p->start();
838 }
839 else
840 m_trace->info() << "WARNING: enumerator tracing is not available because no performance counter service is available.";
841 }
842 else
843 m_trace->info() << "WARNING: enumerator tracing is not available when using multi-tasking.";
844 }
845 }
846
847 m_trace->info() << "sizeof(ItemInternal)=" << sizeof(ItemInternal)
848 << " sizeof(ItemInternalConnectivityList)=" << sizeof(ItemInternalConnectivityList)
849 << " sizeof(ItemSharedInfo)=" << sizeof(ItemSharedInfo);
850 m_trace->info() << "sizeof(ItemLocalId)=" << sizeof(ItemLocalId)
851 << " sizeof(ItemConnectivityContainerView)=" << sizeof(ItemConnectivityContainerView)
852 << " sizeof(UnstructuredMeshConnectivityView)=" << sizeof(UnstructuredMeshConnectivityView);
853 m_trace->info() << "sizeof(Item)=" << sizeof(Item)
854 << " sizeof(ItemEnumerator)=" << sizeof(ItemEnumerator)
855 << " sizeof(ItemVectorView)=" << sizeof(ItemVectorView)
856 << " sizeof(ItemVectorViewConstIterator)=" << sizeof(ItemVectorViewConstIterator)
857 << " ItemEnumeratorVersion=" << ItemEnumerator::version();
858 m_trace->info() << "sizeof(eItemKind)=" << sizeof(eItemKind)
859 << " sizeof(IndexedItemConnectivityViewBase)=" << sizeof(IndexedItemConnectivityViewBase);
860
861 {
862 Real init_time_accelerator = ArcaneMain::initializationTimeForAccelerator() * 1000.0;
863 if (init_time_accelerator!=0.0)
864 m_trace->info() << "Time (in ms) to initialize Accelerators = " << init_time_accelerator;
865 }
866}
867
868/*---------------------------------------------------------------------------*/
869/*---------------------------------------------------------------------------*/
870
871void Application::
872_readCodeConfigurationFile()
873{
874 // Analyse le fichier de configuration du code.
875 const ApplicationBuildInfo& build_info = applicationBuildInfo();
876
877 // Récupère le nom du fichier de configuration.
878 // Si nul, cela indique qu'il n'y a pas de fichier de configure.
879 // Si vide (le défaut), on récupère le nom à partir du nom du code.
880 // Sinon, on utilise le nom spécifié dans la configuration.
881
882 // A noter que cette valeur doit être la même pour tous les PE sinon cela
883 // va bloquer (TODO: faire une éventuellem réduction)
884 String config_file_name = build_info.configFileName();
885
886 bool use_config_file = true;
887 if (config_file_name.null()){
888 use_config_file = false;
889 }
890 else if (config_file_name.empty()){
891 // Regarde d'abord dans le répertoire courant, sinon dans le répertoire
892 // des données partagées (share).
893 // Pour des raisons de performances en parallèle, seul le processeur maitre
894 // fait le test.
895 StringBuilder buf;
896 if (m_is_master){
897 buf = m_exe_info.codeName();
898 buf += ".config";
899 if (!platform::isFileReadable(buf.toString())){
900 buf = m_exe_info.dataDir();
901 buf += "/";
902 buf += m_exe_info.codeName();
903 buf += ".config";
904 }
905 else{
906 m_trace->info() << "Using configuration file in current directory.";
907 }
908 }
909 config_file_name = buf.toString();
910 }
911 m_trace->info() << "Using configuration file: '" << config_file_name << "'";
912
913 if (use_config_file){
914 bool bad_file = m_io_mng->collectiveRead(config_file_name,m_config_bytes);
915 if (bad_file)
916 ARCANE_FATAL("Can not read configuration file '{0}'",config_file_name);
917 m_config_document = m_io_mng->parseXmlBuffer(m_config_bytes,config_file_name);
918 if (!m_config_document.get())
919 ARCANE_FATAL("Can not parse configuration file '{0}'",config_file_name);
920 m_config_root_element = m_config_document->documentNode().documentElement();
921 }
922}
923
924/*---------------------------------------------------------------------------*/
925/*---------------------------------------------------------------------------*/
931{
932 Directory user_config_dir(m_user_config_path);
933 String buf = user_config_dir.file("config.xml");
934
935 //ByteUniqueArray bytes;
936 bool bad_file = m_io_mng->collectiveRead(buf,m_user_config_bytes);
937 if (bad_file){
938 if (m_is_master)
939 m_trace->log() << "No user configuration file '" << buf << "'";
940 return;
941 }
942
943 IXmlDocumentHolder* doc = m_io_mng->parseXmlBuffer(m_user_config_bytes,buf);
944 if (!doc){
945 if (m_is_master)
946 m_trace->log() << "Can not parse user configuration file '" << buf << "'";
947 return;
948 }
949
952}
953
954/*---------------------------------------------------------------------------*/
955/*---------------------------------------------------------------------------*/
956
957namespace
958{
959bool _hasExtension(ICodeService* service,const String& extension)
960{
961 StringCollection extensions = service->validExtensions();
962 for( StringCollection::Enumerator j(extensions); ++j; ){
963 if ((*j)==extension)
964 return true;
965 }
966 return false;
967}
968}
969
970/*---------------------------------------------------------------------------*/
971/*---------------------------------------------------------------------------*/
972
974getCodeService(const String& u_file_name)
975{
976 ServiceBuilder<ICodeService> builder(this);
977 auto services = builder.createAllInstances();
978
979 // Regarde si un service gere l'extension '.arc'.
980 // S'il n'y en a pas, utilise ArcaneCodeService pour
981 // cette extension.
982 {
983 bool has_arc_extension = false;
984 for( Integer i=0, n=services.size(); i<n; ++i ){
985 ICodeService* code_service = services[i].get();
986 if (_hasExtension(code_service,"arc")){
987 has_arc_extension = true;
988 break;
989 }
990 }
991 if (!has_arc_extension){
992 services.add(createArcaneCodeService(this));
993 }
994 }
995
996 // Cherche l'extension du fichier et la conserve dans \a case_ext
997 std::string_view fview = u_file_name.toStdStringView();
998 std::size_t extension_pos = fview.find_last_of('.');
999 if (extension_pos==std::string_view::npos)
1000 return {};
1001 fview.remove_prefix(extension_pos+1);
1002 String case_ext(fview);
1003
1004 Ref<ICodeService> found_service;
1005 for( const auto& code_service : services ){
1006 StringCollection extensions = code_service->validExtensions();
1007 for( StringCollection::Enumerator j(extensions); ++j; ){
1008 if (case_ext==(*j)){
1009 found_service = code_service;
1010 break;
1011 }
1012 }
1013 if (found_service.get())
1014 break;
1015 }
1016 // TODO: retourner une référence.
1017 return found_service;
1018}
1019
1020/*---------------------------------------------------------------------------*/
1021/*---------------------------------------------------------------------------*/
1022
1024addSession(ISession* session)
1025{
1026 m_sessions.add(session);
1027}
1028
1029/*---------------------------------------------------------------------------*/
1030/*---------------------------------------------------------------------------*/
1031
1033removeSession(ISession* session)
1034{
1035 m_sessions.remove(session);
1036}
1037
1038/*---------------------------------------------------------------------------*/
1039/*---------------------------------------------------------------------------*/
1040
1043{
1044 return m_service_and_module_factory_mng->serviceFactories2();
1045}
1046
1047/*---------------------------------------------------------------------------*/
1048/*---------------------------------------------------------------------------*/
1049
1052{
1053 return m_service_and_module_factory_mng->moduleFactoryInfos();
1054}
1055
1056/*---------------------------------------------------------------------------*/
1057/*---------------------------------------------------------------------------*/
1058
1059void Application::
1060_initDataInitialisationPolicy()
1061{
1062 String data_init_policy = platform::getEnvironmentVariable("ARCANE_DATA_INIT_POLICY");
1064 bool is_changed = false;
1065 if (data_init_policy=="DEFAULT"){
1066 init_policy = DIP_InitWithDefault;
1067 is_changed = true;
1068 }
1069 else if (data_init_policy=="NAN"){
1070 init_policy = DIP_InitWithNan;
1071 is_changed = true;
1072 }
1073 else if (data_init_policy=="NONE"){
1074 init_policy = DIP_None;
1075 is_changed = true;
1076 }
1077 else if (data_init_policy=="LEGACY"){
1078 init_policy = DIP_Legacy;
1079 is_changed = true;
1080 }
1081 else if (data_init_policy=="NAN_AND_DEFAULT"){
1083 is_changed = true;
1084 }
1085 if (is_changed){
1087 init_policy = getGlobalDataInitialisationPolicy();
1088 m_trace->info() << "Change data initialisation policy: " << data_init_policy
1089 << " (" << (int)init_policy << ")";
1090 }
1091 m_trace->info() << "Data initialisation policy is : " << (int)init_policy;
1092}
1093
1094/*---------------------------------------------------------------------------*/
1095/*---------------------------------------------------------------------------*/
1096
1099{
1100 return m_arcane_main->applicationBuildInfo();
1101}
1102
1103/*---------------------------------------------------------------------------*/
1104/*---------------------------------------------------------------------------*/
1105
1108{
1109 return m_arcane_main->dotnetRuntimeInitialisationInfo();
1110}
1111
1112/*---------------------------------------------------------------------------*/
1113/*---------------------------------------------------------------------------*/
1114
1117{
1118 return m_arcane_main->acceleratorRuntimeInitialisationInfo();
1119}
1120
1121/*---------------------------------------------------------------------------*/
1122/*---------------------------------------------------------------------------*/
1123
1125createAndInitializeTraceMng(ITraceMng* parent_trace,const String& file_suffix)
1126{
1129 tmp->initializeTraceMng(tm,parent_trace,file_suffix);
1130 return tm;
1131}
1132
1133/*---------------------------------------------------------------------------*/
1134/*---------------------------------------------------------------------------*/
1135
1138{
1139 return m_data_factory_mng->deprecatedOldFactory();
1140}
1141
1142/*---------------------------------------------------------------------------*/
1143/*---------------------------------------------------------------------------*/
1144
1146dataFactoryMng() const
1147{
1148 return m_data_factory_mng.get();
1149}
1150
1151/*---------------------------------------------------------------------------*/
1152/*---------------------------------------------------------------------------*/
1153
1154} // End namespace Arcane
1155
1156/*---------------------------------------------------------------------------*/
1157/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classes, Types et macros pour gérer la concurrence.
Types et macros pour itérer sur les entités du maillage.
Fonctions utilitaires sur les chaînes de caractères.
ARCCORE_BASE_EXPORT std::wstring convertToStdWString(const String &str)
Retourne la conversion de str en std::wstring.
Definition String.cc:1288
Informations pour construire une instance de IApplication.
String configFileName() const
Nom du fichier de configuration du code.
Informations pour initialiser une application.
const String & dataDir() const
Retourne le chemin où se trouve les fichiers de données.
const String & codeName() const
Retourne le nom du code de calcul lié l'application.
bool isDebug() const
Retourne true si on s'exécute en mode debug.
String m_used_thread_service_name
Nom du service utilisé pour gérer les threads.
Ref< InterfaceType > tryCreateServiceUsingInjector(const StringList &names, String *found_name, bool has_trace)
ReferenceCounter< ITraceMng > m_trace
Gestionnaire de traces.
String m_used_task_service_name
Nom du service utilisé pour gérer les tâches.
String m_user_config_path
Répertoire de configuration utilisateur.
void _openUserConfig()
Analyse le fichier de configuration de l'utilisateur.
ReferenceCounter< ITraceMng > m_trace
Gestionnaire de traces.
~Application() override
Détruit le gestionnaire.
ModuleFactoryInfoCollection m_main_module_factory_infos
Tableau des fabriques de module.
IDataFactory * dataFactory() override
Fabrique de donnée.
ScopedPtrT< IXmlDocumentHolder > m_config_document
Arbre DOM de la configuration.
const ApplicationBuildInfo & applicationBuildInfo() const override
Informations sur les paramètres de construction de l'instance.
ApplicationInfo m_exe_info
Informations sur l'exécutable.
String m_major_and_minor_version_str
Version M.m.
ITraceMngPolicy * getTraceMngPolicy() override
Politique de configuration d'un gestionnaire de trace.
String m_version_str
Infos sur la configuration.
ITraceMng * createAndInitializeTraceMng(ITraceMng *parent_trace, const String &file_suffix) override
Créé et initialise une instance de ITraceMng.
IMainFactory * m_main_factory
Manufacture principale.
const DotNetRuntimeInitialisationInfo & dotnetRuntimeInitialisationInfo() const override
Informations d'initialisation du runtime '.Net'.
IMainFactory * mainFactory() const override
Manufacture principale.
Definition Application.h:98
SessionList m_sessions
Liste des sessions.
Ref< InterfaceType > _tryCreateService(const StringList &names, String *found_name)
const AcceleratorRuntimeInitialisationInfo & acceleratorRuntimeInitialisationInfo() const override
Informations d'initialisation du runtime pour les accélérateurs.
String m_user_name
Nom de l'utilisateur.
IRessourceMng * m_ressource_mng
Gestionnaire de ressources.
const ApplicationInfo & applicationInfo() const override
Informations sur l'exécutable.
Definition Application.h:86
IDataFactoryMng * dataFactoryMng() const override
Fabrique de donnée.
XmlNode m_user_config_root_element
Elément racine de la configuration utilisateur.
String m_main_version_str
Version sous la forme Majeur.mineur.beta.
void initialize() override
Initialise l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas été appelée.
ModuleFactoryInfoCollection moduleFactoryInfos() override
Liste des informations sur les fabriques des modules.
UniqueArray< Byte > m_user_config_bytes
Fichier contenant la configuration utilisateur.
bool m_is_init
true si déjà initialisé
void build() override
Construit les membres de l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas é...
ITraceMng * traceMng() const override
Gestionnaire de traces.
Definition Application.h:73
XmlNode m_config_root_element
Elément racine de la configuration.
String m_application_name
Nom de l'application.
String m_targetinfo_str
Infos sur la configuration.
ScopedPtrT< IXmlDocumentHolder > m_user_config_document
Arbre DOM de la configuration utilisateur.
ServiceFactoryInfoCollection m_main_service_factory_infos
Tableau des fabriques de service.
ServiceFactory2Collection serviceFactories2() override
Liste des fabriques de service.
bool hasGarbageCollector() const override
Indique que certains objets sont gérés via un ramasse miette.
Ref< ICodeService > getCodeService(const String &file_name) override
Retourne le chargeur de cas correspondant au fichier donné par file_name.
Ref< IParallelSuperMng > m_parallel_super_mng
Gestionnaire du parallélisme.
IServiceMng * m_service_mng
Gestionnaire des services.
void removeSession(ISession *s) override
Supprime la session session.
IIOMng * m_io_mng
Gestionnaire des entrées/sorties.
UniqueArray< Byte > m_config_bytes
Fichier contenant la configuration.
void addSession(ISession *s) override
Ajoute la session session.
Ref< IDataFactoryMng > m_data_factory_mng
Fabrique des données.
IParallelSuperMng * m_sequential_parallel_super_mng
Gestionnaire du parallélisme séquentiel.
Application(IArcaneMain *)
Construit un superviseur avec les informations d'exécution ex.
IParallelSuperMng * parallelSuperMng() override
Gestionnaire superviseur du parallélisme.
Definition Application.h:77
static Real initializationTimeForAccelerator()
Retourne le temps (en seconde) pour l'initialisation des runtimes accélérateurs pour ce processus.
Lecteurs de fichiers de configuration.
void addValuesFromXmlNode(const XmlNode &element, Integer priority)
Ajoute des valeurs à la configuration.
void addValuesFromJSON(const JSONValue &jv, Integer priority)
Ajoute des valeurs à la configuration.
static ARCCORE_BASE_EXPORT std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Classe template pour convertir un type.
Classe utilitaire pour la destruction des objets alloués par new.
Definition Deleter.h:31
Classe gérant un répertoire.
Definition Directory.h:35
String file(const String &file_name) const override
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:120
String path() const override
Retourne le chemin du répertoire.
Definition Directory.cc:111
Informations pour l'initialisation du runtime '.Net'.
Interface de l'application.
Interface de la classe de gestion du code.
Definition IArcaneMain.h:54
Interface d'un chargeur de cas.
virtual StringCollection validExtensions() const =0
Retourne la liste des extensions de fichier traitées par l'instance. L'extension ne comprend pas le '...
Gestionnaire de configuration.
Interface du gestionnaire de fabrique d'une donnée.
Interface d'une fabrique d'une donnée.
Interface d'un chargeur dynamique de bibliothèque.
virtual IDynamicLibrary * open(const String &directory, const String &name)=0
Charge une bibliothèque dynamique.
static IDynamicLibraryLoader * getDefault()
Service utilisé pour charger dynamiquement des bibliothèques.
Interface d'une bibliothèque dynamique.
virtual ITraceMng * createTraceMng()=0
Créé un gestionnaire de trace.
Classe abstraite du superviseur de parallélisme.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual void initialize()=0
Initialise l'instance.
Interface d'un service gérant un système d'unité.
Interface d'un service de gestion de l'affinité des coeurs CPU.
virtual void printInfos()=0
Affiche les informations complète de topologie via info()
static IRessourceMng * createDefault(IApplication *)
Création d'un gestionnaire d'historique par défaut.
Interface d'un gestionnaire de fabriques de services et modules.
Interface d'une session d'exécution d'un cas.
Definition ISession.h:37
Interface du gestionnaire de configuration d'un gestionnnaire de trace.
virtual void initializeTraceMng(ITraceMng *trace, Int32 rank)=0
Initialise trace.
Interface du gestionnaire de traces.
Gestionnaire d'un document DOM.
virtual XmlNode documentNode()=0
Noeud document. Ce noeud est nul si le document n'existe pas.
Classe de base d'une vue sur une connectivité non structurée.
Vues sur les conteneurs contenant les connectivités. Cette classe permet de rendre opaque en dehors d...
Enumérateur sur une liste d'entités.
Informations de connectivité, pour une famille d'entité, permettant la transition entre les anciennes...
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Definition ItemLocalId.h:41
Structure interne partagée d'une entité de maillage.
void build(IParallelSuperMng *parallel_mng, ITraceMng *trace)
Constructeur effectif.
static ItemTypeMng * _singleton()
Instance singleton du type.
Itérateur pour la classe ItemVectorView.
Vue sur un vecteur d'entités.
Classe de base d'un élément de maillage.
Definition Item.h:83
void parse(Span< const Byte > bytes)
Lit le fichier au format UTF-8.
JSONValue root() const
Elément racine.
JSONValue child(StringView name) const
Valeur fille de nom name. Retourne une valeur nulle si non trouvé.
static void setProfilingLevel(Int32 level)
Positionne le niveau de profilage.
Definition Profiling.cc:230
static Int32 profilingLevel()
Niveau de profilage.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Encapsulation d'un pointeur avec compteur de référence.
Classe utilitaire pour instantier un service d'une interface donnée.
UniqueArray< Ref< InterfaceType > > createAllInstances()
Créé une instance de chaque service qui implémente InterfaceType.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:305
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Definition String.cc:316
std::string_view toStdStringView() const
Retourne une vue de la STL sur la chaîne actuelle.
Definition String.cc:349
static void setVerboseLevel(Integer v)
Positionne le niveau de verbosité (0 pour pas d'affichage qui est le défaut)
static Int32 nbAllowedThread()
Nombre de threads utilisés au maximum pour gérer les tâches.
static void terminate()
Indique qu'on n'utilisera plus les threads. Cette méthode ne doit pas être appelée lorsque des tâches...
static bool isActive()
Indique si les tâches sont actives. Les tâches sont actives si une implémentation est disponible et s...
static void printInfos(std::ostream &o)
Affiche les informations sur l'implémentation.
Vecteur 1D de données avec sémantique par valeur (style STL).
Vue sur les connectivités standards d'un maillage non structuré.
Informations sur une version.
Definition VersionInfo.h:46
int versionMajor() const
Retourne le numéro de version majeur.
Definition VersionInfo.h:64
int versionMinor() const
Retourne le numéro de version mineur.
Definition VersionInfo.h:66
int versionPatch() const
Retourne le numéro de version patch.
Definition VersionInfo.h:68
Noeud d'un arbre DOM.
Definition XmlNode.h:51
XmlNode documentElement() const
Retourne le noeud élément du document.
Definition XmlNode.cc:556
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
ARCCORE_BASE_EXPORT String getHostName()
Nom de la machine sur lequel tourne le processus.
ARCCORE_BASE_EXPORT bool isFileReadable(const String &file_name)
Vérifie que le fichier file_name est accessible et lisible.
IPerformanceCounterService * setPerformanceCounterService(IPerformanceCounterService *service)
Positionne le service utilisé pour gérer les compteurs interne du processeur.
ARCCORE_BASE_EXPORT String getCompilerId()
Chaîne de caractère permettant d'identifier le compilateur utilisé pour compiler Arccore.
ARCCORE_BASE_EXPORT IStackTraceService * getStackTraceService()
Service utilisé pour obtenir la pile d'appel.
ISymbolizerService * setSymbolizerService(ISymbolizerService *service)
Positionne le service pour obtenir des informations sur les symboles du code source.
ARCCORE_BASE_EXPORT String getCurrentDateTime()
Date et l'heure courante sous la forme ISO 8601.
ARCCORE_BASE_EXPORT double getMemoryUsed()
Mémoire utilisée em octets.
IOnlineDebuggerService * setOnlineDebuggerService(IOnlineDebuggerService *service)
Positionne le service a utiliser pour l'architecture en ligne de debug.
ISymbolizerService * getSymbolizerService()
Service utilisé pour obtenir des informations sur les symboles du code source.
ARCCORE_BASE_EXPORT String getHomeDirectory()
Répertoire contenant les documents utilisateurs.
IProfilingService * getProfilingService()
Service utilisé pour obtenir pour obtenir des informations de profiling.
IProfilingService * setProfilingService(IProfilingService *service)
Positionne le service utilisé pour obtenir des informations de profiling.
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
ARCCORE_BASE_EXPORT String getUserName()
Nom de l'utilisateur.
IProcessorAffinityService * setProcessorAffinityService(IProcessorAffinityService *service)
Positionne le service utilisé pour la gestion de l'affinité des processeurs.
IProcessorAffinityService * getProcessorAffinityService()
Service utilisé pour la gestion de l'affinité des processeurs.
ARCCORE_BASE_EXPORT IStackTraceService * setStackTraceService(IStackTraceService *service)
Positionne le service utilisé pour obtenir la pile d'appel.
IThreadImplementation * getThreadImplementationService()
Service utilisé pour gérer les threads.
IPerformanceCounterService * getPerformanceCounterService()
Service utilisé pour obtenir pour obtenir les compteurs interne du processeur.
ARCCORE_BASE_EXPORT int getProcessId()
Numéro du processus.
IThreadImplementation * setThreadImplementationService(IThreadImplementation *service)
Positionne le service utilisé pour gérer les threads.
IOnlineDebuggerService * getOnlineDebuggerService()
Service utilisé pour obtenir la mise en place d'une architecture en ligne de debug.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void setGlobalDataInitialisationPolicy(eDataInitialisationPolicy init_policy)
Positionne la politique d'initialisation des variables.
Definition DataTypes.cc:156
@ SB_AllowNull
Autorise l'absence du service.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
eDataInitialisationPolicy
Type de politique d'initialisation possible pour une donnée.
Definition DataTypes.h:131
@ DIP_InitInitialWithNanResizeWithDefault
Initialisation avec des NaN pour à la création et le constructeur par défaut ensuite.
Definition DataTypes.h:170
@ DIP_Legacy
Initialisation en mode historique.
Definition DataTypes.h:161
@ DIP_None
Pas d'initialisation forcée.
Definition DataTypes.h:133
@ DIP_InitWithNan
Initialisation avec des NaN (Not a Number)
Definition DataTypes.h:148
@ DIP_InitWithDefault
Initialisation avec le constructeur par défaut.
Definition DataTypes.h:140
std::int64_t Int64
Type entier signé sur 64 bits.
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Definition DataTypes.cc:162
Int32 Integer
Type représentant un entier.
Collection< String > StringCollection
Collection de chaînes de caractères.
Definition UtilsTypes.h:506
Collection< Internal::IServiceFactory2 * > ServiceFactory2Collection
Collection de fabriques de service.
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:509
Collection< IModuleFactoryInfo * > ModuleFactoryInfoCollection
Collection d'informations sur les fabriques de module.
void arcaneSetCheck(bool v)
Active ou désactive le mode vérification.
Definition Misc.cc:74
eItemKind
Genre d'entité de maillage.
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.