14#include "arcane/impl/ArcaneMain.h"
16#include "arcane/utils/Iostream.h"
17#include "arcane/utils/List.h"
18#include "arcane/utils/Iterator.h"
19#include "arcane/utils/ScopedPtr.h"
20#include "arcane/utils/PlatformUtils.h"
21#include "arcane/utils/FatalErrorException.h"
22#include "arcane/utils/ParallelFatalErrorException.h"
23#include "arcane/utils/OStringStream.h"
24#include "arcane/utils/ApplicationInfo.h"
25#include "arcane/utils/ValueConvert.h"
26#include "arcane/utils/ITraceMng.h"
27#include "arcane/utils/SignalException.h"
28#include "arcane/utils/TimeoutException.h"
29#include "arcane/utils/ArithmeticException.h"
30#include "arcane/utils/StringBuilder.h"
31#include "arccore/base/internal/IDynamicLibraryLoader.h"
32#include "arcane/utils/CheckedConvert.h"
33#include "arcane/utils/CommandLineArguments.h"
34#include "arcane/utils/TestLogger.h"
37#include "arccore/base/internal/ConvertInternal.h"
39#include "arccore/common/internal/MemoryUtilsInternal.h"
40#include "arccore/common/accelerator/internal/RuntimeLoader.h"
42#include "arcane/core/IMainFactory.h"
43#include "arcane/core/IApplication.h"
44#include "arcane/core/IServiceLoader.h"
45#include "arcane/core/IParallelMng.h"
46#include "arcane/core/IParallelSuperMng.h"
47#include "arcane/core/ISession.h"
48#include "arcane/core/VariableRef.h"
49#include "arcane/core/ItemTypeMng.h"
50#include "arcane/core/ServiceUtils.h"
51#include "arcane/core/CaseOptions.h"
52#include "arcane/core/ItemGroupImpl.h"
53#include "arcane/core/DotNetRuntimeInitialisationInfo.h"
54#include "arcane/core/AcceleratorRuntimeInitialisationInfo.h"
55#include "arcane/core/ApplicationBuildInfo.h"
57#include "arcane/core/IServiceFactory.h"
58#include "arcane/core/IModuleFactory.h"
60#include "arcane/impl/MainFactory.h"
61#include "arcane/impl/InternalInfosDumper.h"
62#include "arcane/impl/internal/ArcaneMainExecInfo.h"
63#include "arcane/impl/internal/ThreadBindingMng.h"
65#include "arccore/common/accelerator/internal/RegisterRuntimeInfo.h"
67#include "arcane_internal_config.h"
71#ifndef ARCANE_OS_WIN32
82#include "arcane/impl/FlexLMTools.h"
99 bool m_has_dotnet_wrapper =
false;
118 if (!global_static_info)
120 return global_static_info;
122void _deleteStaticInfo()
124 delete global_static_info;
125 global_static_info =
nullptr;
132extern "C" void arcaneEndProgram()
141typedef void (*fSignalFunc)(int);
142void arcaneSignalHandler(
int);
154extern "C++" ARCANE_UTILS_EXPORT
void
155arcaneRedirectSignals(fSignalFunc sig_func);
157extern "C++" ARCANE_UTILS_EXPORT
void
158arcaneCallDefaultSignal(
int val);
160extern "C++" ARCANE_UTILS_EXPORT
void
161initializeStringConverter();
169extern "C++" ARCCORE_COMMON_EXPORT
void
170arccorePrintSpecificMemoryStats();
174bool ArcaneMain::m_has_garbage_collector =
false;
175bool ArcaneMain::m_is_master_io =
true;
176bool ArcaneMain::m_is_use_test_logger =
false;
188 return createArcaneMainBatch(app_info,
this);
209 , m_application_build_info(build_infos)
210 , m_dotnet_info(dotnet_info)
211 , m_accelerator_info(accelerator_info)
232 bool redirect_signals =
true;
234 (void)builtInGetValue(redirect_signals, rv);
235 if (redirect_signals) {
244setUseTestLogger(
bool v)
246 m_is_use_test_logger = v;
255 m_default_main_factory = mf;
261class ArcaneMainExecFunctor
267 : m_app_info(app_info)
268 , m_exec_main(exec_main)
277 m_app_info.args(args);
278 if (!m_exec_main->parseArgs(args))
279 m_exec_main->execute();
302 auto* x = _staticInfo();
303 if (x->m_nb_autodetect > 0)
304 return x->m_autodetect_return_value;
306 ArcaneMain::_setArcaneLibraryPath();
308 std::chrono::high_resolution_clock clock;
312 ArcaneMain::_checkAutoDetectMPI();
314 bool has_accelerator =
false;
318 auto start_time = clock.now();
320 auto end_time = clock.now();
323 x->m_init_time_accelerator = _getTime(end_time,start_time);
324 ++x->m_nb_autodetect;
326 return x->m_autodetect_return_value;
329 template<
typename TimeType>
330 Real _getTime(TimeType end_time,TimeType start_time)
332 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time);
333 Real x =
static_cast<Real>(duration.count());
356 m_clean_abort =
false;
358 ArcaneMain::redirectSignals();
362 if (m_has_build_info) {
364 m_application_build_info,
370 m_exec_main = m_main_factory->createArcaneMain(
m_app_info);
372 m_exec_main->build();
373 ArcaneMain::m_is_master_io = m_exec_main->application()->parallelSuperMng()->isMasterIO();
374 m_exec_main->initialize();
378 cerr <<
"** CATCH ARITHMETIC_EXCEPTION\n";
384 catch (
const std::exception& ex) {
394 ArcaneMain::redirectSignals();
397 m_clean_abort =
false;
404 trace->
info() <<
"Initializing license manager";
419 m_ret_val = arcanePrintArcaneException(ex, trace);
421 m_clean_abort =
true;
431void ArcaneMainExecInfo::
437 if (m_direct_exec_functor)
438 m_exec_main->setDirectExecuteFunctor(m_direct_exec_functor);
441 if (ArcaneMain::m_exec_override_functor) {
444 ArcaneMain::m_exec_override_functor->m_application = app;
446 trace->
info() <<
"Calling overriding functor";
448 m_exec_main, &m_clean_abort,
true);
457void ArcaneMainExecInfo::
465 int exe_error_code = m_exec_main->errorCode();
466 if (m_ret_val == 0 && exe_error_code != 0) {
467 m_ret_val = exe_error_code;
469 else if (m_ret_val != 0)
470 m_exec_main->setErrorCode(m_ret_val);
472 m_exec_main->finalize();
474 if (m_ret_val != 0 && !m_clean_abort)
475 m_exec_main->doAbort();
482 m_exec_main =
nullptr;
483#ifndef ARCANE_USE_MPC
500 ArcaneMainExecInfo exec_info(app_info, factory);
507 exec_info.setDirectExecFunctor(func);
509 exec_info.finalize();
511 return exec_info.returnValue();
519 bool* clean_abort,
bool is_print)
522 *clean_abort =
false;
528 functor->executeFunctor();
535 if (is_master && is_print) {
536 std::ofstream ofile(
"fatal");
537 ofile << ret_val <<
'\n';
539 trace->
error() <<
"ParallelFatalErrorException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
543 trace->
error() <<
"ParallelFatalErrorException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
548 trace->
error() << Trace::Color::red() <<
"FatalErrorException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
553 trace->
error() <<
"SignalException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
557 trace->
error() <<
"TimeoutException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
565 if (is_master && is_print) {
566 std::ofstream ofile(
"fatal");
567 ofile << ret_val <<
'\n';
569 trace->
error() <<
"ParallelFatalErrorException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
573 trace->
error() <<
"ParallelFatalErrorException caught in ArcaneMain::callFunctor: " << ex <<
'\n';
578 cerr <<
"** ARITHMETIC EXCEPTION!\n";
590 catch (
const std::exception& ex) {
603_launchMissingInitException()
605 std::cerr <<
"ERROR: ArcaneMain: missing call to ArcaneMain::arcaneInitialize().\n";
606 throw std::runtime_error(
"Missing call to ArcaneMain::arcaneInitialize()");
616 _launchMissingInitException();
622extern "C++" void arcaneInitCheckMemory();
623extern "C++" void arcaneExitCheckMemory();
632 cerr <<
"WARNING: ArcaneMain::setHasGarbageCollector has to be called before arcaneInitialize\n";
635 m_has_garbage_collector =
true;
645 cerr <<
"WARNING: ArcaneMain::setHasDotNETRuntime has to be called before arcaneInitialize\n";
657 m_exec_override_functor = functor;
666 return _staticInfo()->m_has_dotnet_wrapper;
677_setArcaneLibraryPath()
681 if (!dll_full_path.
null())
685 _staticInfo()->m_arcane_lib_path = dir_name;
699 dom::DOMImplementation::initialize();
709 initializeStringConverter();
710 arcaneInitCheckMemory();
741 arccorePrintSpecificMemoryStats();
742 arcaneExitCheckMemory();
744 dom::DOMImplementation::terminate();
762 _staticInfo()->m_service_factory_infos.add(sri);
771 _staticInfo()->m_module_factory_infos.add(mfi);
780 _staticInfo()->m_application_build_info_visitors.add(visitor);
789 return _staticInfo()->m_app_build_info._internalApplicationInfo();
798 return _staticInfo()->m_dotnet_init_info;
807 return _staticInfo()->m_accelerator_init_info;
816 return _staticInfo()->m_app_build_info;
825 return m_p->m_application_build_info;
832_applicationBuildInfo()
834 return m_p->m_application_build_info;
843 return m_p->m_dotnet_info;
852 return m_p->m_accelerator_info;
861 return _staticInfo()->m_init_time_accelerator;
874 factory = m_default_main_factory;
877 default_factory = factory;
883 default_factory =
nullptr;
887 if (ret != 0 && ret != 5)
888 cerr <<
"* Process return: " << ret <<
'\n';
901 _staticInfo()->m_direct_exec_functor = func;
909_checkTestLoggerResult()
911 if (!m_is_use_test_logger)
915 return TestLogger::compare();
924 ArcaneMainAutoDetectRuntimeHelper auto_detect_helper;
925 return auto_detect_helper.check();
934 int r = _initRuntimes();
943 if (!is_in_dotnet && dotnet_info.isUsingDotNetRuntime()) {
948 bool do_finalize =
false;
964 return _checkTestLoggerResult();
973 auto si = _staticInfo();
974 si->m_has_dotnet_wrapper =
true;
987 DotNetMainFunctor my_functor =
nullptr;
988 String os_dir(si->m_arcane_lib_path);
993 String dll_name =
"arcane_mono";
994 String symbol_name =
"arcane_mono_main2";
996 String runtime_name = dotnet_info.embeddedRuntime();
998 if (runtime_name.
null() || runtime_name ==
"mono")
1001 else if (runtime_name ==
"coreclr") {
1002 dll_name =
"arcane_dotnet_coreclr";
1003 symbol_name =
"arcane_dotnet_coreclr_main";
1006 ARCANE_FATAL(
"Unknown '.Net' runtime '{0}'. Valid values are 'mono' or 'coreclr'", runtime_name);
1008 IDynamicLibrary* dl = dll_loader->
open(os_dir, dll_name);
1010 ARCANE_FATAL(
"Can not found dynamic library '{0}' for using .Net", dll_name);
1012 bool is_found =
false;
1013 void* functor_addr = dl->getSymbolAddress(symbol_name, &is_found);
1015 ARCANE_FATAL(
"Can not find symbol '{0}' in library '{1}'", symbol_name, dll_name);
1017 my_functor =
reinterpret_cast<DotNetMainFunctor
>(functor_addr);
1019 catch (
const Exception& ex) {
1020 return ExceptionUtils::print(ex,
nullptr);
1022 catch (
const std::exception& ex) {
1023 return ExceptionUtils::print(ex,
nullptr);
1026 return ExceptionUtils::print(
nullptr);
1030 const CommandLineArguments& cmd_args = app_info.commandLineArguments();
1032 String new_name = os_dir +
"/Arcane.Main.dll";
1033 return (*my_functor)(cmd_args, new_name);
1042_checkAutoDetectMPI()
1044 auto si = _staticInfo();
1049 typedef void (*ArcaneAutoDetectMPIFunctor)();
1053 String os_dir(si->m_arcane_lib_path);
1054 String dll_name =
"arcane_mpi";
1055 String symbol_name =
"arcaneAutoDetectMessagePassingServiceMPI";
1056 IDynamicLibrary* dl = dll_loader->open(os_dir, dll_name);
1060 bool is_found =
false;
1061 void* functor_addr = dl->getSymbolAddress(symbol_name, &is_found);
1065 auto my_functor =
reinterpret_cast<ArcaneAutoDetectMPIFunctor
>(functor_addr);
1085 has_accelerator =
false;
1086 String default_runtime_name;
1087#if defined(ARCANE_ACCELERATOR_RUNTIME)
1088 default_runtime_name = ARCANE_ACCELERATOR_RUNTIME;
1090 auto si = _staticInfo();
1092 if (!init_info.isUsingAcceleratorRuntime())
1103IMainFactory* ArcaneMain::m_default_main_factory =
nullptr;
1111: m_p(new Impl(app_info))
1112, m_main_factory(factory)
1120ArcaneMain(
const ApplicationInfo& app_info, IMainFactory* factory,
1121 const ApplicationBuildInfo& app_build_info,
1122 const DotNetRuntimeInitialisationInfo& dotnet_info,
1123 const AcceleratorRuntimeInitialisationInfo& accelerator_info)
1124: m_p(new Impl(app_info, app_build_info, dotnet_info, accelerator_info))
1125, m_main_factory(factory)
1138 m_p->m_thread_binding_mng.finalize();
1139 delete m_application;
1152 _parseApplicationBuildInfoArgs();
1153 m_application = m_main_factory->createApplication(
this);
1154 m_p->m_thread_binding_mng.initialize(m_application->traceMng(),
1155 m_p->m_application_build_info.threadBindingStrategy());
1164 return m_p->m_app_info;
1171_parseApplicationBuildInfoArgs()
1177 auto& x = _staticInfo()->m_application_build_info_visitors;
1183 abi.setDefaultServices();
1192 m_application->initialize();
1195 service_loader->loadApplicationServices(m_application);
1204 return _staticInfo()->m_service_factory_infos;
1213 return _staticInfo()->m_module_factory_infos;
1240 m_error_code = errcode;
1244 if (ArcaneMain::m_is_master_io || errcode == 4) {
1245 String errname =
"fatal_" + String::fromNumber(errcode);
1246 std::ofstream ofile(errname.
localstr());
1259 bool arcane_internal =
false;
1261 bool arcane_all_internal =
false;
1263 bool arcane_database =
false;
1265 bool arcane_help =
false;
1267 String us_arcane_opt(
"-arcane_opt");
1269 String us_arcane_internal(
"arcane_internal");
1270 String us_arcane_all_internal(
"arcane_all_internal");
1271 String us_arcane_database(
"arcane_database");
1275 if (args[i].startsWith(
"-A")) {
1278 if (args[i] != us_arcane_opt) {
1279 unknown_args.add(args[i]);
1282 bool is_valid_opt =
false;
1287 if (str == us_arcane_internal) {
1288 arcane_internal =
true;
1289 is_valid_opt =
true;
1291 if (str == us_arcane_all_internal) {
1292 arcane_all_internal =
true;
1293 is_valid_opt =
true;
1295 if (str == us_arcane_database) {
1296 arcane_database =
true;
1297 is_valid_opt =
true;
1299 if (str == us_help) {
1301 is_valid_opt =
true;
1303 if (!is_valid_opt) {
1306 unknown_args.add(us_arcane_opt);
1308 unknown_args.add(str);
1313 bool do_stop =
false;
1314 if (arcane_database) {
1319 if (arcane_internal) {
1321 dumper.dumpInternalInfos();
1324 if (arcane_all_internal) {
1348 typedef std::multimap<String, IServiceInfo*>
ServiceList;
1355 std::set<IServiceInfo*> done_set;
1358 if (done_set.find(si) != done_set.end()) {
1361 done_set.insert(si);
1363 max_name_size =
math::max(max_name_size, CheckedConvert::toInteger(name.length()));
1364 service_list.insert(std::make_pair(name, si));
1368 UniqueArray<String> module_names;
1369 for (EnumeratorT<IModuleFactoryInfo*> e =
application()->moduleFactoryInfos(); ++e;) {
1370 IModuleFactoryInfo* mfi = (*e);
1371 const String& name = mfi->moduleName();
1372 max_name_size =
math::max(max_name_size, CheckedConvert::toInteger(name.length()));
1373 module_names.add(name);
1377 trace->
info() <<
" ";
1378 trace->info() << std::setw(max_name_size) <<
"Module List";
1379 trace->info() << std::setw(max_name_size) <<
"-------------"
1381 for (
int i = 0, n = module_names.size(); i < n; ++i) {
1382 trace->info() << std::setw(max_name_size) << module_names[i];
1385 trace->info() <<
" ";
1386 trace->info() << std::setw(max_name_size) <<
"Service List";
1387 trace->info() << std::setw(max_name_size) <<
"--------------"
1389 for (ServiceList::const_iterator i = service_list.begin(); i != service_list.end(); ++i) {
1390 IServiceInfo* si = i->second;
1392 oss() << std::setw(max_name_size) << i->first;
1394 if (!interfaces.empty())
1395 oss() <<
" Implements : ";
1396 for (EnumeratorT<String> e(interfaces.enumerator()); ++e;) {
1397 oss() << e.current() <<
" ";
1399 trace->info() << oss.str();
1402 const Integer option_size = 20;
1403 trace->info() <<
" ";
1404 trace->info() << std::setw(max_name_size) <<
"Usage";
1405 trace->info() << std::setw(max_name_size) <<
"-------"
1408 trace->info() <<
"Where OPTION is";
1409 trace->info() << std::setw(option_size) <<
"help"
1410 <<
" : this help page and abort";
1411 trace->info() << std::setw(option_size) <<
"arcane_internal"
1412 <<
" : save into a file internal Arcane informations and abort execution";
1413 trace->info() << std::setw(option_size) <<
"arcane_all_internal"
1414 <<
" : save into a file timeloop informations and abort execution";
1415 trace->info() << std::setw(option_size) <<
"arcane_database"
1416 <<
" : save internal database infos in file 'arcane_database.json'";
1417 trace->info() << std::setw(option_size) <<
"init_only"
1418 <<
" : only run initialization step";
1419 trace->info() << std::setw(option_size) <<
"continue"
1420 <<
" : continue an interrupted run";
1421 trace->info() << std::setw(option_size) <<
"max_iteration"
1422 <<
" : define maximum iteration number";
1423 trace->info() << std::setw(option_size) <<
"casename"
1424 <<
" : define case name";
1437 const char* signal_str =
"Unknown";
1438 bool is_alarm =
false;
1439 int written_signal_number = val;
1443 signal_str =
"Segmentation Fault";
1446 signal_str =
"Floating exception";
1450 signal_str =
"Bus Error";
1455 signal_str =
"System signal";
1460 signal_str =
"Broken pipe";
1465 signal_str =
"Sigalarm";
1471 signal_str =
"Sigalarm(VirtualTime)";
1472 written_signal_number = SIGALRM;
1478 cerr <<
"Signal Caught !!! number=" << val <<
" name=" << signal_str <<
".\n";
1483#ifndef ARCANE_OS_WIN32
1487 bool create_file = ArcaneMain::isMasterIO() || (!is_alarm);
1491 mode_t mode = S_IRUSR | S_IWUSR;
1493 sprintf(path,
"signal_%d", written_signal_number);
1495 int fd = ::open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);
1505 Arcane::arcaneCallDefaultSignal(val);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires pour la gestion des exceptions.
ARCCORE_COMMON_EXPORT Int32 print(ITraceMng *tm, bool is_no_continue=true)
Imprime un message pour une exception inconnue.
Fonctions de gestion mémoire et des allocateurs.
Informations pour l'initialisation des accélérateurs.
static int loadRuntime(AcceleratorRuntimeInitialisationInfo &init_info, const String &default_runtime_name, const String &library_path, bool &has_accelerator)
Détecte et charge la bibliothèque de gestion du runtime des accélérateurs.
Informations pour construire une instance de IApplication.
void parseArguments(const CommandLineArguments &args)
Analyse les arguments de args.
Informations sur une application.
const CommandLineArguments & commandLineArguments() const
Arguments de la ligne de commande.
IArcaneMain * createArcaneMain(const ApplicationInfo &app_info) override
Crée une instance de IArcaneMain.
Classe pour gérer les appels aux mécanismes d'auto-détection des runtimes (MPI,Accélérateurs).
void executeFunctor() override
Exécute la méthode associé
int initialize()
Création de l'instance 'IArcaneMain'.
const ApplicationInfo & m_app_info
ATTENTION: référence.
std::atomic< Int32 > m_nb_autodetect
Nombre de fois qu'on a lancé l'auto-détection pour MPI et les accélérateurs.
Real m_init_time_accelerator
Temps passé (en seconde) dans l'initialisation pour les accélérateurs.
Int32 m_autodetect_return_value
Code retour pour l'auto-détection.
Classe de gestion de l'exécution.
static ApplicationBuildInfo & defaultApplicationBuildInfo()
Informations pour l'initialisation des accélerateurs.
static AcceleratorRuntimeInitialisationInfo & defaultAcceleratorRuntimeInitialisationInfo()
Informations pour l'initialisation des accélerateurs.
static std::atomic< Int32 > m_nb_arcane_init
Nombre de fois que arcaneInitialize() a été appelé
static DotNetRuntimeInitialisationInfo & defaultDotNetRuntimeInitialisationInfo()
Informations pour l'initialisation du runtime '.Net'.
static void arcaneInitialize()
Initialise Arcane.
static void addApplicationBuildInfoVisitor(IApplicationBuildInfoVisitor *visitor)
Ajoute un visiteur pour remplir ApplicationBuildInfo.
const DotNetRuntimeInitialisationInfo & dotnetRuntimeInitialisationInfo() const override
Informations d'initialisation du runtime '.Net'.
static int _checkAutoDetectAccelerator(bool &has_accelerator)
Détecte et charge la gestion du runtime des accélérateurs.
static void arcaneFinalize()
Termine l'utilisation Arcane.
static int _arcaneMain(const ApplicationInfo &, IMainFactory *)
Point d'entrée de l'exécutable.
static Real initializationTimeForAccelerator()
Retourne le temps (en seconde) pour l'initialisation des runtimes accélérateurs pour ce processus.
const ApplicationInfo & applicationInfo() const override
Informations sur l'éxécutable.
ServiceFactoryInfoCollection registeredServiceFactoryInfos() override
Liste des fabriques de service enregistrées.
const AcceleratorRuntimeInitialisationInfo & acceleratorRuntimeInitialisationInfo() const override
Informations d'initialisation du runtime pour les accélérateurs.
static int callFunctorWithCatchedException(IFunctor *functor, IArcaneMain *amain, bool *clean_abort, bool is_print=true)
Appelle le fonctor functor en récupérant les éventuelles exceptions.
ModuleFactoryInfoCollection registeredModuleFactoryInfos() override
Liste des fabriques de module enregistrées.
void setErrorCode(int errcode) override
Positionne le code de retour.
static void setHasDotNETRuntime()
Indique que l'on tourne dans le runtime .NET.
IApplication * application() const override
Application.
static void setHasGarbageCollector()
Indique que certains objets sont gérés par un ramasse-miette.
static std::atomic< Int32 > m_is_init_done
1 si init terminé, 0 sinon
static int run()
Point d'entrée de l'exécutable dans Arcane.
static void addServiceFactoryInfo(IServiceFactoryInfo *factory)
Ajoute une fabrique de service.
void build() override
Construit les membres la classe. L'instance n'est pas utilisable tant que cette méthode n'a pas été a...
static ApplicationInfo & defaultApplicationInfo()
Infos par défaut de l'application.
static void setExecuteOverrideFunctor(ArcaneMainExecutionOverrideFunctor *functor)
static bool hasDotNetWrapper()
Indique si on exécute une assembly '.Net' depuis un main en C++.
const ApplicationBuildInfo & applicationBuildInfo() const override
Informations pour construire l'instance IApplication.
int execute() override
Lance l'exécution. Cette méthode ne retourne que lorsqu'on quitte le programme.
void doAbort() override
Effectue un abort.
static void setDefaultMainFactory(IMainFactory *mf)
Positionne la fabrique par défaut.
void initialize() override
Initialise l'instance. L'instance n'est pas utilisable tant que cette méthode n'a pas été appelée.
bool parseArgs(StringList args) override
Analyse les arguments.
static void addModuleFactoryInfo(IModuleFactoryInfo *factory)
Ajoute une fabrique de module.
Exception lorsqu'une erreur arithmétique survient.
void clear()
Supprime tous les éléments de la collection.
Integer count() const
Nombre d'éléments de la collection.
EnumeratorT< Internal::IServiceFactory2 * > Enumerator
Arguments de la ligne de commande.
static void setUseFromChars(bool v)
Indique si on utilise 'std::from_chars' pour convertir les chaînes de caractères en un type numérique...
Classe template pour convertir un type.
Informations pour l'initialisation du runtime '.Net'.
Classe de base d'une exception.
bool isCollective() const
Vrai s'il s'agit d'une erreur collective (concerne tous les processeurs)
Exception lorsqu'une erreur fatale est survenue.
static FlexLMMng * instance()
Accès au singleton.
void init(IParallelSuperMng *parallel_super_mng)
Initialise le gestionnaire de licences.
void releaseAllLicenses()
Relache toutes les licences allouées.
Interface de l'application.
virtual String applicationName() const =0
Nom de l'application.
virtual IParallelSuperMng * parallelSuperMng()=0
Gestionnaire superviseur du parallélisme.
Interface de la classe de gestion du code.
virtual IApplication * application() const =0
Application.
static IArcaneMain * arcaneMain()
static void setArcaneMain(IArcaneMain *arcane_main)
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'un chargeur de cas.
Interface d'un fonctor pour exécuter du code directement après la création d'un sous-domaine sans pas...
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.
Manufacture des classes d'Arcane.
Informations sur la fabrique d'un module.
Classe abstraite du superviseur de parallélisme.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Informations sur la fabrique d'un service.
Interface des informations d'un service ou d'un module.
virtual String localName() const =0
Partie locale du nom du service.
Interface du gestionnaire de traces.
virtual TraceMessage error()=0
Flot pour un message d'erreur.
virtual TraceMessage info()=0
Flot pour un message d'information.
Sorties des informations internes de Arcane.
void dumpInternalAllInfos()
void dumpArcaneDatabase()
Sauve les informations internes de Arcane dans un fichier json.
static void _buildSharedNull()
static void _destroySharedNull()
static void _destroySingleton()
Détruit le singleton.
static ItemTypeMng * _singleton()
Instance singleton du type.
Implémentation d'une collection d'éléments sous forme de vecteur.
ListEnumeratorT< String > Enumerator
Exception lorsqu'une erreur fatale 'parallèle' est générée.
Encapsulation d'un pointeur qui se détruit automatiquement.
Exception lorsqu'un signal survient.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Exception lorsqu'un timeout survient.
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
Collection< IServiceFactoryInfo * > ServiceFactoryInfoCollection
Collection d'informations sur les fabriques de service.
Collection< String > StringCollection
Collection de chaînes de caractères.
void arcaneSignalHandler(int val)
Fonction appelee lorsque le programme est interrompu par le signal 'val'.
List< String > StringList
Tableau de chaînes de caractères unicode.
Collection< IModuleFactoryInfo * > ModuleFactoryInfoCollection
Collection d'informations sur les fabriques de module.
List< IService * > ServiceList
Tableau de services.
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.