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
54typedef void (*fSignalFunc)(int);
61static bool global_arcane_is_check =
true;
63static bool global_arcane_is_check =
false;
68 return global_arcane_is_check;
73 global_arcane_is_check = v;
96 std::cout <<
"WARNING: disabling thread via arcaneSetHasThread() is no longer available.\n";
102extern "C++" ARCANE_UTILS_EXPORT
108 return ti->currentThread();
115extern "C++" ARCANE_UTILS_EXPORT
void
116arcaneSetPauseOnError(
bool v)
121extern "C++" ARCANE_UTILS_EXPORT
void
130extern "C++" ARCANE_UTILS_EXPORT
void
134 cerr <<
"** FATAL: Trying to use a null pointer.\n";
136 throw FatalErrorException(A_FUNCINFO);
144 void _doNoReferenceError(
const void* ptr)
146 cerr <<
"** FATAL: Null reference.\n";
147 cerr <<
"** FATAL: Trying to use an item not referenced.\n";
148 cerr <<
"** FATAL: Item is located at memory address " << ptr <<
".\n";
156extern "C++" ARCANE_UTILS_EXPORT
void
159 _doNoReferenceError(ptr);
166extern "C++" ARCANE_UTILS_EXPORT
void
169 _doNoReferenceError(ptr);
176extern "C++" ARCANE_UTILS_EXPORT
void
182 va_start(ap, format);
183 vsnprintf(buffer, 256, format, ap);
185 cerr << buffer <<
"\n";
186 cout <<
"*E* " << buffer <<
"\n";
192extern "C++" ARCANE_UTILS_EXPORT
void
193arcaneObsolete(
const char* file,
const char* func,
unsigned long line,
const char* text)
195 cerr << file <<
':' << func <<
':' << line <<
'\n';
196 cerr <<
"usage of this function is deprecated";
198 cerr <<
": " << text;
206typedef void (*
fDoAssert)(
const char*,
const char*,
const char*, size_t);
219ARCANE_UTILS_EXPORT
void
220_doAssert(
const char* text,
const char* file,
const char* func,
size_t line)
222 if (g_do_assert_func)
223 (*g_do_assert_func)(text, file, func, line);
225 std::ostringstream ostr;
226 ostr << text <<
':' << file <<
':' << func <<
':' << line <<
": ";
237extern "C++" ARCANE_UTILS_EXPORT
bool
240 if (g_check_debug_func)
241 return (*g_check_debug_func)(val);
250 static fSignalFunc g_signal_func = 0;
254setSignalFunc(fSignalFunc func)
256 fSignalFunc old = g_signal_func;
257 g_signal_func = func;
264#ifdef ARCANE_OS_LINUX
265#define STD_SIGNAL_TYPE 1
268#if STD_SIGNAL_TYPE == 1
269#include <sys/signal.h>
279 (*g_signal_func)(val);
283_MiscSigactionFunc(
int val, siginfo_t*,
void*)
286 (*g_signal_func)(val);
296 fSignalFunc default_signal_func_sigsegv = 0;
297 fSignalFunc default_signal_func_sigfpe = 0;
298 fSignalFunc default_signal_func_sigbus = 0;
299 fSignalFunc default_signal_func_sigalrm = 0;
300 fSignalFunc default_signal_func_sigvtalrm = 0;
302 bool global_already_in_signal =
false;
305extern "C++" ARCANE_UTILS_EXPORT
void
306arcaneRedirectSignals(fSignalFunc sig_func)
308 setSignalFunc(sig_func);
309#if STD_SIGNAL_TYPE == 1
313 sa.sa_flags = SA_SIGINFO | SA_NODEFER;
314 sigemptyset(&sa.sa_mask);
315 sa.sa_sigaction = _MiscSigactionFunc;
317 sigaction(SIGSEGV, &sa,
nullptr);
318 sigaction(SIGFPE, &sa,
nullptr);
319 sigaction(SIGBUS, &sa,
nullptr);
320 sigaction(SIGALRM, &sa,
nullptr);
321 sigaction(SIGVTALRM, &sa,
nullptr);
323 default_signal_func_sigsegv = sigset(SIGSEGV, _MiscSigFunc);
324 default_signal_func_sigfpe = sigset(SIGFPE, _MiscSigFunc);
325 default_signal_func_sigbus = sigset(SIGBUS, _MiscSigFunc);
328 default_signal_func_sigalrm = sigset(SIGALRM, _MiscSigFunc);
329 default_signal_func_sigvtalrm = sigset(SIGVTALRM, _MiscSigFunc);
334extern "C++" ARCANE_UTILS_EXPORT
void
335arcaneCallDefaultSignal(
int val)
337#if STD_SIGNAL_TYPE == 1
340 SignalException::eSignalType signal_type = SignalException::ST_Unknown;
344 signal_type = SignalException::ST_SegmentationFault;
347 signal_type = SignalException::ST_FloatingException;
350 signal_type = SignalException::ST_BusError;
354 signal_type = SignalException::ST_Alarm;
363 if (global_already_in_signal)
365 global_already_in_signal =
true;
375 stack_trace = stack_service->stackTrace();
376 cerr <<
" Signal exception Stack: " << stack_trace.toString() <<
'\n';
379 cerr <<
" No stack trace service\n";
383 bool do_debug_stack =
false;
385 do_debug_stack = (v.value() != 0);
386 if (do_debug_stack) {
390 std::cerr <<
"SignalCaught: You can dump full stacktrace of the process if environment "
391 "variable ARCANE_DUMP_DEBUGGER_STACK_IN_SIGNAL is set to 1\n";
393 if (signal_type == SignalException::ST_Alarm) {
394 global_already_in_signal =
false;
397 else if (signal_type == SignalException::ST_FloatingException) {
398 global_already_in_signal =
false;
399 cerr <<
"** THROW ARITHMETIC EXCEPTION\n";
418 cerr <<
"** pure virtual method called\n";
433 void write(std::ostream& o)
const
435 char* v = (
char*)&m_v;
436 o << m_v <<
" HEXA(";
437 o << (int)v[0] <<
'-';
438 o << (int)v[1] <<
'-';
439 o << (int)v[2] <<
'-';
440 o << (int)v[3] <<
'-';
441 o << (int)v[4] <<
'-';
442 o << (int)v[5] <<
'-';
443 o << (int)v[6] <<
'-';
444 o << (int)v[7] <<
")";
449ARCANE_UTILS_EXPORT std::ostream&
450operator<<(std::ostream& o,
const HexaPrint& hp)
Exception when an arithmetic error occurs.
Template class for converting a type.
Exception when a fatal error has occurred.
Interface of a function call tracing service.
Interface of a service implementing thread support.
Exception when a signal occurs.
Information about function call stacks.
Exception when a timeout occurs.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
void arcaneNoReferenceErrorCallTerminate(const void *ptr)
Use of an unreferenced object.
void arccoreSetPauseOnError(bool v)
Indicates whether calling arccoreDebugPause() results in a pause.
Int64 arcaneCurrentThread()
Returns the ID of the current thread.
void arccoreDebugPause(const char *msg)
Enters pause mode or throws a fatal error.
bool arcaneIsCheck()
True if running in check mode.
bool arcaneHasThread()
True if arcane is compiled with thread support AND they are active.
void arcaneSetHasThread(bool v)
Activates or deactivates thread support.
void arcaneNullPointerError()
Signals the use of a null pointer.
void arcanePrintf(const char *,...)
Encapsulation of the C printf function.
void(* fDoAssert)(const char *, const char *, const char *, size_t)
Function called when an assertion fails.
bool arcaneIsDebug()
True if the ARCANE_DEBUG macro is defined.
void arcaneSetCheck(bool v)
Activates or deactivates verification mode.
bool(* fCheckDebug)(unsigned int)
Function called to indicate whether debug information should be displayed.
void arcaneNoReferenceError(const void *ptr)
Use of an unreferenced object.
bool _checkDebug(unsigned int val)
double Real
Type representing a real number.
void _doAssert(const char *text, const char *file, const char *func, size_t line)
void arcaneDebugPause(const char *msg)
Enters pause mode or throws a fatal error.