14#include "arcane/utils/Iostream.h"
15#include "arcane/utils/Convert.h"
16#include "arcane/utils/StdHeader.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/SignalException.h"
20#include "arcane/utils/TimeoutException.h"
21#include "arcane/utils/ArithmeticException.h"
22#include "arcane/utils/IStackTraceService.h"
23#include "arcane/utils/TraceInfo.h"
24#include "arcane/utils/OStringStream.h"
25#include "arcane/utils/IThreadImplementation.h"
27#include "arcane/utils/NullThreadMng.h"
28#include "arcane/utils/CriticalSection.h"
32#ifndef ARCANE_OS_WIN32
38#ifndef ARCANE_OS_WIN32
42#define USE_SIGACTION 1
55 typedef void (*fSignalFunc)(int);
62static bool global_arcane_is_check =
true;
64static bool global_arcane_is_check =
false;
67extern "C++" ARCANE_UTILS_EXPORT
70 return global_arcane_is_check;
73extern "C++" ARCANE_UTILS_EXPORT
76 global_arcane_is_check = v;
79extern "C++" ARCANE_UTILS_EXPORT
92extern "C++" ARCANE_UTILS_EXPORT
98extern "C++" ARCANE_UTILS_EXPORT
102 std::cout <<
"WARNING: disabling thread via arcaneSetHasThread() is no longer available.\n";
108extern "C++" ARCANE_UTILS_EXPORT
113 return ti->currentThread();
120extern "C++" ARCANE_UTILS_EXPORT
void
121arcaneSetPauseOnError(
bool v)
126extern "C++" ARCANE_UTILS_EXPORT
void
135extern "C++" ARCANE_UTILS_EXPORT
void
139 cerr <<
"** FATAL: Trying to use a null pointer.\n";
141 throw FatalErrorException(A_FUNCINFO);
149void _doNoReferenceError(
const void* ptr)
151 cerr <<
"** FATAL: Null reference.\n";
152 cerr <<
"** FATAL: Trying to use an item not referenced.\n";
153 cerr <<
"** FATAL: Item is located at memory address " << ptr <<
".\n";
161extern "C++" ARCANE_UTILS_EXPORT
void
164 _doNoReferenceError(ptr);
171extern "C++" ARCANE_UTILS_EXPORT
void
174 _doNoReferenceError(ptr);
181extern "C++" ARCANE_UTILS_EXPORT
void
188 vsnprintf(buffer,256,format,ap);
190 cerr << buffer <<
"\n";
191 cout <<
"*E* " << buffer <<
"\n";
197extern "C++" ARCANE_UTILS_EXPORT
void
198arcaneObsolete(
const char* file,
const char* func,
unsigned long line,
const char* text)
200 cerr << file <<
':' << func <<
':' << line <<
'\n';
201 cerr <<
"usage of this function is deprecated";
203 cerr <<
": " << text;
212typedef void (*
fDoAssert)(
const char*,
const char*,
const char*,size_t);
224ARCANE_UTILS_EXPORT
void
225_doAssert(
const char* text,
const char* file,
const char* func,
size_t line)
227 if (g_do_assert_func)
228 (*g_do_assert_func)(text,file,func,line);
230 std::ostringstream ostr;
231 ostr << text <<
':' << file <<
':' << func <<
':' << line <<
": ";
241extern "C++" ARCANE_UTILS_EXPORT
bool
244 if (g_check_debug_func)
245 return (*g_check_debug_func)(val);
254static fSignalFunc g_signal_func = 0;
258setSignalFunc(fSignalFunc func)
260 fSignalFunc old = g_signal_func;
261 g_signal_func = func;
268#ifdef ARCANE_OS_LINUX
269#define STD_SIGNAL_TYPE 1
272#if STD_SIGNAL_TYPE == 1
273#include <sys/signal.h>
283 (*g_signal_func)(val);
287_MiscSigactionFunc(
int val, siginfo_t*,
void*)
290 (*g_signal_func)(val);
300fSignalFunc default_signal_func_sigsegv = 0;
301fSignalFunc default_signal_func_sigfpe = 0;
302fSignalFunc default_signal_func_sigbus = 0;
303fSignalFunc default_signal_func_sigalrm = 0;
304fSignalFunc default_signal_func_sigvtalrm = 0;
306bool global_already_in_signal =
false;
309extern "C++" ARCANE_UTILS_EXPORT
void
310arcaneRedirectSignals(fSignalFunc sig_func)
312 setSignalFunc(sig_func);
313#if STD_SIGNAL_TYPE == 1
317 sa.sa_flags = SA_SIGINFO | SA_NODEFER;
318 sigemptyset(&sa.sa_mask);
319 sa.sa_sigaction = _MiscSigactionFunc;
321 sigaction(SIGSEGV, &sa,
nullptr);
322 sigaction(SIGFPE, &sa,
nullptr);
323 sigaction(SIGBUS, &sa,
nullptr);
324 sigaction(SIGALRM, &sa,
nullptr);
325 sigaction(SIGVTALRM, &sa,
nullptr);
327 default_signal_func_sigsegv = sigset(SIGSEGV,_MiscSigFunc);
328 default_signal_func_sigfpe = sigset(SIGFPE ,_MiscSigFunc);
329 default_signal_func_sigbus = sigset(SIGBUS ,_MiscSigFunc);
332 default_signal_func_sigalrm = sigset(SIGALRM,_MiscSigFunc);
333 default_signal_func_sigvtalrm = sigset(SIGVTALRM,_MiscSigFunc);
338extern "C++" ARCANE_UTILS_EXPORT
void
339arcaneCallDefaultSignal(
int val)
341#if STD_SIGNAL_TYPE == 1
344 SignalException::eSignalType signal_type = SignalException::ST_Unknown;
348 signal_type = SignalException::ST_SegmentationFault;
351 signal_type = SignalException::ST_FloatingException;
354 signal_type = SignalException::ST_BusError;
358 signal_type = SignalException::ST_Alarm;
367 if (global_already_in_signal)
369 global_already_in_signal =
true;
379 stack_trace = stack_service->stackTrace();
380 cerr <<
" Signal exception Stack: " << stack_trace.toString() <<
'\n';
383 cerr <<
" No stack trace service\n";
387 bool do_debug_stack =
false;
389 do_debug_stack = (v.value()!=0);
394 std::cerr <<
"SignalCaught: You can dump full stacktrace of the process if environment "
395 "variable ARCANE_DUMP_DEBUGGER_STACK_IN_SIGNAL is set to 1\n";
397 if (signal_type==SignalException::ST_Alarm){
398 global_already_in_signal =
false;
401 else if (signal_type==SignalException::ST_FloatingException){
402 global_already_in_signal =
false;
403 cerr <<
"** THROW ARITHMETIC EXCEPTION\n";
422 cerr <<
"** pure virtual method called\n";
430 HexaPrint(
Real v) : m_v(v) {}
432 void write(std::ostream& o)
const
434 char* v = (
char*)&m_v;
435 o << m_v <<
" HEXA(";
436 o << (int)v[0] <<
'-';
437 o << (int)v[1] <<
'-';
438 o << (int)v[2] <<
'-';
439 o << (int)v[3] <<
'-';
440 o << (int)v[4] <<
'-';
441 o << (int)v[5] <<
'-';
442 o << (int)v[6] <<
'-';
443 o << (int)v[7] <<
")";
448ARCANE_UTILS_EXPORT std::ostream&
449operator<<(std::ostream& o,
const HexaPrint& hp)
Exception lorsqu'une erreur arithmétique survient.
Classe template pour convertir un type.
Exception lorsqu'une erreur fatale est survenue.
Interface d'un service de trace des appels de fonctions.
Interface d'un service implémentant le support des threads.
Exception lorsqu'un signal survient.
Informations sur la pile d'appel des fonctions.
Exception lorsqu'un timeout survient.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void arcaneNoReferenceErrorCallTerminate(const void *ptr)
Utilisation d'un objet non référencé.
Int64 arcaneCurrentThread()
Retourne l'identifiant du thread courant.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
bool arcaneHasThread()
Vrai si arcane est compilé avec le support des threads ET qu'ils sont actifs.
std::int64_t Int64
Type entier signé sur 64 bits.
void arcaneSetHasThread(bool v)
Active ou désactive le support des threads.
void arcaneNullPointerError()
Signalue l'utilisation d'un pointeur nul.
void arcanePrintf(const char *,...)
Encapsulation de la fonction C printf.
void(* fDoAssert)(const char *, const char *, const char *, size_t)
Fonction appelée lorsqu'une assertion échoue.
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
ARCCORE_BASE_EXPORT void arccoreDebugPause(const char *msg)
Passe en mode pause ou lance une erreur fatale.
void arcaneSetCheck(bool v)
Active ou désactive le mode vérification.
bool(* fCheckDebug)(unsigned int)
Fonction appelée pour indiquer s'il faut afficher l'information de débug.
void arcaneNoReferenceError(const void *ptr)
Utilisation d'un objet non référencé.
bool _checkDebug(unsigned int val)
double Real
Type représentant un réel.
void _doAssert(const char *text, const char *file, const char *func, size_t line)
ARCCORE_BASE_EXPORT void arccoreSetPauseOnError(bool v)
Indique si on l'appel à arccoreDebugPause() effectue une pause.
void arcaneDebugPause(const char *msg)
Passe en mode pause ou lance une erreur fatale.