Arcane  v4.1.0.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 "arcane/utils/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
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
100createNullPhysicalUnitSystemService();
101extern "C++" IConfigurationMng*
102arcaneCreateConfigurationMng(ITraceMng* tm);
103extern "C++" ARCANE_IMPL_EXPORT IServiceAndModuleFactoryMng*
104arcaneCreateServiceAndModuleFactoryMng(ITraceMng* tm);
105extern "C++" ARCANE_IMPL_EXPORT Ref<IItemEnumeratorTracer>
106arcaneCreateItemEnumeratorTracer(ITraceMng* tm,Ref<IPerformanceCounterService> perf_counter);
107extern "C++" ARCANE_IMPL_EXPORT Ref<ICodeService>
108createArcaneCodeService(IApplication* app);
109extern "C++" ARCANE_CORE_EXPORT void
110arcaneSetSingletonItemEnumeratorTracer(Ref<IItemEnumeratorTracer> tracer);
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
135, m_namespace_uri(arcaneNamespaceURI())
136, m_local_name("Application")
137, m_arcane_main(am)
139, m_service_mng(nullptr)
141, m_trace(nullptr)
142, m_ressource_mng(nullptr)
143, m_io_mng(nullptr)
144, m_configuration_mng(nullptr)
145, m_main_service_factory_infos(am->registeredServiceFactoryInfos())
146, m_main_module_factory_infos(am->registeredModuleFactoryInfos())
147, m_has_garbage_collector(am->hasGarbageCollector())
148, m_trace_policy(nullptr)
149, m_is_init(false)
150, m_is_master(false)
151, m_service_and_module_factory_mng(nullptr)
152{
153 // Initialise les threads avec un service qui ne fait rien.
154 platform::setThreadImplementationService(&m_null_thread_implementation);
155}
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
166{
168 m_task_implementation.reset();
169
170 // Supprime les services que l'instance a positionné
171 if (platform::getProcessorAffinityService()==m_processor_affinity_service.get())
173
174 if (platform::getStackTraceService()==m_stack_trace_service.get())
176
177 if (platform::getSymbolizerService()==m_symbolizer_service.get())
179
180 if (platform::getProfilingService()==m_profiling_service.get())
182
183 if (platform::getPerformanceCounterService()==m_performance_counter_service.get())
185
186 delete m_service_and_module_factory_mng;
187
188 m_sessions.each(Deleter());
189
190 delete m_configuration_mng;
191 delete m_ressource_mng;
192
193 m_owned_sequential_parallel_super_mng.reset();
194 m_parallel_super_mng.reset();
195
196 m_data_factory_mng.reset();
197 delete m_io_mng;
198 delete m_service_mng;
199
200 m_trace = nullptr;
201 // Il faut détruire le m_trace_policy après m_trace car ce dernier peut
202 // l'utiliser.
203 delete m_trace_policy;
204
205 // Supprime la référence au gestionnaire de thread. Il faut le faire en dernier car
206 // les autres gestionnaires peuvent l'utiliser.
207 if (platform::getThreadImplementationService()==m_thread_implementation.get())
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
214UniqueArray<String> Application::
215_stringListToArray(const StringList& slist) const
216{
218 for( const String& s : slist )
219 a.add(s);
220 return a;
221}
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
235template<typename InterfaceType> Ref<InterfaceType> Application::
236_tryCreateService(const StringList& names,String* found_name)
237{
238 if (found_name)
239 (*found_name) = String();
241 for( String s : names ){
242 auto t = sf.createReference(s,SB_AllowNull);
243 if (t.get()){
244 if (found_name)
245 (*found_name) = s;
246 return t;
247 }
248 }
249 return {};
250}
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
261template<typename InterfaceType> Ref<InterfaceType> Application::
262_tryCreateServiceUsingInjector(const StringList& names,String* found_name)
263{
264 DependencyInjection::Injector injector;
265 injector.fillWithGlobalFactories();
266
267 if (found_name)
268 (*found_name) = String();
269 for( String s : names ){
270 auto t = injector.createInstance<InterfaceType>(s,true);
271 if (t.get()){
272 if (found_name)
273 (*found_name) = s;
274 return t;
275 }
276 }
277 return {};
278}
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
283extern "C++" ARCANE_UTILS_EXPORT void
284arcaneSetPauseOnError(bool v);
285
287build()
288{
289 const ApplicationBuildInfo& build_info = applicationBuildInfo();
290
291 // Création du TraceMngPolicy. L'initialisation complète se fera plus tard
292 // car on a besoin d'informations supplémentaires comme le rang MPI et
293 // d'avoir lu des fichiers de configuration.
294 m_trace_policy = m_main_factory->createTraceMngPolicy(this);
295
296 // Toujours le premier après TraceMngPolicy
297 m_trace = m_main_factory->createTraceMng();
298
299 {
300 // TODO: positionner ces informations dans ApplicationBuildInfo.
301 Int32 output_level = build_info.outputLevel();
302 if (output_level!=Trace::UNSPECIFIED_VERBOSITY_LEVEL){
303 m_trace_policy->setVerbosityLevel(output_level);
304 m_trace_policy->setStandardOutputVerbosityLevel(output_level);
305 }
306 Int32 verbosity_level = build_info.verbosityLevel();
307 if (verbosity_level!=Trace::UNSPECIFIED_VERBOSITY_LEVEL){
308 m_trace_policy->setVerbosityLevel(verbosity_level);
309 }
310
311 bool has_output_file = build_info.isMasterHasOutputFile();
312 m_trace_policy->setIsMasterHasOutputFile(has_output_file);
313
314 // Positionne le niveau de verbosité en laissant au minimum le niveau
315 // par défaut. Sans cela, certains messages d'initialisation peuvent ne
316 // pas s'afficher ce qui peut être génant en cas de problèmes ou de plantage.
317 Int32 minimal_verbosity_level = build_info.minimalVerbosityLevel();
318 if (minimal_verbosity_level==Trace::UNSPECIFIED_VERBOSITY_LEVEL)
319 minimal_verbosity_level = Trace::DEFAULT_VERBOSITY_LEVEL;
320 m_trace_policy->setDefaultVerboseLevel(m_trace.get(),minimal_verbosity_level);
321 }
322
323 arcaneGlobalMemoryInfo()->setTraceMng(traceMng());
324
325 {
326 // Affiche quelques informations à l'initialisation dès le niveau 4
327 m_trace->info(4) << "*** Initialization informations:";
328 m_trace->info(4) << "*** PID: " << platform::getProcessId();
329 m_trace->info(4) << "*** Host: " << platform::getHostName();
330
331 // TODO: Avec MPC, cette séquence ne doit être appelée qu'une seule fois.
333 if (dynamic_library_loader){
334 String os_dir(m_exe_info.dataOsDir());
335#ifdef ARCANE_OS_WIN32
336 {
337 // Sous windows, si le processus est lancé via 'dotnet' par exemple,
338 // les chemins de recherche pour LoadLibrary() ont pu être modifiés
339 // et on ne vas plus chercher par défaut dans le répertoire courant
340 // pour charger les bibliothèques natives. Pour corrige ce problème
341 // on repositionne le comportement qui autorise à ajouter des chemins
342 // utilisateurs et on ajoute 'os_dir' à ce chemin.
343 // Sans cela, les dépendances aux bibliothèques chargées par LoadLibrary()
344 // ne seront pas trouvé. Par exemple 'arcane_thread.dll' dépend de 'tbb.dll' et
345 // tous les deux sont le même répertoire mais si répertoire n'est pas
346 // dans la liste autorisé, alors 'tbb.dll' ne sera pas trouvé.
347 //
348 // NOTE: On pourrait peut-être éviter cela en utilisant LoadLibraryEx() et en
349 // spécifiant LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR comme flag de recherche.
350 // A vérifier si cela fonctionne lorsqu'on n'utilisera plus le chargeur
351 // dynamique de la glib.
352 m_trace->info(4) << "Adding '" << os_dir << "' to search library path";
353 std::wstring wide_os_dir = StringUtils::convertToStdWString(os_dir);
354 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
355 AddDllDirectory(wide_os_dir.c_str());
356 }
357#endif
358 for( StringCollection::Enumerator i(m_exe_info.dynamicLibrariesName()); ++i; ){
359 String name = *i;
360 m_trace->info(4) << "*** Trying to load dynamic library: " << name;
361 IDynamicLibrary* dl = dynamic_library_loader->open(os_dir,name);
362 if (!dl)
363 m_trace->info(4) << "WARNING: Can not load library '" << name << "'";
364 }
365 }
366
367#ifdef ARCANE_OS_WIN32
368 if (dynamic_library_loader){
369 String os_dir(m_exe_info.dataOsDir());
370 // TODO: Ajouter le répertoire contenant 'arcane_impl' qui est connu dans ArcaneMain dans m_arcane_lib_path.
371 String dyn_lib_names[5] = { "arcane_mpi", "arcane_std", "arcane_mesh",
372 "arcane_thread", "arcane_mpithread",
373 };
374 for( Integer i=0; i<5; ++i )
375 dynamic_library_loader->open(os_dir,dyn_lib_names[i]);
376 }
377#endif
378
379 m_configuration_mng = arcaneCreateConfigurationMng(traceMng());
380
381 {
382 m_service_and_module_factory_mng = arcaneCreateServiceAndModuleFactoryMng(traceMng());
384 m_service_and_module_factory_mng->addGlobalFactory(*i);
386 m_service_and_module_factory_mng->addGlobalFactory(*i);
387
388 m_service_and_module_factory_mng->createAllServiceRegistererFactories();
389 }
390
391 m_service_mng = m_main_factory->createServiceMng(this);
392
393 String pause_on_error = platform::getEnvironmentVariable("ARCANE_PAUSE_ON_ERROR");
394 if (!pause_on_error.null()){
395 arcaneSetPauseOnError(true);
396 }
397
398 // Recherche le service utilisé pour connaitre la pile d'appel
399 bool has_dbghelp = false;
400 {
403 const auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_USE_BACKWARDCPP", true);
404 if (v && v.value() != 0) {
405 sv = sf.createReference("BackwardCppStackTraceService", SB_AllowNull);
406 }
407 else {
408 sv = sf.createReference("LibUnwind", SB_AllowNull);
409 }
410 if (!sv.get()){
411 sv = sf.createReference("DbgHelpStackTraceService", SB_AllowNull);
412 if (sv.get())
413 has_dbghelp = true;
414 }
415 if (sv.get()) {
416 m_stack_trace_service = sv;
418 }
419 }
420
421 // Recherche le service utilisé pour connaitre les infos sur les symboles
422 // du code source. Pour l'instant on ne supporte que LLVM et on n'active ce service
423 // que si la variable d'environnement ARCANE_LLVMSYMBOLIZER_PATH est définie.
424 {
427 if (!platform::getEnvironmentVariable("ARCANE_LLVMSYMBOLIZER_PATH").null()){
428 s = sf.createReference("LLVMSymbolizer", SB_AllowNull);
429 }
430 if (!s.get() && has_dbghelp){
431 s = sf.createReference("DbgHelpSymbolizerService", SB_AllowNull);
432 }
433 if (s.get()) {
434 m_symbolizer_service = s;
436 }
437 }
438
439 if (arcaneHasThread()){
440 StringList names = build_info.threadImplementationServices();
441 String found_name;
443 if (sv.get()){
444 m_thread_implementation_service = sv;
445 m_thread_implementation = sv->createImplementation();
446 platform::setThreadImplementationService(m_thread_implementation.get());
447 m_thread_implementation->initialize();
448 m_used_thread_service_name = found_name;
449 }
450 else{
451 m_trace->info() << "Can not find thread implementation service "
452 << "(names=" << _stringListToArray(names) << "). Threads are disabled.";
453 arcaneSetHasThread(false);
454 }
455 }
456
457 // Le gestionnaire de thread a pu changer et il faut donc
458 // reinitialiser le gestionnaire de trace.
459 m_trace->resetThreadStatus();
460
461 // Recherche le service utilisé pour gérer les tâches
462 if (arcaneHasThread()){
463 Integer nb_task_thread = build_info.nbTaskThread();
464 if (nb_task_thread>=0){
465
466 StringList names = build_info.taskImplementationServices();
467 String found_name;
468 auto sv = _tryCreateServiceUsingInjector<ITaskImplementation>(names,&found_name);
469 if (sv.get()){
470 TaskFactoryInternal::setImplementation(sv.get());
471 //m_trace->info() << "Initialize task with nb_thread=" << nb_thread;
472 sv->initialize(nb_task_thread);
473 m_used_task_service_name = found_name;
474 m_task_implementation = sv;
475 }
476 else
477 ARCANE_FATAL("Can not find task implementation service (names='{0}')."
478 " Please check if Arcane is configured with Intel TBB library",
479 _stringListToArray(names));
480 }
481
482 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_TASK_VERBOSE_LEVEL",true))
484 }
485
486 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_LOOP_PROFILING_LEVEL",true))
488
489 // Recherche le service utilisé pour le profiling
490 {
491 String profile_str = platform::getEnvironmentVariable("ARCANE_PROFILING");
492 if (!profile_str.null()){
494 auto sv = sf.createReference(profile_str+"ProfilingService",SB_AllowNull);
495 if (sv.get()){
496 m_profiling_service = sv;
498 }
499 else
500 ARCANE_FATAL("Can not find profiling service (name='{0}')",profile_str);
501 }
502 }
503
504 // Par défaut, on accroche le service Hyoda
505 {
507 auto sv = sf.createReference("Hyoda",SB_AllowNull);
508 if (sv.get()){
509 m_online_debugger = sv;
511 }
512 }
513
514 // Recherche le service utilisé pour la gestion de l'affinité processeur
515 {
517 auto sv = sf.createReference("HWLoc",SB_AllowNull);
518 if (sv.get()){
519 m_processor_affinity_service = sv;
521 }
522 }
523
524 // Recherche le service utilisé pour le parallélisme
525 String message_passing_service = build_info.messagePassingService();
526 if (message_passing_service.null())
527 message_passing_service = build_info.internalDefaultMessagePassingService();
529 auto sm = sf.createReference(message_passing_service,SB_AllowNull);
530 if (!sm)
531 ARCANE_FATAL("Can not find message passing service '{0}'",message_passing_service);
532
534 m_parallel_super_mng->initialize();
535
536 IParallelSuperMng* seq_sm = nullptr;
537 if (sm->isParallel()){
538 m_owned_sequential_parallel_super_mng = sf.createReference("SequentialParallelSuperMng",SB_AllowNull);
539 seq_sm = m_owned_sequential_parallel_super_mng.get();
540 if (!seq_sm)
541 ARCANE_FATAL("Can not find service 'SequentialParallelSuperMng'");
542 seq_sm->initialize();
543 }
544 else
545 seq_sm = m_parallel_super_mng.get();
546
548
550 m_io_mng = m_main_factory->createIOMng(this);
551 m_data_factory_mng = m_main_factory->createDataFactoryMngRef(this);
552 }
553
554 {
555 VersionInfo version_info = m_exe_info.codeVersion();
556 int vmajor = version_info.versionMajor();
557 int vminor = version_info.versionMinor();
558 int vpatch = version_info.versionPatch();
559 m_main_version_str = String::format("{0}.{1}.{2}",vmajor,vminor,vpatch);
560 m_major_and_minor_version_str = String::format("{0}.{1}",vmajor,vminor);
562 if (vpatch!=0)
564 }
565
566 m_targetinfo_str = m_exe_info.targetFullName();
567 m_application_name = m_exe_info.applicationName();
568 m_code_name = m_exe_info.codeName();
569
570 // Récupère le nom de l'utilisateur
572
573 // Récupère le chemin du répertoire de la configuration utilisateur
574 // TODO: il faut changer car dans les nouvelles recommandations POSIX,
575 // le répertoire de configuration est '.config/arcane'.
577 if (m_user_config_path.null()) {
578 Directory user_home_env(platform::getHomeDirectory());
579 m_user_config_path = Directory(user_home_env, ".arcane").path();
580 }
581
582 {
583 bool is_parallel = parallelSuperMng()->isParallel();
584 bool is_debug = applicationInfo().isDebug();
585 // Création et initialisation du TraceMngPolicy.
586 m_trace_policy->setIsParallel(is_parallel);
587 m_trace_policy->setIsDebug(is_debug);
588 bool is_parallel_output = is_parallel && is_debug;
589 // Permet de forcer les sorties meme en mode optimisé
590 {
591 String s = platform::getEnvironmentVariable("ARCANE_PARALLEL_OUTPUT");
592 if (!s.null())
593 is_parallel_output = true;
594 if (s=="0")
595 is_parallel_output = false;
596 }
597 m_trace_policy->setIsParallelOutput(is_parallel_output);
598 }
599
600 m_is_master = m_parallel_super_mng->commRank() == 0;
601
602 m_trace->info(4) << "*** UserName: " << m_user_name;
603 m_trace->info(4) << "*** HomeDirectory: " << platform::getHomeDirectory();
604
605#ifdef ARCANE_CHECK_MEMORY
606 arcaneGlobalMemoryInfo()->setTraceMng(m_trace);
607#endif
608}
609
610/*---------------------------------------------------------------------------*/
611/*---------------------------------------------------------------------------*/
612
615{
616 if (m_is_init){
617 m_trace->warning() << "Application is already initialised";
618 return;
619 }
620
621 bool is_debug = m_exe_info.isDebug();
622
623 // Analyse le fichier de configuration de l'utilisateur
625
626 //m_trace->info() << "Application init trace mng rank=" << m_parallel_super_mng->traceRank();
627 m_trace_policy->setDefaultClassConfigXmlBuffer(userConfigBuffer());
628 m_trace_policy->initializeTraceMng(m_trace.get(),m_parallel_super_mng->traceRank());
629
630 m_trace->logdate() << "Begin execution.";
631
632 if (is_debug)
633 m_trace->info() << "WARNING: Execution in DEBUG mode!";
634
635#ifdef ARCANE_CHECK
636 m_trace->info() << "WARNING: Compilation in CHECK mode !";
637#endif
638
639 // Active ou désactive un mode vérification partiel si la variable d'environnement
640 // correspondante est positionnée.
641 String check_str = platform::getEnvironmentVariable("ARCANE_CHECK");
642 if (!check_str.null()){
643 bool is_check = check_str != "0";
644 m_trace->info() << "WARNING: Setting CHECK mode to " << is_check;
645 arcaneSetCheck(is_check);
646 }
647 if (arcaneIsCheck()){
648 m_trace->info() << "WARNING: Execution in CHECK mode!";
649 }
650
651#ifdef ARCANE_TRACE
652 m_trace->info() << "WARNING: Execution in TRACE mode !";
653#endif
654#ifdef ARCANE_64BIT
655 m_trace->info() << "Using 64bits version!";
656#endif
657
658 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
659 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
660 m_trace->info() << " ";
661 m_trace->info() << " "
662 << m_exe_info.applicationName();
663 m_trace->info() << " ";
664 VersionInfo version_info = m_exe_info.codeVersion();
665 m_trace->info() << " Version "
666 << version_info.versionMajor() << "."
667 << version_info.versionMinor() << "."
668 << version_info.versionPatch();
669
670 m_trace->info() << " ";
671 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
672 m_trace->info() << "** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **";
673 m_trace->info() << "Date: " << platform::getCurrentDateTime();
674 m_trace->info() << "MemoryUsage: " << static_cast<Int64>(platform::getMemoryUsed() / 1.0e6) << " (MegaBytes)";
675 m_trace->info() << "ArccoreVersion: " << ARCCORE_VERSION_STR_FULL;
676 m_trace->info() << "ArcaneVersion: " << ARCANE_VERSION_STR_FULL
677 << " (Compiler: " << platform::getCompilerId() << ")";
678 m_trace->info() << "Current process pid=" << platform::getProcessId()
679 << " machine=" << platform::getHostName();
680 m_trace->info() << "MessagePassing service=" << applicationBuildInfo().messagePassingService();
681
683 m_trace->info() << "Stack trace service is available";
684 }
686 m_trace->info() << "Symbolizer service is available";
687 }
688
689#ifdef ARCANE_USE_LIBXML2
690 m_trace->info() << "Using 'libxml2' for XML parsing";
691#endif
692
693 // Affiche les infos sur les processeurs
694 {
696 if (pas){
697 pas->printInfos();
698 }
699 }
700
701 // Affiche si l'on a un service de debug
703 m_trace->info() << "Hyoda service is now hooked";
704 }
705 else{
706 m_trace->info() << "Unknown online debugger service";
707 }
708
709 m_is_init = true;
710
711 // Analyse le fichier de configuration du code.
712 _readCodeConfigurationFile();
713
714 {
715 // Construction des types internes
717 }
718
719 {
720 ByteConstSpan runtime_config = m_exe_info.runtimeConfigFileContent();
721 if (!runtime_config.empty()){
722 m_trace->info() << "Reading configuration parameters from runtime config file";
723 JSONDocument jdoc;
724 jdoc.parse(runtime_config);
725 JSONValue config = jdoc.root().child("configuration");
726 ConfigurationReader cr(m_trace.get(),m_configuration_mng->defaultConfiguration());
727 cr.addValuesFromJSON(config,ConfigurationReader::P_GlobalRuntime);
728 }
729 }
730 {
731 if (!m_config_root_element.null()){
732 XmlNode configuration_elem = m_config_root_element.child("configuration");
733 if (!configuration_elem.null()){
734 m_trace->info() << "Reading configuration parameters from code config file";
735 ConfigurationReader cr(m_trace.get(),m_configuration_mng->defaultConfiguration());
736 cr.addValuesFromXmlNode(configuration_elem,ConfigurationReader::P_Global);
737 }
738 }
739 }
740
741 _initDataInitialisationPolicy();
742
743 {
744 if (!m_used_thread_service_name.null())
745 m_trace->info() << "Service used for thread management : '" << m_used_thread_service_name << "'";
746 else
747 m_trace->info() << "No thread management active";
748
749 if (!m_used_task_service_name.null()){
750 m_trace->info() << "Service used for task management : '" << m_used_task_service_name
751 << "' (max_task_thread=" << TaskFactory::nbAllowedThread() << ")";
752 std::ostringstream ostr;
754 m_trace->info() << "TaskManagement infos:" << ostr.str();
755 }
756 else
757 m_trace->info() << "No task management active";
758 }
759
760 // Recherche le service utilisé pour gérer le système d'unité.
761 {
763 String service_name = "Udunits";
764 auto sv = sf.createReference(service_name,SB_AllowNull);
765 if (sv.get()){
766 m_trace->info() << "UnitSystem service found name=" << service_name;
767 }
768 else{
769 m_trace->info() << "No unit system service found";
770 sv = makeRef(createNullPhysicalUnitSystemService());
771 }
772 m_physical_unit_system_service = sv;
773 }
774
775 // Recherche le service utilisé pour gérer les compteurs de performance.
776 {
777 String service_name = "LinuxPerfPerformanceCounterService";
778 String env_service_name = platform::getEnvironmentVariable("ARCANE_PERFORMANCE_COUNTER_SERVICE");
779 if (!env_service_name.null())
780 service_name = env_service_name + "PerformanceCounterService";
782 auto p = sbuilder.createReference(service_name,SB_AllowNull);
783 m_performance_counter_service = p;
784 if (p.get()){
785 m_trace->info() << "PerformanceCounterService found name=" << service_name;
786 }
787 else{
788 m_trace->info() << "No performance counter service found";
789 }
790 }
791
792 // Initialise le traceur des énumérateurs.
793 {
794 bool force_tracer = false;
795 String trace_str = platform::getEnvironmentVariable("ARCANE_TRACE_ENUMERATOR");
796 if (!trace_str.null() || ProfilingRegistry::profilingLevel()>=1 || force_tracer){
797 if (!TaskFactory::isActive()){
799 auto p = m_performance_counter_service;
800 if (p.get()){
801 m_trace->info() << "Enumerator tracing is enabled";
802 Ref<IItemEnumeratorTracer> tracer(arcaneCreateItemEnumeratorTracer(traceMng(),p));
803 arcaneSetSingletonItemEnumeratorTracer(tracer);
804 p->initialize();
805 p->start();
806 }
807 else
808 m_trace->info() << "WARNING: enumerator tracing is not available because no performance counter service is available.";
809 }
810 else
811 m_trace->info() << "WARNING: enumerator tracing is not available when using multi-tasking.";
812 }
813 }
814
815 m_trace->info() << "sizeof(ItemInternal)=" << sizeof(ItemInternal)
816 << " sizeof(ItemInternalConnectivityList)=" << sizeof(ItemInternalConnectivityList)
817 << " sizeof(ItemSharedInfo)=" << sizeof(ItemSharedInfo);
818 m_trace->info() << "sizeof(ItemLocalId)=" << sizeof(ItemLocalId)
819 << " sizeof(ItemConnectivityContainerView)=" << sizeof(ItemConnectivityContainerView)
820 << " sizeof(UnstructuredMeshConnectivityView)=" << sizeof(UnstructuredMeshConnectivityView);
821 m_trace->info() << "sizeof(Item)=" << sizeof(Item)
822 << " sizeof(ItemEnumerator)=" << sizeof(ItemEnumerator)
823 << " sizeof(ItemVectorView)=" << sizeof(ItemVectorView)
824 << " sizeof(ItemVectorViewConstIterator)=" << sizeof(ItemVectorViewConstIterator)
825 << " ItemEnumeratorVersion=" << ItemEnumerator::version();
826 m_trace->info() << "sizeof(eItemKind)=" << sizeof(eItemKind)
827 << " sizeof(IndexedItemConnectivityViewBase)=" << sizeof(IndexedItemConnectivityViewBase);
828
829 {
830 Real init_time_accelerator = ArcaneMain::initializationTimeForAccelerator() * 1000.0;
831 if (init_time_accelerator!=0.0)
832 m_trace->info() << "Time (in ms) to initialize Accelerators = " << init_time_accelerator;
833 }
834}
835
836/*---------------------------------------------------------------------------*/
837/*---------------------------------------------------------------------------*/
838
839void Application::
840_readCodeConfigurationFile()
841{
842 // Analyse le fichier de configuration du code.
843 const ApplicationBuildInfo& build_info = applicationBuildInfo();
844
845 // Récupère le nom du fichier de configuration.
846 // Si nul, cela indique qu'il n'y a pas de fichier de configure.
847 // Si vide (le défaut), on récupère le nom à partir du nom du code.
848 // Sinon, on utilise le nom spécifié dans la configuration.
849
850 // A noter que cette valeur doit être la même pour tous les PE sinon cela
851 // va bloquer (TODO: faire une éventuellem réduction)
852 String config_file_name = build_info.configFileName();
853
854 bool use_config_file = true;
855 if (config_file_name.null()){
856 use_config_file = false;
857 }
858 else if (config_file_name.empty()){
859 // Regarde d'abord dans le répertoire courant, sinon dans le répertoire
860 // des données partagées (share).
861 // Pour des raisons de performances en parallèle, seul le processeur maitre
862 // fait le test.
863 StringBuilder buf;
864 if (m_is_master){
865 buf = m_exe_info.codeName();
866 buf += ".config";
867 if (!platform::isFileReadable(buf.toString())){
868 buf = m_exe_info.dataDir();
869 buf += "/";
870 buf += m_exe_info.codeName();
871 buf += ".config";
872 }
873 else{
874 m_trace->info() << "Using configuration file in current directory.";
875 }
876 }
877 config_file_name = buf.toString();
878 }
879 m_trace->info() << "Using configuration file: '" << config_file_name << "'";
880
881 if (use_config_file){
882 bool bad_file = m_io_mng->collectiveRead(config_file_name,m_config_bytes);
883 if (bad_file)
884 ARCANE_FATAL("Can not read configuration file '{0}'",config_file_name);
885 m_config_document = m_io_mng->parseXmlBuffer(m_config_bytes,config_file_name);
886 if (!m_config_document.get())
887 ARCANE_FATAL("Can not parse configuration file '{0}'",config_file_name);
888 m_config_root_element = m_config_document->documentNode().documentElement();
889 }
890}
891
892/*---------------------------------------------------------------------------*/
893/*---------------------------------------------------------------------------*/
899{
900 Directory user_config_dir(m_user_config_path);
901 String buf = user_config_dir.file("config.xml");
902
903 //ByteUniqueArray bytes;
904 bool bad_file = m_io_mng->collectiveRead(buf,m_user_config_bytes);
905 if (bad_file){
906 if (m_is_master)
907 m_trace->log() << "No user configuration file '" << buf << "'";
908 return;
909 }
910
911 IXmlDocumentHolder* doc = m_io_mng->parseXmlBuffer(m_user_config_bytes,buf);
912 if (!doc){
913 if (m_is_master)
914 m_trace->log() << "Can not parse user configuration file '" << buf << "'";
915 return;
916 }
917
920}
921
922/*---------------------------------------------------------------------------*/
923/*---------------------------------------------------------------------------*/
924
925namespace
926{
927bool _hasExtension(ICodeService* service,const String& extension)
928{
929 StringCollection extensions = service->validExtensions();
930 for( StringCollection::Enumerator j(extensions); ++j; ){
931 if ((*j)==extension)
932 return true;
933 }
934 return false;
935}
936}
937
938/*---------------------------------------------------------------------------*/
939/*---------------------------------------------------------------------------*/
940
942getCodeService(const String& u_file_name)
943{
944 ServiceBuilder<ICodeService> builder(this);
945 auto services = builder.createAllInstances();
946
947 // Regarde si un service gere l'extension '.arc'.
948 // S'il n'y en a pas, utilise ArcaneCodeService pour
949 // cette extension.
950 {
951 bool has_arc_extension = false;
952 for( Integer i=0, n=services.size(); i<n; ++i ){
953 ICodeService* code_service = services[i].get();
954 if (_hasExtension(code_service,"arc")){
955 has_arc_extension = true;
956 break;
957 }
958 }
959 if (!has_arc_extension){
960 services.add(createArcaneCodeService(this));
961 }
962 }
963
964 // Cherche l'extension du fichier et la conserve dans \a case_ext
965 std::string_view fview = u_file_name.toStdStringView();
966 std::size_t extension_pos = fview.find_last_of('.');
967 if (extension_pos==std::string_view::npos)
968 return {};
969 fview.remove_prefix(extension_pos+1);
970 String case_ext(fview);
971
972 Ref<ICodeService> found_service;
973 for( const auto& code_service : services ){
974 StringCollection extensions = code_service->validExtensions();
975 for( StringCollection::Enumerator j(extensions); ++j; ){
976 if (case_ext==(*j)){
977 found_service = code_service;
978 break;
979 }
980 }
981 if (found_service.get())
982 break;
983 }
984 // TODO: retourner une référence.
985 return found_service;
986}
987
988/*---------------------------------------------------------------------------*/
989/*---------------------------------------------------------------------------*/
990
992addSession(ISession* session)
993{
994 m_sessions.add(session);
995}
996
997/*---------------------------------------------------------------------------*/
998/*---------------------------------------------------------------------------*/
999
1001removeSession(ISession* session)
1002{
1003 m_sessions.remove(session);
1004}
1005
1006/*---------------------------------------------------------------------------*/
1007/*---------------------------------------------------------------------------*/
1008
1011{
1012 return m_service_and_module_factory_mng->serviceFactories2();
1013}
1014
1015/*---------------------------------------------------------------------------*/
1016/*---------------------------------------------------------------------------*/
1017
1020{
1021 return m_service_and_module_factory_mng->moduleFactoryInfos();
1022}
1023
1024/*---------------------------------------------------------------------------*/
1025/*---------------------------------------------------------------------------*/
1026
1027void Application::
1028_initDataInitialisationPolicy()
1029{
1030 String data_init_policy = platform::getEnvironmentVariable("ARCANE_DATA_INIT_POLICY");
1032 bool is_changed = false;
1033 if (data_init_policy=="DEFAULT"){
1034 init_policy = DIP_InitWithDefault;
1035 is_changed = true;
1036 }
1037 else if (data_init_policy=="NAN"){
1038 init_policy = DIP_InitWithNan;
1039 is_changed = true;
1040 }
1041 else if (data_init_policy=="NONE"){
1042 init_policy = DIP_None;
1043 is_changed = true;
1044 }
1045 else if (data_init_policy=="LEGACY"){
1046 init_policy = DIP_Legacy;
1047 is_changed = true;
1048 }
1049 else if (data_init_policy=="NAN_AND_DEFAULT"){
1051 is_changed = true;
1052 }
1053 if (is_changed){
1055 init_policy = getGlobalDataInitialisationPolicy();
1056 m_trace->info() << "Change data initialisation policy: " << data_init_policy
1057 << " (" << (int)init_policy << ")";
1058 }
1059 m_trace->info() << "Data initialisation policy is : " << (int)init_policy;
1060}
1061
1062/*---------------------------------------------------------------------------*/
1063/*---------------------------------------------------------------------------*/
1064
1067{
1068 return m_arcane_main->applicationBuildInfo();
1069}
1070
1071/*---------------------------------------------------------------------------*/
1072/*---------------------------------------------------------------------------*/
1073
1076{
1077 return m_arcane_main->dotnetRuntimeInitialisationInfo();
1078}
1079
1080/*---------------------------------------------------------------------------*/
1081/*---------------------------------------------------------------------------*/
1082
1085{
1086 return m_arcane_main->acceleratorRuntimeInitialisationInfo();
1087}
1088
1089/*---------------------------------------------------------------------------*/
1090/*---------------------------------------------------------------------------*/
1091
1093createAndInitializeTraceMng(ITraceMng* parent_trace,const String& file_suffix)
1094{
1097 tmp->initializeTraceMng(tm,parent_trace,file_suffix);
1098 return tm;
1099}
1100
1101/*---------------------------------------------------------------------------*/
1102/*---------------------------------------------------------------------------*/
1103
1106{
1107 return m_data_factory_mng->deprecatedOldFactory();
1108}
1109
1110/*---------------------------------------------------------------------------*/
1111/*---------------------------------------------------------------------------*/
1112
1114dataFactoryMng() const
1115{
1116 return m_data_factory_mng.get();
1117}
1118
1119/*---------------------------------------------------------------------------*/
1120/*---------------------------------------------------------------------------*/
1121
1122} // End namespace Arcane
1123
1124/*---------------------------------------------------------------------------*/
1125/*---------------------------------------------------------------------------*/
#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.
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_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 > _tryCreateServiceUsingInjector(const StringList &names, String *found_name)
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.
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:73
static Real initializationTimeForAccelerator()
Retourne le temps (en seconde) pour l'initialisation des runtimes accélérateurs pour ce processus.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
EnumeratorT< String > Enumerator
Definition Collection.h:129
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.
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'une chargeur dynamique de bibliothèque.
virtual IDynamicLibrary * open(const String &directory, const String &name)=0
Charge une bibliothèque dynamique.
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 de trace des appels de fonctions.
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
Gestion d'un document JSON.
Definition JSONReader.h:230
void parse(Span< const Byte > bytes)
Lit le fichier au format UTF-8.
JSONValue root() const
Elément racine.
Représente une valeur JSON.
Definition JSONReader.h:43
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.
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.
IDynamicLibraryLoader * getDynamicLibraryLoader()
Service utilisé pour charger dynamiquement des bibliothèques.
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
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
Definition Misc.cc:99
std::int64_t Int64
Type entier signé sur 64 bits.
void arcaneSetHasThread(bool v)
Active ou désactive le support des threads.
Definition Misc.cc:105
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:522
Collection< Internal::IServiceFactory2 * > ServiceFactory2Collection
Collection de fabriques de service.
Collection< IModuleFactoryInfo * > ModuleFactoryInfoCollection
Collection d'informations sur les fabriques de module.
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:525
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.