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