Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
EntryPoint.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* EntryPoint.h (C) 2000-2022 */
9/* */
10/* Point d'entrée d'un module. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ENTRYPOINT_H
13#define ARCANE_ENTRYPOINT_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18#include "arcane/utils/FunctorWithAddress.h"
19#include "arcane/IEntryPoint.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26class Timer;
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \brief Informations pour construire un point d'entrée.
32 *
33 * Normalement cette classe n'est pas utilisée directement. Pour
34 * construire un point d'entrée, il faut utiliser addEntryPoint().
35 */
36class ARCANE_CORE_EXPORT EntryPointBuildInfo
37{
38 public:
39 /*!
40 * \brief Informations de construction d'un point d'entrée.
41 *
42 * \param module module associé à la fonction
43 * \param where endroit de la boucle en temps où est appelé le point d'entrée
44 * \param property propriétés du point d'entrée (voir IEntryPoint)
45 * \param name nom du point d'entrée
46 * \param caller encapsulation de la méthode à appeler.
47 * \param is_destroy_caller indique si le point d'entrée doit détruire
48 * le fonctor \a caller.
49 *
50 * En général, \a is_destroy_caller doit valoir \a true sinon la
51 * mémoire ne sera pas libéré. A noter que le wrapping C# gère le fonctor
52 * via un garbage collector et donc dans ce cas \a is_destroy_caller doit
53 * valoir \a false.
54 */
55 EntryPointBuildInfo(IModule* module,const String& name,
56 IFunctor* caller,const String& where,int property,
57 bool is_destroy_caller)
58 : m_module(module), m_name(name), m_caller(caller), m_where(where),
59 m_property(property), m_is_destroy_caller(is_destroy_caller)
60 {
61 }
62
63 public:
64
65 IModule* module() const { return m_module; }
66 const String& name() const { return m_name; }
67 IFunctor* caller() const { return m_caller; }
68 const String& where () const { return m_where; }
69 int property() const { return m_property; }
70 bool isDestroyCaller() const { return m_is_destroy_caller; }
71
72 private:
73
74 IModule* m_module;
75 String m_name;
76 IFunctor* m_caller;
77 String m_where;
78 int m_property;
79 bool m_is_destroy_caller;
80};
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84/*!
85 * \internal
86 * \brief Point d'entrée d'un module.
87 */
88class ARCANE_CORE_EXPORT EntryPoint
89: public IEntryPoint
90{
91 public:
92
93 //! Libère les ressources
94 ~EntryPoint() override;
95
96 public:
97
98 /*!
99 * \brief Construit et retourne un point d'entrée.
100 *
101 * Le point d'entrée est construit avec les informations données par \bi.
102 * Il est automatiquement ajouté au gestionnaire IEntryPointMng et ne doit
103 * pas être détruit explicitement.
104 */
105 static EntryPoint* create(const EntryPointBuildInfo& bi);
106
107 public:
108
109 String name() const override { return m_name; }
110 String fullName() const override { return m_full_name; }
111 ISubDomain* subDomain() const override { return m_sub_domain; }
112 IModule* module() const override { return m_module; }
113 void executeEntryPoint() override;
114 Real totalCPUTime() const override;
115 Real lastCPUTime() const override;
116 Real totalElapsedTime() const override;
117 Real lastElapsedTime() const override;
118 Real totalTime(Timer::eTimerType type) const override;
119 Real lastTime(Timer::eTimerType type) const override;
120 Integer nbCall() const override { return m_nb_call; }
121 String where() const override { return m_where; }
122 int property() const override { return m_property; }
123
124 private:
125
126 ISubDomain* m_sub_domain = nullptr; //!< Gestionnaire de sous-domaine
127 IFunctor* m_caller = nullptr; //!< Point d'appel
128 Timer* m_elapsed_timer = nullptr; //!< Timer horloge du point d'entrée
129 String m_name; //!< Nom du point d'entrée
130 String m_full_name; //!< Nom du point d'entrée
131 IModule* m_module = nullptr; //!< Module associé
132 String m_where; //!< Endroit de l'appel
133 int m_property = 0; //!< Propriétés du point d'entrée
134 Integer m_nb_call = 0; //!< Nombre de fois que le point d'entrée a été exécuté
135 bool m_is_destroy_caller = false; //!< Indique si on doit détruire le functor d'appel.
136
137 private:
138
139 explicit EntryPoint(const EntryPointBuildInfo& build_info);
140
141 public:
142
143 EntryPoint(const EntryPoint&) =delete;
144 void operator=(const EntryPoint&) =delete;
145
146 private:
147
148 void _getAddressForHyoda(void* =nullptr);
149};
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153/*!
154 * \brief Routine template permettant de référencer un point d'entrée
155 * dans un module.
156 *
157 * Le paramètre \a ModuleType doit être un type qui dérive de IModule.
158 *
159 * \param module Module associé à la fonction
160 * \param func méthode membre appelée par la fonction
161 * \param where endroit ou est appelé le point d'entrée
162 * \param property propriétés du point d'entrée (voir IEntryPoint)
163 * \param name nom de la fonction pour Arcane
164 */
165template<typename ModuleType> inline void
166addEntryPoint(ModuleType* module,const char* name,void (ModuleType::*func)(),
167 const String& where = IEntryPoint::WComputeLoop,
168 int property = IEntryPoint::PNone)
169{
170 IFunctorWithAddress* caller = new FunctorWithAddressT<ModuleType>(module,func);
171 EntryPoint::create(EntryPointBuildInfo(module,name,caller,where,property,true));
172}
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176/*!
177 * \brief Routine template permettant de référencer un point d'entrée
178 * dans un module.
179 *
180 * Le paramètre \a ModuleType doit être un type qui dérive de IModule.
181 *
182 * \param module Module associé à la fonction
183 * \param func méthode membre appelée par la fonction
184 * \param where endroit ou est appelé le point d'entrée
185 * \param property propriétés du point d'entrée (voir IEntryPoint)
186 * \param name nom de la fonction pour Arcane
187 */
188template<typename ModuleType> inline void
189addEntryPoint(ModuleType* module,const String& name,void (ModuleType::*func)(),
190 const String& where = IEntryPoint::WComputeLoop,
191 int property = IEntryPoint::PNone)
192{
193 IFunctorWithAddress* caller = new FunctorWithAddressT<ModuleType>(module,func);
194 EntryPoint::create(EntryPointBuildInfo(module,name,caller,where,property,true));
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200} // End namespace Arcane
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205#endif
206
Informations pour construire un point d'entrée.
Definition EntryPoint.h:37
EntryPointBuildInfo(IModule *module, const String &name, IFunctor *caller, const String &where, int property, bool is_destroy_caller)
Informations de construction d'un point d'entrée.
Definition EntryPoint.h:55
String where() const override
Retourne l'endroit ou est appelé le point d'entrée.
Definition EntryPoint.h:121
IModule * module() const override
Retourne le module associé au point d'entrée.
Definition EntryPoint.h:112
static EntryPoint * create(const EntryPointBuildInfo &bi)
Construit et retourne un point d'entrée.
Definition EntryPoint.cc:78
String name() const override
Retourne le nom du point d'entrée.
Definition EntryPoint.h:109
String fullName() const override
Nom complet (avec le module) du point d'entrée. Ce nom est unique.
Definition EntryPoint.h:110
Integer nbCall() const override
Retourne le nombre de fois que le point d'entrée a été exécuté
Definition EntryPoint.h:120
int property() const override
Retourne les propriétés du point d'entrée.
Definition EntryPoint.h:122
ISubDomain * subDomain() const override
Retourne le gestionnaire principal.
Definition EntryPoint.h:111
Interface d'un point d'entrée d'un module.
Definition IEntryPoint.h:34
Interface d'un fonctor.
Interface d'un module.
Definition IModule.h:39
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Gestion d'un timer.
Definition Timer.h:62
eTimerType
Type du timer.
Definition Timer.h:67
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void addEntryPoint(ModuleType *module, const char *name, void(ModuleType::*func)(), const String &where=IEntryPoint::WComputeLoop, int property=IEntryPoint::PNone)
Routine template permettant de référencer un point d'entrée dans un module.
Definition EntryPoint.h:166