Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
FlexLMTools.cc
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/* FlexLMTools.cc (C) 2000-2012 */
9/* */
10/* Implémentation d'une interface pour les outils FlexLM. */
11/*---------------------------------------------------------------------------*/
12
13#include "arcane/impl/FlexLMTools.h"
14
15/* L'interface à FlexNet ici employée est une surcouche à FlexNet de TAD
16 * prenant en charge par exemple le rappel périodique du contrôle de licence.
17 * Le recheck par défaut est tous les 120s (cf setCheckInterval)
18 */
19
20#define FLEXLMAPI_IS_STATIC_LIBRARY
21#define c_plusplus
22#include <FlexlmAPI.h>
23
24#include "arcane/IParallelSuperMng.h"
25#include "arcane/utils/FatalErrorException.h"
26#include "arcane/utils/TraceInfo.h"
27#include "arcane/utils/StringBuilder.h"
28#include "arcane/utils/Array.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33ARCANE_BEGIN_NAMESPACE
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38LicenseErrorException::
39LicenseErrorException(const String& where)
40: Exception("LicenseError",where)
41{
42 setCollective(true);
43}
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48LicenseErrorException::
49LicenseErrorException(const String& where,const String& message)
50: Exception("LicenseError",where,message)
51{
52 setCollective(true);
53}
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58LicenseErrorException::
59LicenseErrorException(const TraceInfo& where)
60: Exception("LicenseError",where)
61{
62 setCollective(true);
63}
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68LicenseErrorException::
69LicenseErrorException(const TraceInfo& where,const String& message)
70: Exception("LicenseError",where,message)
71{
72 setCollective(true);
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78void LicenseErrorException::
79explain(std::ostream& m) const
80{
81 m << "Licensing error occured.\n"
82 << "Excution stopped.\n";
83}
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
88void LicenseErrorException::
89write(std::ostream& o) const
90{
91 o << name() << "\n";
92#ifdef ARCANE_DEBUG
93 o << "Exception thrown in: '" << where() << "\n";
94#endif /* ARCANE_DEBUG */
95 if (!message().null())
96 o << "Message: " << message() << '\n';
97 this->explain(o);
98#ifdef ARCANE_DEBUG
99 String st = stackTrace().toString();
100 if (!st.null()){
101 o << "\nCall stack:\n";
102 o << st << '\n';
103 }
104#endif /* ARCANE_DEBUG */
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110/*---------------------------------------------------------------------------*/
111/*---------------------------------------------------------------------------*/
112
113FlexLMMng* FlexLMMng::m_instance = NULL ;
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
118FlexLMMng::
119FlexLMMng()
120 : m_parallel_super_mng(NULL)
121{
122 ;
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
130instance()
131{
132 if(m_instance==NULL)
133 m_instance = new FlexLMMng() ;
134 return m_instance ;
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140void
143{
144 if (m_parallel_super_mng != NULL)
145 throw LicenseErrorException(A_FUNCINFO,"FlexLMMng already initialized");
146
147 // Test en mode master check le droit de décentralisé le contrôle
148 m_is_master = (parallel_super_mng->commRank() == 0);
149
150 // Marque l'initialisation effective; on peut maintenant utiliser le système de licence
151 m_parallel_super_mng = parallel_super_mng;
152
154 license_tool.checkLicense(ArcaneFeatureModel::ArcaneCore,true); // do_fatal=true
155}
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
160void
162setCheckInterval(const Integer t)
163{
164 // Toutes les spécificités sont gérées dans la fonction
166}
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
170
171bool
173checkLicense(const String name, const Real version, const bool do_fatal) const
174{
175 if (m_parallel_super_mng == NULL)
176 throw LicenseErrorException(A_FUNCINFO,"FlexLMMng not initialized");
177
178 Integer test = 0;
179 if (m_is_master)
180 test = license_test((char*)name.localstr(),(char*)String::format("{0}",version).localstr());
181 m_parallel_super_mng->broadcast(IntegerArrayView(1,&test),0);
182
183 if (test != 0 && do_fatal)
184 throw LicenseErrorException(A_FUNCINFO,String::format("Checking feature {0} (v{1}) has failed\nFeature info: {2}",name,version,featureInfo(name,version)));
185 return (test == 0);
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
190
191void
193getLicense(const String name, const Real version, Integer nb_licenses)
194{
195 if (m_parallel_super_mng == NULL)
196 throw LicenseErrorException(A_FUNCINFO,"FlexLMMng not initialized");
197
198 Integer error = 0;
199 if (m_is_master)
200 {
201 m_features[name] += nb_licenses ;
202 for(Integer i=0;i<nb_licenses;++i)
203 error += license_begin_rc((char*)name.localstr(), (char*)String::format("{0}",version).localstr()) ;
204 }
205 m_parallel_super_mng->broadcast(IntegerArrayView(1,&error),0);
206 if (error != 0)
207 throw LicenseErrorException(A_FUNCINFO,String::format("Cannot checkout {0} license{1} for feature {2} (v{3})\nFeature info: {4}",nb_licenses,((nb_licenses>1)?"s":""),name,version,featureInfo(name,version)));
208}
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212
213void
215releaseLicense(const String name, Integer nb_licenses)
216{
217 if (m_parallel_super_mng == NULL)
218 throw LicenseErrorException(A_FUNCINFO,"FlexLMMng not initialized");
219
220 if (nb_licenses == 0)
221 return;
222
223 if (m_is_master)
224 {
225 FeatureMapType::iterator finder = m_features.find(name);
226
227 // Pas de code d'erreur pour compatibilité avec la précédente version
228 if (finder == m_features.end()) return;
229
230 Integer & nb_allocated_licenses = finder->second;
232 for(Integer i=0;i<nb_licenses;++i)
233 license_end_no_quit((char*)name.localstr()) ;
234
237 }
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
243void
246{
247 if (m_parallel_super_mng == NULL)
248 return;
249
250 if (m_is_master)
251 {
252 for(FeatureMapType::iterator iter = m_features.begin(); iter!=m_features.end(); ++iter)
253 {
254 const String name = (*iter).first ;
255 Integer nb_licenses = (*iter).second ;
256 for(Integer i=0; i<nb_licenses; ++i)
257 license_end_no_quit((char*) name.localstr()) ;
258 (*iter).second = 0 ;
259 }
260 }
261}
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
265
266String
268featureInfo(const String name, const Real version) const
269{
270 String info;
271 if (m_is_master)
272 {
274 if (license_test((char*)name.localstr(),(char*)String::format("{0}",version).localstr()) == 0)
275 {
276 Integer count = 0;
277 char ** users = get_user_list((char*)name.localstr());
278 while(users[count]) { info_builder += String::format("{0} ",users[count++]); }
279 if (count == 0) {
280 info_builder = String::format("no declared user");
281 } else {
282 info_builder = String::format("Used by {0} user{1} : ",count,((count>1)?"s":""),info_builder.toString());
283 }
284
285 // license_test_expiration semble buggué : segfault
286 // int expiration_code = license_test_expiration((char*)name.localstr());
287 // info_builder += String::format("\nExpiration Code {0}",expiration_code);
288
289 info = info_builder.toString();
290 }
291 else
292 {
293 info = "Unknown feature";
294 }
295 }
296
297 // remplace m_parallel_super_mng->broadcastString(info,0) qui n'existe pas dans IParallelSuperMng
298 Integer len_info[1] = { info.utf8().size() };
299 m_parallel_super_mng->broadcast(IntegerArrayView(1,len_info),0);
300 if (m_is_master) {
302 m_parallel_super_mng->broadcast(utf8_array,0);
303 } else {
305 m_parallel_super_mng->broadcast(utf8_array,0);
306 info = String::fromUtf8(utf8_array);
307 }
308
309 return info;
310}
311
312/*---------------------------------------------------------------------------*/
313/*---------------------------------------------------------------------------*/
314
315const String ArcaneFeatureModel::m_arcane_feature_name[] =
316 {
317 "ArcaneCore",
318 };
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
323ARCANE_END_NAMESPACE
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
FlexLM manager.
Definition FlexLMTools.h:72
static FlexLMMng * instance()
Accès au singleton.
FlexLMMng()
Constructeur.
void getLicense(const String name, const Real version, Integer nb_licenses=1)
Demande l'allocation de.
bool checkLicense(const String name, const Real version, bool do_fatal=true) const
Teste la présence d'une fonctionnalité statique.
void setCheckInterval(const Integer t=120)
Définit une nouvelle périodicité du contrôle des licences.
void init(IParallelSuperMng *parallel_super_mng)
Initialise le gestionnaire de licences.
void releaseAllLicenses()
Relache toutes les licences allouées.
bool m_is_master
Cet host est il le maître des contrôles ?
void releaseLicense(const String name, Integer nb_licenses=0)
Relache les licences de la fonctionnalité
String featureInfo(const String name, const Real version) const
Return info on feature.
Classe abstraite du superviseur de parallélisme.
virtual void broadcast(ByteArrayView send_buf, Integer process_id)=0
Envoie un tableau de valeurs sur tous les processus Cette opération synchronise le tableau de valeur ...
Exception de licence.
Definition FlexLMTools.h:42
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:275
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
Vecteur 1D de données avec sémantique par valeur (style STL).
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:615