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()
1046 if (mp_service==
"Sequential")
1049 auto si = _staticInfo();
1054 typedef void (*ArcaneAutoDetectMPIFunctor)();
1058 String os_dir(si->m_arcane_lib_path);
1059 String dll_name =
"arcane_mpi";
1060 String symbol_name =
"arcaneAutoDetectMessagePassingServiceMPI";
1061 IDynamicLibrary* dl = dll_loader->open(os_dir, dll_name);
1065 bool is_found =
false;
1066 void* functor_addr = dl->getSymbolAddress(symbol_name, &is_found);
1070 auto my_functor =
reinterpret_cast<ArcaneAutoDetectMPIFunctor
>(functor_addr);
1090 has_accelerator =
false;
1091 String default_runtime_name;
1092#if defined(ARCANE_ACCELERATOR_RUNTIME)
1093 default_runtime_name = ARCANE_ACCELERATOR_RUNTIME;
1095 auto si = _staticInfo();
1097 if (!init_info.isUsingAcceleratorRuntime())
1108IMainFactory* ArcaneMain::m_default_main_factory =
nullptr;
1116: m_p(new Impl(app_info))
1117, m_main_factory(factory)
1125ArcaneMain(
const ApplicationInfo& app_info, IMainFactory* factory,
1126 const ApplicationBuildInfo& app_build_info,
1127 const DotNetRuntimeInitialisationInfo& dotnet_info,
1128 const AcceleratorRuntimeInitialisationInfo& accelerator_info)
1129: m_p(new Impl(app_info, app_build_info, dotnet_info, accelerator_info))
1130, m_main_factory(factory)
1143 m_p->m_thread_binding_mng.finalize();
1144 delete m_application;
1157 _parseApplicationBuildInfoArgs();
1158 m_application = m_main_factory->createApplication(
this);
1159 m_p->m_thread_binding_mng.initialize(m_application->traceMng(),
1160 m_p->m_application_build_info.threadBindingStrategy());
1169 return m_p->m_app_info;
1176_parseApplicationBuildInfoArgs()
1182 auto& x = _staticInfo()->m_application_build_info_visitors;
1188 abi.setDefaultServices();
1197 m_application->initialize();
1200 service_loader->loadApplicationServices(m_application);
1209 return _staticInfo()->m_service_factory_infos;
1218 return _staticInfo()->m_module_factory_infos;
1245 m_error_code = errcode;
1249 if (ArcaneMain::m_is_master_io || errcode == 4) {
1250 String errname =
"fatal_" + String::fromNumber(errcode);
1251 std::ofstream ofile(errname.
localstr());
1264 bool arcane_internal =
false;
1266 bool arcane_all_internal =
false;
1268 bool arcane_database =
false;
1270 bool arcane_help =
false;
1272 String us_arcane_opt(
"-arcane_opt");
1274 String us_arcane_internal(
"arcane_internal");
1275 String us_arcane_all_internal(
"arcane_all_internal");
1276 String us_arcane_database(
"arcane_database");
1280 if (args[i].startsWith(
"-A")) {
1283 if (args[i] != us_arcane_opt) {
1284 unknown_args.add(args[i]);
1287 bool is_valid_opt =
false;
1292 if (str == us_arcane_internal) {
1293 arcane_internal =
true;
1294 is_valid_opt =
true;
1296 if (str == us_arcane_all_internal) {
1297 arcane_all_internal =
true;
1298 is_valid_opt =
true;
1300 if (str == us_arcane_database) {
1301 arcane_database =
true;
1302 is_valid_opt =
true;
1304 if (str == us_help) {
1306 is_valid_opt =
true;
1308 if (!is_valid_opt) {
1311 unknown_args.add(us_arcane_opt);
1313 unknown_args.add(str);
1318 bool do_stop =
false;
1319 if (arcane_database) {
1324 if (arcane_internal) {
1326 dumper.dumpInternalInfos();
1329 if (arcane_all_internal) {
1353 typedef std::multimap<String, IServiceInfo*>
ServiceList;
1360 std::set<IServiceInfo*> done_set;
1363 if (done_set.find(si) != done_set.end()) {
1366 done_set.insert(si);
1368 max_name_size =
math::max(max_name_size, CheckedConvert::toInteger(name.length()));
1369 service_list.insert(std::make_pair(name, si));
1373 UniqueArray<String> module_names;
1374 for (EnumeratorT<IModuleFactoryInfo*> e =
application()->moduleFactoryInfos(); ++e;) {
1375 IModuleFactoryInfo* mfi = (*e);
1376 const String& name = mfi->moduleName();
1377 max_name_size =
math::max(max_name_size, CheckedConvert::toInteger(name.length()));
1378 module_names.add(name);
1382 trace->
info() <<
" ";
1383 trace->info() << std::setw(max_name_size) <<
"Module List";
1384 trace->info() << std::setw(max_name_size) <<
"-------------"
1386 for (
int i = 0, n = module_names.size(); i < n; ++i) {
1387 trace->info() << std::setw(max_name_size) << module_names[i];
1390 trace->info() <<
" ";
1391 trace->info() << std::setw(max_name_size) <<
"Service List";
1392 trace->info() << std::setw(max_name_size) <<
"--------------"
1394 for (ServiceList::const_iterator i = service_list.begin(); i != service_list.end(); ++i) {
1395 IServiceInfo* si = i->second;
1397 oss() << std::setw(max_name_size) << i->first;
1399 if (!interfaces.empty())
1400 oss() <<
" Implements : ";
1401 for (EnumeratorT<String> e(interfaces.enumerator()); ++e;) {
1402 oss() << e.current() <<
" ";
1404 trace->info() << oss.str();
1407 const Integer option_size = 20;
1408 trace->info() <<
" ";
1409 trace->info() << std::setw(max_name_size) <<
"Usage";
1410 trace->info() << std::setw(max_name_size) <<
"-------"
1413 trace->info() <<
"Where OPTION is";
1414 trace->info() << std::setw(option_size) <<
"help"
1415 <<
" : this help page and abort";
1416 trace->info() << std::setw(option_size) <<
"arcane_internal"
1417 <<
" : save into a file internal Arcane informations and abort execution";
1418 trace->info() << std::setw(option_size) <<
"arcane_all_internal"
1419 <<
" : save into a file timeloop informations and abort execution";
1420 trace->info() << std::setw(option_size) <<
"arcane_database"
1421 <<
" : save internal database infos in file 'arcane_database.json'";
1422 trace->info() << std::setw(option_size) <<
"init_only"
1423 <<
" : only run initialization step";
1424 trace->info() << std::setw(option_size) <<
"continue"
1425 <<
" : continue an interrupted run";
1426 trace->info() << std::setw(option_size) <<
"max_iteration"
1427 <<
" : define maximum iteration number";
1428 trace->info() << std::setw(option_size) <<
"casename"
1429 <<
" : define case name";
1442 const char* signal_str =
"Unknown";
1443 bool is_alarm =
false;
1444 int written_signal_number = val;
1448 signal_str =
"Segmentation Fault";
1451 signal_str =
"Floating exception";
1455 signal_str =
"Bus Error";
1460 signal_str =
"System signal";
1465 signal_str =
"Broken pipe";
1470 signal_str =
"Sigalarm";
1476 signal_str =
"Sigalarm(VirtualTime)";
1477 written_signal_number = SIGALRM;
1483 cerr <<
"Signal Caught !!! number=" << val <<
" name=" << signal_str <<
".\n";
1488#ifndef ARCANE_OS_WIN32
1492 bool create_file = ArcaneMain::isMasterIO() || (!is_alarm);
1496 mode_t mode = S_IRUSR | S_IWUSR;
1498 sprintf(path,
"signal_%d", written_signal_number);
1500 int fd = ::open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);
1510 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.
String getParameter(const String ¶m_name) const
Récupère le paramètre de nom param_name.
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.