Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ArccoreGlobal.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ArccoreGlobal.cc (C) 2000-2024 */
9/* */
10/* Déclarations générales de Arccore. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/base/ArccoreGlobal.h"
15#include "arccore/base/TraceInfo.h"
16#include "arccore/base/PlatformUtils.h"
17#include "arccore/base/String.h"
18#include "arccore/base/IndexOutOfRangeException.h"
19#include "arccore/base/FatalErrorException.h"
20#include "arccore/base/Ref.h"
21
22// Nécessaire pour les exports de symboles
24#include "arccore/base/Float16.h"
25#include "arccore/base/BFloat16.h"
26
27#include <iostream>
28#include <cstring>
29#include <sstream>
30#include <cstdarg>
31
32#ifndef ARCCORE_OS_WIN32
33#include <unistd.h>
34#endif
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38/*!
39 * \namespace Arccore
40 *
41 * \brief Espace de nom de %Arccore
42 *
43 * Toutes les classes et types utilisés dans \b Arccore sont dans ce
44 * namespace.
45 */
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49namespace Arccore
50{
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53
54namespace
55{
56#ifdef ARCCORE_CHECK
57static bool global_arccore_is_check = true;
58#else
59static bool global_arccore_is_check = false;
60#endif
61}
62
63extern "C++" ARCCORE_BASE_EXPORT
65{
66 return global_arccore_is_check;
67}
68
69extern "C++" ARCCORE_BASE_EXPORT
70void arccoreSetCheck(bool v)
71{
72 global_arccore_is_check = v;
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78namespace
79{
80bool global_pause_on_error = false;
81}
82
83extern "C++" ARCCORE_BASE_EXPORT void
85{
86 global_pause_on_error = v;
87}
88
89extern "C++" ARCCORE_BASE_EXPORT void
90arccoreDebugPause(const char* msg)
91{
92 if (global_pause_on_error){
93 std::ostringstream ostr;
94 String host_name(Platform::getHostName());
95 ostr << "** FATAL: Debug mode activated. Execution paused\n"
96 << "** FATAL: message:" << msg << "\n"
97 << "** FATAL: To find the location of the error, start\n"
98 << "** FATAL: start the debugger using the process number\n"
99 << "** FATAL: (pid=" << Platform::getProcessId() << ",host=" << host_name << ").\n";
100 std::cerr << ostr.str();
101#ifndef ARCCORE_OS_WIN32
102 ::pause();
103#endif
104 }
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110extern "C++" ARCCORE_BASE_EXPORT void
111arccoreRangeError(Int64 i,Int64 min_value_inclusive,Int64 max_value_exclusive)
112{
113 arccoreDebugPause("arccoreRangeError");
114 throw IndexOutOfRangeException(A_FUNCINFO,String(),i,min_value_inclusive,max_value_exclusive);
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
120extern "C++" ARCCORE_BASE_EXPORT void
121arccoreRangeError(Int32 i,Int32 max_size)
122{
123 arccoreDebugPause("arccoreRangeError");
124 throw IndexOutOfRangeException(A_FUNCINFO,String(),i,0,max_size);
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
130extern "C++" ARCCORE_BASE_EXPORT void
132{
133 arccoreDebugPause("arccoreRangeError");
134 throw IndexOutOfRangeException(A_FUNCINFO,String(),i,0,max_size);
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
140extern "C++" ARCCORE_BASE_EXPORT void
142{
143 std::cerr << "** FATAL: null pointer.\n";
144 std::cerr << "** FATAL: Trying to dereference a null pointer.\n";
145 arccoreDebugPause("arcaneNullPointerPtr");
146 throw FatalErrorException(A_FUNCINFO,"null pointer");
147}
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
152extern "C++" ARCCORE_BASE_EXPORT void
153arccoreThrowNullPointerError(const char* ptr_name,const char* text)
154{
155 throw FatalErrorException(A_FUNCINFO,text ? text : ptr_name);
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161// Cette fonction peut être appelée souvent et certaines fois
162// dans des conditions d'exceptions. Pour cette raison, il ne
163// faut pas qu'elle fasse d'allocations.
164namespace
165{
166void _printFuncName(std::ostream& o,const char* name)
167{
168 const char* par_pos = std::strchr(name,'(');
169 if (!par_pos){
170 o << name;
171 return;
172 }
173
174 // Recherche quelque chose du type namespace::class_name::func_name
175 // et essaye de ne conserver que class_name::func_name
176 ptrdiff_t len = par_pos - name;
177 ptrdiff_t last_scope = 0;
178 ptrdiff_t last_scope2 = 0;
179 for( ptrdiff_t i=0; i<len; ++i ){
180 if (name[i]==':' && name[i+1]==':'){
181 last_scope2 = last_scope;
182 last_scope = i;
183 }
184 }
185 if (last_scope2!=0)
186 last_scope2+=2;
187 ptrdiff_t true_pos = last_scope2;
188 ptrdiff_t true_len = len - true_pos;
189 o.write(&name[true_pos],true_len);
190 o << "()";
191}
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197extern "C++" ARCCORE_BASE_EXPORT std::ostream&
198operator<<(std::ostream& o,const TraceInfo& t)
199{
200 if (t.printSignature())
201 o << t.name() << ":" << t.line();
202 else{
203 _printFuncName(o,t.name());
204 }
205 return o;
206}
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
214namespace
215{
216/// Fonction appelée lorsqu'une assertion échoue.
217typedef void (*fDoAssert)(const char*,const char*,const char*,size_t);
218/// Fonction appelée pour indiquer s'il faut afficher l'information de débug
219typedef bool (*fCheckDebug)(unsigned int);
220
221fDoAssert g_do_assert_func = 0;
222}
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226/*!
227 * Affichage d'une assertion ayant échouée.
228 */
229extern "C++" ARCCORE_BASE_EXPORT void
230_doAssert(const char* text,const char* file,const char* func,int line)
231{
232 if (g_do_assert_func)
233 (*g_do_assert_func)(text,file,func,line);
234 else{
235 std::ostringstream ostr;
236 ostr << text << ':' << file << ':' << func << ':' << line << ": ";
237 throw FatalErrorException("Assert",ostr.str());
238 }
239}
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
244extern "C++" ARCCORE_BASE_EXPORT void
245arccorePrintf(const char* format,...)
246{
247 // \n écrit en meme temps pour éviter des écritures intermédiares parasites
248 char buffer[4096];
249 va_list ap;
250 va_start(ap,format);
251 vsnprintf(buffer,4095,format,ap);
252 va_end(ap);
253 std::cerr << buffer << "\n";
254 std::cout << "*E* " << buffer << "\n";
255}
256
257/*---------------------------------------------------------------------------*/
258/*---------------------------------------------------------------------------*/
259
260} // End namespace Arccore
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
Gestion des références à une classe C++.
Exception lorsqu'une erreur fatale est survenue.
Exception lorsqu'une valeur n'est pas dans un intervalle donné.
Chaîne de caractères unicode.
Integer len(const char *s)
Retourne la longueur de la chaîne s.
void(* fDoAssert)(const char *, const char *, const char *, size_t)
Fonction appelée lorsqu'une assertion échoue.
Definition Misc.cc:305
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
ARCCORE_BASE_EXPORT int getProcessId()
Numéro du processus.
ARCCORE_BASE_EXPORT String getHostName()
Nom de la machine sur lequel tourne le processus.
Espace de nom de Arccore.
Definition ArcaneTypes.h:24
ARCCORE_BASE_EXPORT void arccoreThrowNullPointerError(const char *ptr_name, const char *text)
Signalee l'utilisation d'un pointeur nul en envoyant une exception.
ARCCORE_BASE_EXPORT void _doAssert(const char *text, const char *file, const char *func, int line)
ARCCORE_BASE_EXPORT void arccoreSetCheck(bool v)
Active ou désactive le mode vérification.
ARCCORE_BASE_EXPORT void arccoreRangeError(Int64 i, Int64 min_value_inclusive, Int64 max_value_exclusive)
Signale qu'une valeur n'est pas dans l'intervalle souhaité.
ARCCORE_BASE_EXPORT void arccoreNullPointerError()
Signalue l'utilisation d'un pointeur nul.
ARCCORE_BASE_EXPORT void arccorePrintf(const char *format,...)
Encapsulation de la fonction C printf.
ARCCORE_BASE_EXPORT void arccoreDebugPause(const char *msg)
Passe en mode pause ou lance une erreur fatale.
std::int64_t Int64
Type entier signé sur 64 bits.
ARCCORE_BASE_EXPORT bool arccoreIsCheck()
Vrai si on est en mode vérification.
ARCCORE_BASE_EXPORT void arccoreSetPauseOnError(bool v)
Indique si on l'appel à arccoreDebugPause() effectue une pause.