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