Arcane  v3.14.10.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-2024 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-2024 */
9/* */
10/* Superviseur. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Iostream.h"
15#include "arcane/utils/Iterator.h"
16#include "arcane/utils/List.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/Deleter.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ValueConvert.h"
21#include "arcane/utils/OStringStream.h"
22#include "arcane/utils/ITraceMng.h"
23#include "arcane/utils/TraceClassConfig.h"
24#include "arcane/utils/IMemoryInfo.h"
25#include "arcane/utils/IStackTraceService.h"
26#include "arcane/utils/ISymbolizerService.h"
27#include "arcane/utils/IProcessorAffinityService.h"
28#include "arcane/utils/IOnlineDebuggerService.h"
29#include "arcane/utils/StringBuilder.h"
30#include "arcane/utils/IProfilingService.h"
31#include "arcane/utils/IThreadImplementationService.h"
32#include "arcane/utils/IDynamicLibraryLoader.h"
33#include "arcane/utils/IPerformanceCounterService.h"
34#include "arcane/utils/ITraceMngPolicy.h"
35#include "arcane/utils/JSONReader.h"
36#include "arcane/utils/Profiling.h"
37
38#include "arcane/core/ArcaneVersion.h"
39#include "arcane/core/ISubDomain.h"
40#include "arcane/core/IIOMng.h"
41#include "arcane/core/IXmlDocumentHolder.h"
42#include "arcane/core/IParallelSuperMng.h"
43#include "arcane/core/IMainFactory.h"
44#include "arcane/core/IArcaneMain.h"
45#include "arcane/core/IRessourceMng.h"
46#include "arcane/core/IServiceLoader.h"
47#include "arcane/core/IServiceMng.h"
48#include "arcane/core/ICodeService.h"
49#include "arcane/core/ISession.h"
50#include "arcane/core/IDataFactory.h"
51#include "arcane/core/IDataFactoryMng.h"
52#include "arcane/core/IXmlDocumentHolder.h"
53#include "arcane/core/XmlNode.h"
54#include "arcane/core/XmlNodeList.h"
55#include "arcane/core/ItemTypeMng.h"
57#include "arcane/core/IPhysicalUnitSystemService.h"
58#include "arcane/core/ServiceBuilder.h"
59#include "arcane/core/Configuration.h"
60#include "arcane/core/Directory.h"
61#include "arcane/core/IServiceAndModuleFactoryMng.h"
62#include "arcane/core/ApplicationBuildInfo.h"
63
64#include "arcane/core/IItemEnumeratorTracer.h"
65#include "arcane/impl/Application.h"
66#include "arcane/impl/ConfigurationReader.h"
67#include "arcane/impl/ArcaneMain.h"
68
69// Ces fichiers ne sont utilisés que pour afficher des tailles
70// des classes définies dans ces fichiers
72#include "arcane/core/Item.h"
73#include "arcane/core/IndexedItemConnectivityView.h"
74#include "arcane/core/UnstructuredMeshConnectivity.h"
75
76#include "arccore_version.h"
77
78#ifdef ARCANE_OS_WIN32
79#include <windows.h>
80#endif
81
82#include <vector>
83#include <set>
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
88namespace Arcane
89{
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
94extern "C++" IPhysicalUnitSystemService*
95createNullPhysicalUnitSystemService();
96extern "C++" IConfigurationMng*
97arcaneCreateConfigurationMng(ITraceMng* tm);
98extern "C++" ARCANE_IMPL_EXPORT IServiceAndModuleFactoryMng*
99arcaneCreateServiceAndModuleFactoryMng(ITraceMng* tm);
100extern "C++" ARCANE_IMPL_EXPORT Ref<IItemEnumeratorTracer>
101arcaneCreateItemEnumeratorTracer(ITraceMng* tm,Ref<IPerformanceCounterService> perf_counter);
102extern "C++" ARCANE_IMPL_EXPORT Ref<ICodeService>
103createArcaneCodeService(IApplication* app);
104extern "C++" ARCANE_CORE_EXPORT void
105arcaneSetSingletonItemEnumeratorTracer(Ref<IItemEnumeratorTracer> tracer);
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110/*---------------------------------------------------------------------------*/
111/*---------------------------------------------------------------------------*/
112
113extern "C++" IApplication*
114arcaneCreateApplication(IArcaneMain* am)
115{
116 IApplication* sm = new Application(am);
117 sm->build();
118 return sm;
119}
120
121/*---------------------------------------------------------------------------*/
122/*---------------------------------------------------------------------------*/
129: m_exe_info(am->applicationInfo())
130, m_namespace_uri(arcaneNamespaceURI())
131, m_local_name("Application")
132, m_arcane_main(am)
133, m_main_factory(am->mainFactory())
134, m_service_mng(nullptr)
135, m_sequential_parallel_super_mng(nullptr)
136, m_trace(nullptr)
137, m_ressource_mng(nullptr)
138, m_io_mng(nullptr)
139, m_configuration_mng(nullptr)
140, m_main_service_factory_infos(am->registeredServiceFactoryInfos())
141, m_main_module_factory_infos(am->registeredModuleFactoryInfos())
142, m_has_garbage_collector(am->hasGarbageCollector())
143, m_trace_policy(nullptr)
144, m_is_init(false)
145, m_is_master(false)
146, m_service_and_module_factory_mng(nullptr)
147{
148 // Initialise les threads avec un service qui ne fait rien.
149 platform::setThreadImplementationService(&m_null_thread_implementation);
150}
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
161{
163 m_task_implementation.reset();
164
165 // Supprime les services que l'instance a positionné
166 if (platform::getProcessorAffinityService()==m_processor_affinity_service.get())
168
169 if (platform::getStackTraceService()==m_stack_trace_service.get())
170 platform::setStackTraceService(nullptr);
171
172 if (platform::getSymbolizerService()==m_symbolizer_service.get())
174
175 if (platform::getProfilingService()==m_profiling_service.get())
177
178 if (platform::getPerformanceCounterService()==m_performance_counter_service.get())
180
181 delete m_service_and_module_factory_mng;
182
184
185 delete m_configuration_mng;
186 delete m_ressource_mng;
187
188 m_owned_sequential_parallel_super_mng.reset();
189 m_parallel_super_mng.reset();
190
191 m_data_factory_mng.reset();
192 delete m_io_mng;
193 delete m_service_mng;
194
195 m_trace = nullptr;
196 // Il faut détruire le m_trace_policy après m_trace car ce dernier peut
197 // l'utiliser.
198 delete m_trace_policy;
199
200 // Supprime la référence au gestionnaire de thread. Il faut le faire en dernier car
201 // les autres gestionnaires peuvent l'utiliser.
202 if (platform::getThreadImplementationService()==m_thread_implementation.get())
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209UniqueArray<String> Application::
210_stringListToArray(const StringList& slist) const
211{
213 for( const String& s : slist )
214 a.add(s);
215 return a;
216}
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
227template<typename InterfaceType> Ref<InterfaceType> Application::
229{
230 if (found_name)
231 (*found_name) = String();
233 for( String s : names ){
234 auto t = sf.createReference(s,SB_AllowNull);
235 if (t.get()){
236 if (found_name)
237 (*found_name) = s;
238 return t;
239 }
240 }
241 return {};
242}
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247extern "C++" ARCANE_UTILS_EXPORT void
248arcaneSetPauseOnError(bool v);
249
251build()
252{
254
255 // Création du TraceMngPolicy. L'initialisation complète se fera plus tard
256 // car on a besoin d'informations supplémentaires comme le rang MPI et
257 // d'avoir lu des fichiers de configuration.
258 m_trace_policy = m_main_factory->createTraceMngPolicy(this);
259
260 // Toujours le premier après TraceMngPolicy
262
263 {
264 // TODO: positionner ces informations dans ApplicationBuildInfo.
265 Int32 output_level = build_info.outputLevel();
266 if (output_level!=Trace::UNSPECIFIED_VERBOSITY_LEVEL){
267 m_trace_policy->setVerbosityLevel(output_level);
269 }
270 Int32 verbosity_level = build_info.verbosityLevel();
271 if (verbosity_level!=Trace::UNSPECIFIED_VERBOSITY_LEVEL){
272 m_trace_policy->setVerbosityLevel(verbosity_level);
273 }
274
275 bool has_output_file = build_info.isMasterHasOutputFile();
277
278 // Positionne le niveau de verbosité en laissant au minimum le niveau
279 // par défaut. Sans cela, certains messages d'initialisation peuvent ne
280 // pas s'afficher ce qui peut être génant en cas de problèmes ou de plantage.
281 Int32 minimal_verbosity_level = build_info.minimalVerbosityLevel();
282 if (minimal_verbosity_level==Trace::UNSPECIFIED_VERBOSITY_LEVEL)
283 minimal_verbosity_level = Trace::DEFAULT_VERBOSITY_LEVEL;
285 }
286
287 arcaneGlobalMemoryInfo()->setTraceMng(traceMng());
288
289 {
290 // Affiche quelques informations à l'initialisation dès le niveau 4
291 m_trace->info(4) << "*** Initialization informations:";
292 m_trace->info(4) << "*** PID: " << platform::getProcessId();
293 m_trace->info(4) << "*** Host: " << platform::getHostName();
294
295 // TODO: Avec MPC, cette séquence ne doit être appelée qu'une seule fois.
300 String name = *i;
301 m_trace->info(4) << "*** Trying to load dynamic library: " << name;
303 if (!dl)
304 m_trace->info(4) << "WARNING: Can not load library '" << name << "'";
305 }
306 }
307
308#ifdef ARCANE_OS_WIN32
311 String dyn_lib_names[5] = { "arcane_mpi", "arcane_std", "arcane_mesh",
312 "arcane_thread", "arcane_mpithread",
313 };
314 for( Integer i=0; i<5; ++i )
316 }
317#endif
318
319 m_configuration_mng = arcaneCreateConfigurationMng(traceMng());
320
321 {
322 m_service_and_module_factory_mng = arcaneCreateServiceAndModuleFactoryMng(traceMng());
324 m_service_and_module_factory_mng->addGlobalFactory(*i);
326 m_service_and_module_factory_mng->addGlobalFactory(*i);
327
328 m_service_and_module_factory_mng->createAllServiceRegistererFactories();
329 }
330
332
333 String pause_on_error = platform::getEnvironmentVariable("ARCANE_PAUSE_ON_ERROR");
334 if (!pause_on_error.null()){
335 arcaneSetPauseOnError(true);
336 }
337
338 // Recherche le service utilisé pour connaitre la pile d'appel
339 bool has_dbghelp = false;
340 {
342 Ref<IStackTraceService> sv = sf.createReference("LibUnwind",SB_AllowNull);
343 if (!sv.get()){
344 sv = sf.createReference("DbgHelpStackTraceService", SB_AllowNull);
345 if (sv.get())
346 has_dbghelp = true;
347 }
348 if (sv.get()) {
349 m_stack_trace_service = sv;
350 platform::setStackTraceService(sv.get());
351 }
352 }
353
354 // Recherche le service utilisé pour connaitre les infos sur les symboles
355 // du code source. Pour l'instant on ne supporte que LLVM et on n'active ce service
356 // que si la variable d'environnement ARCANE_LLVMSYMBOLIZER_PATH est définie.
357 {
360 if (!platform::getEnvironmentVariable("ARCANE_LLVMSYMBOLIZER_PATH").null()){
361 s = sf.createReference("LLVMSymbolizer", SB_AllowNull);
362 }
363 if (!s.get() && has_dbghelp){
364 s = sf.createReference("DbgHelpSymbolizerService", SB_AllowNull);
365 }
366 if (s.get()) {
367 m_symbolizer_service = s;
369 }
370 }
371
372 if (arcaneHasThread()){
373 StringList names = build_info.threadImplementationServices();
376 if (sv.get()){
377 m_thread_implementation_service = sv;
378 m_thread_implementation = sv->createImplementation();
379 platform::setThreadImplementationService(m_thread_implementation.get());
380 m_thread_implementation->initialize();
382 }
383 else{
384 m_trace->info() << "Can not find thread implementation service "
385 << "(names=" << _stringListToArray(names) << "). Threads are disabled.";
386 arcaneSetHasThread(false);
387 }
388 }
389
390 // Le gestionnaire de thread a pu changer et il faut donc
391 // reinitialiser le gestionnaire de trace.
392 m_trace->resetThreadStatus();
393
394 // Recherche le service utilisé pour gérer les tâches
395 if (arcaneHasThread()){
396 Integer nb_task_thread = build_info.nbTaskThread();
397 if (nb_task_thread>=0){
398 StringList names = build_info.taskImplementationServices();
401 if (sv.get()){
403 //m_trace->info() << "Initialize task with nb_thread=" << nb_thread;
404 sv->initialize(nb_task_thread);
406 m_task_implementation = sv;
407 }
408 else
409 ARCANE_FATAL("Can not find task implementation service (names='{0}')."
410 " Please check if Arcane is configured with Intel TBB library",
411 _stringListToArray(names));
412 }
413
414 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_TASK_VERBOSE_LEVEL",true))
416 }
417
418 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_LOOP_PROFILING_LEVEL",true))
420
421 // Recherche le service utilisé pour le profiling
422 {
423 String profile_str = platform::getEnvironmentVariable("ARCANE_PROFILING");
424 if (!profile_str.null()){
426 auto sv = sf.createReference(profile_str+"ProfilingService",SB_AllowNull);
427 if (sv.get()){
428 m_profiling_service = sv;
430 }
431 else
432 ARCANE_FATAL("Can not find profiling service (name='{0}')",profile_str);
433 }
434 }
435
436 // Par défaut, on accroche le service Hyoda
437 {
439 auto sv = sf.createReference("Hyoda",SB_AllowNull);
440 if (sv.get()){
441 m_online_debugger = sv;
443 }
444 }
445
446 // Recherche le service utilisé pour la gestion de l'affinité processeur
447 {
449 auto sv = sf.createReference("HWLoc",SB_AllowNull);
450 if (sv.get()){
451 m_processor_affinity_service = sv;
453 }
454 }
455
456 // Recherche le service utilisé pour le parallélisme
457 String message_passing_service = build_info.messagePassingService();
458 if (message_passing_service.null())
459 message_passing_service = build_info.internalDefaultMessagePassingService();
461 auto sm = sf.createReference(message_passing_service,SB_AllowNull);
462 if (!sm)
463 ARCANE_FATAL("Can not find message passing service '{0}'",message_passing_service);
464
466 m_parallel_super_mng->initialize();
467
468 IParallelSuperMng* seq_sm = nullptr;
469 if (sm->isParallel()){
470 m_owned_sequential_parallel_super_mng = sf.createReference("SequentialParallelSuperMng",SB_AllowNull);
471 seq_sm = m_owned_sequential_parallel_super_mng.get();
472 if (!seq_sm)
473 ARCANE_FATAL("Can not find service 'SequentialParallelSuperMng'");
474 seq_sm->initialize();
475 }
476 else
478
480
484 }
485
486 {
488 int vmajor = version_info.versionMajor();
489 int vminor = version_info.versionMinor();
490 int vpatch = version_info.versionPatch();
491 m_main_version_str = String::format("{0}.{1}.{2}",vmajor,vminor,vpatch);
492 m_major_and_minor_version_str = String::format("{0}.{1}",vmajor,vminor);
494 if (vpatch!=0)
496 }
497
500 m_code_name = m_exe_info.codeName();
501
502 // Récupère le nom de l'utilisateur
503 m_user_name = platform::getUserName();
504
505 // Récupère le chemin du répertoire de la configuration utilisateur
506 // TODO: il faut changer car dans les nouvelles recommandations POSIX,
507 // le répertoire de configuration est '.config/arcane'.
508 m_user_config_path = platform::getEnvironmentVariable("ARCANE_CONFIG_PATH");
509 if (m_user_config_path.null()) {
510 Directory user_home_env(platform::getHomeDirectory());
512 }
513
514 {
515 bool is_parallel = parallelSuperMng()->isParallel();
517 // Création et initialisation du TraceMngPolicy.
518 m_trace_policy->setIsParallel(is_parallel);
519 m_trace_policy->setIsDebug(is_debug);
520 bool is_parallel_output = is_parallel && is_debug;
521 // Permet de forcer les sorties meme en mode optimisé
522 {
523 String s = platform::getEnvironmentVariable("ARCANE_PARALLEL_OUTPUT");
524 if (!s.null())
525 is_parallel_output = true;
526 if (s=="0")
527 is_parallel_output = false;
528 }
530 }
531
532 m_is_master = m_parallel_super_mng->commRank() == 0;
533
534 m_trace->info(4) << "*** UserName: " << m_user_name;
535 m_trace->info(4) << "*** HomeDirectory: " << platform::getHomeDirectory();
536
537#ifdef ARCANE_CHECK_MEMORY
538 arcaneGlobalMemoryInfo()->setTraceMng(m_trace);
539#endif
540}
541
542/*---------------------------------------------------------------------------*/
543/*---------------------------------------------------------------------------*/
544
547{
548 if (m_is_init){
549 m_trace->warning() << "Application is already initialised";
550 return;
551 }
552
553 bool is_debug = m_exe_info.isDebug();
554
555 // Analyse le fichier de configuration de l'utilisateur
557
558 //m_trace->info() << "Application init trace mng rank=" << m_parallel_super_mng->traceRank();
559 m_trace_policy->setDefaultClassConfigXmlBuffer(userConfigBuffer());
560 m_trace_policy->initializeTraceMng(m_trace.get(),m_parallel_super_mng->traceRank());
561
562 m_trace->logdate() << "Begin execution.";
563
564 if (is_debug)
565 m_trace->info() << "WARNING: Execution in DEBUG mode!";
566
567#ifdef ARCANE_CHECK
568 m_trace->info() << "WARNING: Compilation in CHECK mode !";
569#endif
570
571 // Active ou désactive un mode vérification partiel si la variable d'environnement
572 // correspondante est positionnée.
573 String check_str = platform::getEnvironmentVariable("ARCANE_CHECK");
574 if (!check_str.null()){
575 bool is_check = check_str != "0";
576 m_trace->info() << "WARNING: Setting CHECK mode to " << is_check;
578 }
579 if (arcaneIsCheck()){
580 m_trace->info() << "WARNING: Execution in CHECK mode!";
581 }
582
583#ifdef ARCANE_TRACE
584 m_trace->info() << "WARNING: Execution in TRACE mode !";
585#endif
586#ifdef ARCANE_64BIT
587 m_trace->info() << "Using 64bits version!";
588#endif
589
590 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
591 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
592 m_trace->info() << " ";
593 m_trace->info() << " "
595 m_trace->info() << " ";
597 m_trace->info() << " Version "
598 << version_info.versionMajor() << "."
599 << version_info.versionMinor() << "."
600 << version_info.versionPatch();
601
602 m_trace->info() << " ";
603 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
604 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
605 m_trace->info() << "Date: " << platform::getCurrentDateTime();
606 m_trace->info() << "MemoryUsage: " << static_cast<Int64>(platform::getMemoryUsed() / 1.0e6) << " (MegaBytes)";
607 m_trace->info() << "ArccoreVersion: " << ARCCORE_VERSION_STR_FULL;
608 m_trace->info() << "ArcaneVersion: " << ARCANE_VERSION_STR_FULL
609 << " (Compiler: " << platform::getCompilerId() << ")";
610 m_trace->info() << "Current process pid=" << platform::getProcessId()
611 << " machine=" << platform::getHostName();
612 m_trace->info() << "MessagePassing service=" << applicationBuildInfo().messagePassingService();
613
614 if (platform::getStackTraceService()){
615 m_trace->info() << "Stack trace service is available";
616 }
618 m_trace->info() << "Symbolizer service is available";
619 }
620
621#ifdef ARCANE_USE_LIBXML2
622 m_trace->info() << "Using 'libxml2' for XML parsing";
623#endif
624
625 // Affiche les infos sur les processeurs
626 {
628 if (pas){
629 pas->printInfos();
630 }
631 }
632
633 // Affiche si l'on a un service de debug
635 m_trace->info() << "Hyoda service is now hooked";
636 }
637 else{
638 m_trace->info() << "Unknown online debugger service";
639 }
640
641 m_is_init = true;
642
643 // Analyse le fichier de configuration du code.
644 _readCodeConfigurationFile();
645
646 {
647 // Construction des types internes
649 }
650
651 {
653 if (!runtime_config.empty()){
654 m_trace->info() << "Reading configuration parameters from runtime config file";
656 jdoc.parse(runtime_config);
657 JSONValue config = jdoc.root().child("configuration");
658 ConfigurationReader cr(m_trace.get(),m_configuration_mng->defaultConfiguration());
659 cr.addValuesFromJSON(config,ConfigurationReader::P_GlobalRuntime);
660 }
661 }
662 {
665 if (!configuration_elem.null()){
666 m_trace->info() << "Reading configuration parameters from code config file";
667 ConfigurationReader cr(m_trace.get(),m_configuration_mng->defaultConfiguration());
668 cr.addValuesFromXmlNode(configuration_elem,ConfigurationReader::P_Global);
669 }
670 }
671 }
672
673 _initDataInitialisationPolicy();
674
675 {
677 m_trace->info() << "Service used for thread management : '" << m_used_thread_service_name << "'";
678 else
679 m_trace->info() << "No thread management active";
680
682 m_trace->info() << "Service used for task management : '" << m_used_task_service_name
683 << "' (max_task_thread=" << TaskFactory::nbAllowedThread() << ")";
684 std::ostringstream ostr;
686 m_trace->info() << "TaskManagement infos:" << ostr.str();
687 }
688 else
689 m_trace->info() << "No task management active";
690 }
691
692 // Recherche le service utilisé pour gérer le système d'unité.
693 {
695 String service_name = "Udunits";
696 auto sv = sf.createReference(service_name,SB_AllowNull);
697 if (sv.get()){
698 m_trace->info() << "UnitSystem service found name=" << service_name;
699 }
700 else{
701 m_trace->info() << "No unit system service found";
702 sv = makeRef(createNullPhysicalUnitSystemService());
703 }
704 m_physical_unit_system_service = sv;
705 }
706
707 // Recherche le service utilisé pour gérer les compteurs de performance.
708 {
709 String service_name = "LinuxPerfPerformanceCounterService";
710 String env_service_name = platform::getEnvironmentVariable("ARCANE_PERFORMANCE_COUNTER_SERVICE");
711 if (!env_service_name.null())
712 service_name = env_service_name + "PerformanceCounterService";
714 auto p = sbuilder.createReference(service_name,SB_AllowNull);
715 m_performance_counter_service = p;
716 if (p.get()){
717 m_trace->info() << "PerformanceCounterService found name=" << service_name;
718 }
719 else{
720 m_trace->info() << "No performance counter service found";
721 }
722 }
723
724 // Initialise le traceur des énumérateurs.
725 {
726 bool force_tracer = false;
727 String trace_str = platform::getEnvironmentVariable("ARCANE_TRACE_ENUMERATOR");
729 if (!TaskFactory::isActive()){
731 auto p = m_performance_counter_service;
732 if (p.get()){
733 m_trace->info() << "Enumerator tracing is enabled";
734 Ref<IItemEnumeratorTracer> tracer(arcaneCreateItemEnumeratorTracer(traceMng(),p));
735 arcaneSetSingletonItemEnumeratorTracer(tracer);
736 p->initialize();
737 p->start();
738 }
739 else
740 m_trace->info() << "WARNING: enumerator tracing is not available because no performance counter service is available.";
741 }
742 else
743 m_trace->info() << "WARNING: enumerator tracing is not available when using multi-tasking.";
744 }
745 }
746
747 m_trace->info() << "sizeof(ItemInternal)=" << sizeof(ItemInternal)
748 << " sizeof(ItemInternalConnectivityList)=" << sizeof(ItemInternalConnectivityList)
749 << " sizeof(ItemSharedInfo)=" << sizeof(ItemSharedInfo);
750 m_trace->info() << "sizeof(ItemLocalId)=" << sizeof(ItemLocalId)
751 << " sizeof(ItemConnectivityContainerView)=" << sizeof(ItemConnectivityContainerView)
752 << " sizeof(UnstructuredMeshConnectivityView)=" << sizeof(UnstructuredMeshConnectivityView);
753 m_trace->info() << "sizeof(Item)=" << sizeof(Item)
754 << " sizeof(ItemEnumerator)=" << sizeof(ItemEnumerator)
755 << " sizeof(ItemVectorView)=" << sizeof(ItemVectorView)
756 << " sizeof(ItemVectorViewConstIterator)=" << sizeof(ItemVectorViewConstIterator)
757 << " ItemEnumeratorVersion=" << ItemEnumerator::version();
758 m_trace->info() << "sizeof(eItemKind)=" << sizeof(eItemKind)
759 << " sizeof(IndexedItemConnectivityViewBase)=" << sizeof(IndexedItemConnectivityViewBase);
760
761 {
763 if (init_time_accelerator!=0.0)
764 m_trace->info() << "Time (in ms) to initialize Accelerators = " << init_time_accelerator;
765 }
766}
767
768/*---------------------------------------------------------------------------*/
769/*---------------------------------------------------------------------------*/
770
771void Application::
772_readCodeConfigurationFile()
773{
774 // Analyse le fichier de configuration du code.
776
777 // Récupère le nom du fichier de configuration.
778 // Si nul, cela indique qu'il n'y a pas de fichier de configure.
779 // Si vide (le défaut), on récupère le nom à partir du nom du code.
780 // Sinon, on utilise le nom spécifié dans la configuration.
781
782 // A noter que cette valeur doit être la même pour tous les PE sinon cela
783 // va bloquer (TODO: faire une éventuellem réduction)
784 String config_file_name = build_info.configFileName();
785
786 bool use_config_file = true;
787 if (config_file_name.null()){
788 use_config_file = false;
789 }
790 else if (config_file_name.empty()){
791 // Regarde d'abord dans le répertoire courant, sinon dans le répertoire
792 // des données partagées (share).
793 // Pour des raisons de performances en parallèle, seul le processeur maitre
794 // fait le test.
795 StringBuilder buf;
796 if (m_is_master){
797 buf = m_exe_info.codeName();
798 buf += ".config";
799 if (!platform::isFileReadable(buf.toString())){
800 buf = m_exe_info.dataDir();
801 buf += "/";
802 buf += m_exe_info.codeName();
803 buf += ".config";
804 }
805 else{
806 m_trace->info() << "Using configuration file in current directory.";
807 }
808 }
809 config_file_name = buf.toString();
810 }
811 m_trace->info() << "Using configuration file: '" << config_file_name << "'";
812
813 if (use_config_file){
814 bool bad_file = m_io_mng->collectiveRead(config_file_name,m_config_bytes);
815 if (bad_file)
816 ARCANE_FATAL("Can not read configuration file '{0}'",config_file_name);
818 if (!m_config_document.get())
819 ARCANE_FATAL("Can not parse configuration file '{0}'",config_file_name);
820 m_config_root_element = m_config_document->documentNode().documentElement();
821 }
822}
823
824/*---------------------------------------------------------------------------*/
825/*---------------------------------------------------------------------------*/
831{
833 String buf = user_config_dir.file("config.xml");
834
835 //ByteUniqueArray bytes;
837 if (bad_file){
838 if (m_is_master)
839 m_trace->log() << "No user configuration file '" << buf << "'";
840 return;
841 }
842
844 if (!doc){
845 if (m_is_master)
846 m_trace->log() << "Can not parse user configuration file '" << buf << "'";
847 return;
848 }
849
851 m_user_config_root_element = doc->documentNode().documentElement();
852}
853
854/*---------------------------------------------------------------------------*/
855/*---------------------------------------------------------------------------*/
856
857namespace
858{
859bool _hasExtension(ICodeService* service,const String& extension)
860{
863 if ((*j)==extension)
864 return true;
865 }
866 return false;
867}
868}
869
870/*---------------------------------------------------------------------------*/
871/*---------------------------------------------------------------------------*/
872
875{
876 ServiceBuilder<ICodeService> builder(this);
877 auto services = builder.createAllInstances();
878
879 // Regarde si un service gere l'extension '.arc'.
880 // S'il n'y en a pas, utilise ArcaneCodeService pour
881 // cette extension.
882 {
883 bool has_arc_extension = false;
884 for( Integer i=0, n=services.size(); i<n; ++i ){
885 ICodeService* code_service = services[i].get();
886 if (_hasExtension(code_service,"arc")){
887 has_arc_extension = true;
888 break;
889 }
890 }
891 if (!has_arc_extension){
892 services.add(createArcaneCodeService(this));
893 }
894 }
895
896 // Cherche l'extension du fichier et la conserve dans \a case_ext
897 std::string_view fview = u_file_name.toStdStringView();
898 std::size_t extension_pos = fview.find_last_of('.');
899 if (extension_pos==std::string_view::npos)
900 return {};
901 fview.remove_prefix(extension_pos+1);
903
905 for( const auto& code_service : services ){
906 StringCollection extensions = code_service->validExtensions();
908 if (case_ext==(*j)){
910 break;
911 }
912 }
913 if (found_service.get())
914 break;
915 }
916 // TODO: retourner une référence.
917 return found_service;
918}
919
920/*---------------------------------------------------------------------------*/
921/*---------------------------------------------------------------------------*/
922
924addSession(ISession* session)
925{
926 m_sessions.add(session);
927}
928
929/*---------------------------------------------------------------------------*/
930/*---------------------------------------------------------------------------*/
931
933removeSession(ISession* session)
934{
935 m_sessions.remove(session);
936}
937
938/*---------------------------------------------------------------------------*/
939/*---------------------------------------------------------------------------*/
940
943{
944 return m_service_and_module_factory_mng->serviceFactories2();
945}
946
947/*---------------------------------------------------------------------------*/
948/*---------------------------------------------------------------------------*/
949
952{
953 return m_service_and_module_factory_mng->moduleFactoryInfos();
954}
955
956/*---------------------------------------------------------------------------*/
957/*---------------------------------------------------------------------------*/
958
959void Application::
960_initDataInitialisationPolicy()
961{
962 String data_init_policy = platform::getEnvironmentVariable("ARCANE_DATA_INIT_POLICY");
964 bool is_changed = false;
965 if (data_init_policy=="DEFAULT"){
967 is_changed = true;
968 }
969 else if (data_init_policy=="NAN"){
970 init_policy = DIP_InitWithNan;
971 is_changed = true;
972 }
973 else if (data_init_policy=="NONE"){
974 init_policy = DIP_None;
975 is_changed = true;
976 }
977 else if (data_init_policy=="LEGACY"){
978 init_policy = DIP_Legacy;
979 is_changed = true;
980 }
981 else if (data_init_policy=="NAN_AND_DEFAULT"){
983 is_changed = true;
984 }
985 if (is_changed){
987 init_policy = getGlobalDataInitialisationPolicy();
988 m_trace->info() << "Change data initialisation policy: " << data_init_policy
989 << " (" << (int)init_policy << ")";
990 }
991 m_trace->info() << "Data initialisation policy is : " << (int)init_policy;
992}
993
994/*---------------------------------------------------------------------------*/
995/*---------------------------------------------------------------------------*/
996
999{
1000 return m_arcane_main->applicationBuildInfo();
1001}
1002
1003/*---------------------------------------------------------------------------*/
1004/*---------------------------------------------------------------------------*/
1005
1011
1012/*---------------------------------------------------------------------------*/
1013/*---------------------------------------------------------------------------*/
1014
1020
1021/*---------------------------------------------------------------------------*/
1022/*---------------------------------------------------------------------------*/
1023
1032
1033/*---------------------------------------------------------------------------*/
1034/*---------------------------------------------------------------------------*/
1035
1038{
1039 return m_data_factory_mng->deprecatedOldFactory();
1040}
1041
1042/*---------------------------------------------------------------------------*/
1043/*---------------------------------------------------------------------------*/
1044
1046dataFactoryMng() const
1047{
1048 return m_data_factory_mng.get();
1049}
1050
1051/*---------------------------------------------------------------------------*/
1052/*---------------------------------------------------------------------------*/
1053
1054} // End namespace Arcane
1055
1056/*---------------------------------------------------------------------------*/
1057/*---------------------------------------------------------------------------*/
#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.
Informations pour construire une instance de IApplication.
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.
ByteConstSpan runtimeConfigFileContent() const
Contenu du fichier de configuration de l'application.
const String & applicationName() const
Nom de l'application.
const String & targetFullName() const
Retourne le nom complet de la cible.
const VersionInfo & codeVersion() const
Numéro de version.
bool isDebug() const
Retourne true si on s'exécute en mode debug.
const String & dataOsDir() const
Retourne le chemin où se trouve les fichiers de données dépendant de l'OS.
StringCollection dynamicLibrariesName() const
Liste des bibliothèques dynamiques.
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.
String m_used_task_service_name
Nom du service utilisé pour gérer les tâches.
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:94
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:82
IDataFactoryMng * dataFactoryMng() const override
Fabrique de donnée.
String m_used_thread_service_name
Nom du service utilisé pour gérer les threads.
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:69
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.
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:73
static Real initializationTimeForAccelerator()
Retourne le temps (en seconde) pour l'initialisation des runtimes accélérateurs pour ce processus.
Lecteurs de fichiers de configuration.
Classe utilitaire pour la destruction des objets alloués par new.
Definition Deleter.h:31
Classe gérant un répertoire.
Definition Directory.h:33
virtual String path() const
Retourne le chemin du répertoire.
Definition Directory.cc:129
Informations pour l'initialisation du runtime '.Net'.
Interface de la classe de gestion du code.
Definition IArcaneMain.h:54
virtual const DotNetRuntimeInitialisationInfo & dotnetRuntimeInitialisationInfo() const =0
Informations d'initialisation du runtime '.Net'.
virtual const AcceleratorRuntimeInitialisationInfo & acceleratorRuntimeInitialisationInfo() const =0
Informations d'initialisation du runtime pour les accélérateurs.
virtual const ApplicationBuildInfo & applicationBuildInfo() const =0
Informations pour construire l'instance IApplication.
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 '...
virtual IConfiguration * defaultConfiguration() const =0
Configuration par défaut.
Interface du gestionnaire de fabrique d'une donnée.
Interface d'une fabrique d'une donnée.
Interface d'une chargeur dynamique de bibliothèque.
Interface d'une bibliothèque dynamique.
virtual bool collectiveRead(const String &filename, ByteArray &bytes)=0
Lecture collective d'un fichier.
virtual IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name)=0
Lit et analyse le fichier XML contenu dans le buffer buffer.
virtual ITraceMng * createTraceMng()=0
Créé un gestionnaire de trace.
virtual IServiceMng * createServiceMng(IBase *)=0
Crée une instance du gestionnaire de services.
virtual ITraceMngPolicy * createTraceMngPolicy(IApplication *app)=0
Créé un gestionnaire de configuration pour un gestion de trace.
virtual Ref< IDataFactoryMng > createDataFactoryMngRef(IApplication *)=0
Créé un gestionnaire de fabrique pour les données.
virtual IIOMng * createIOMng(IApplication *)=0
Crée une instance du gestionnaire d'entrée/sortie.
virtual void setTraceMng(ITraceMng *msg)=0
Positionne le ITraceMng pour les messages.
Classe abstraite du superviseur de parallélisme.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface d'un service de de trace des appels de fonctions.
static IRessourceMng * createDefault(IApplication *)
Création d'un gestionnaire d'historique par défaut.
virtual ModuleFactoryInfoCollection moduleFactoryInfos() const =0
Liste des fabriques de service.
virtual void createAllServiceRegistererFactories()=0
Créé toutes les fabriques associées à des ServiceRegisterer.
virtual ServiceFactory2Collection serviceFactories2() const =0
Liste des informations sur les fabriques des modules.
virtual void addGlobalFactory(IServiceFactoryInfo *sfi)=0
Ajoute la fabrique de service sfi. sfi ne doit pas être détruit tant que cette instance est utilisée....
Interface d'une session d'exécution d'un cas.
Definition ISession.h:44
Interface du gestionnaire de configuration d'un gestionnnaire de trace.
virtual void setIsParallelOutput(bool v)=0
Indique si en parallèle tous les rangs sortent les traces dans un fichier.
virtual void initializeTraceMng(ITraceMng *trace, Int32 rank)=0
Initialise trace.
virtual void setIsDebug(bool v)=0
Indique si les sorties de débug sont actives.
virtual void setIsParallel(bool v)=0
Indique si le parallélisme est actif.
virtual void setIsMasterHasOutputFile(bool active)=0
Indique si un ITraceMng maître sort les traces dans un fichier en plus de la sortie standard.
virtual void setVerbosityLevel(Int32 level)=0
Niveau de verbosité.
virtual void setStandardOutputVerbosityLevel(Int32 level)=0
Niveau de verbosité sur le flot de sortie standard (stdout).
virtual void setDefaultVerboseLevel(ITraceMng *trace, Int32 minimal_level)=0
Gestionnaire d'un document DOM.
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:40
Structure interne partagée d'une entité de maillage.
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
Gestion d'un document JSON.
Definition JSONReader.h:230
Représente une valeur JSON.
Definition JSONReader.h:43
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Function each(Function f)
Applique le fonctor f à tous les éléments du tableau.
Definition List.h:303
static void setProfilingLevel(Int32 level)
Positionne le niveau de profilage.
Definition Profiling.cc:230
static Int32 profilingLevel()
Niveau de profilage.
Definition Profiling.h:170
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 void _internalSetImplementation(ITaskImplementation *task_impl)
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.
Vue sur les connectivités standards d'un maillage non structuré.
Informations sur une version.
Definition VersionInfo.h:46
Noeud d'un arbre DOM.
Definition XmlNode.h:51
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Definition XmlNode.cc:64
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Definition String.cc:315
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
TraceMessage log() const
Flot pour un message de log.
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage logdate() const
Flot pour un message de log précédé de la date.
IPerformanceCounterService * setPerformanceCounterService(IPerformanceCounterService *service)
Positionne le service utilisé pour gérer les compteurs interne du processeur.
ISymbolizerService * setSymbolizerService(ISymbolizerService *service)
Positionne le service pour obtenir des informations sur les symboles du code source.
IDynamicLibraryLoader * getDynamicLibraryLoader()
Service utilisé pour charger dynamiquement des bibliothèques.
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.
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.
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.
IThreadImplementation * getThreadImplementationService()
Service utilisé pour gérer les threads.
IPerformanceCounterService * getPerformanceCounterService()
Service utilisé pour obtenir pour obtenir les compteurs interne du processeur.
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:151
eDataInitialisationPolicy
Type de politique d'initialisation possible pour une donnée.
Definition DataTypes.h:127
@ DIP_InitInitialWithNanResizeWithDefault
Initialisation avec des NaN pour à la création et le constructeur par défaut ensuite.
Definition DataTypes.h:166
@ DIP_Legacy
Initialisation en mode historique.
Definition DataTypes.h:157
@ DIP_None
Pas d'initialisation forcée.
Definition DataTypes.h:129
@ DIP_InitWithNan
Initialisation avec des NaN (Not a Number)
Definition DataTypes.h:144
@ DIP_InitWithDefault
Initialisation avec le constructeur par défaut.
Definition DataTypes.h:136
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
Definition Misc.cc:182
void arcaneSetHasThread(bool v)
Active ou désactive le support des threads.
Definition Misc.cc:188
eDataInitialisationPolicy getGlobalDataInitialisationPolicy()
Récupère la politique d'initialisation des variables.
Definition DataTypes.cc:162
Span< const std::byte > ByteConstSpan
Vue en lecture seule d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:706
void arcaneSetCheck(bool v)
Active ou désactive le mode vérification.
Definition Misc.cc:157
eItemKind
Genre d'entité de maillage.