jle_cpp_tk  0.0 2015-04-03 sh1:"d699093732dd5f321606d0ff7a6b63b229f1922c"
A small, safe, selft contained, soft-realtime C++ toolkit
int_div0.h
1 #ifndef JLE_INT_DIV0__H
2 #define JLE_INT_DIV0__H
3 
4 
5 #include <signal.h>
6 #include <setjmp.h>
7 #include <string.h> // memcpy
8 
9 
11 
12 
13 
14 namespace jle {
15 
16 
17 #ifdef _WIN32
18 
19  #define JLE_HANDLE_DIV0_INIT \
20  { \
21  jle::init_handle_signal_FPE_intdiv0(); \
22  if (setjmp(jle::env_jmp_div0)!=0) \
23  { \
24  throw std::runtime_error("SIGNAL FPE probably int div0"); \
25  } \
26  else \
27  {
28 
29  #define JLE_HANDLE_DIV0_INIT_A(__A__) \
30  { \
31  jmp_buf previus_env_jmp_div0##__A__; \
32  memcpy(previus_env_jmp_div0##__A__, jle::env_jmp_div0, sizeof(jmp_buf)); \
33  bool previus_init_jump_div0##__A__ = jle::init_jump_div0; \
34  jle::init_jump_div0 = true; \
35  jle::init_handle_signal_FPE_intdiv0(); \
36  if (setjmp(jle::env_jmp_div0)!=0) \
37  { \
38  memcpy(jle::env_jmp_div0, previus_env_jmp_div0##__A__, sizeof(jmp_buf)); \
39  jle::init_jump_div0 = previus_init_jump_div0##__A__; \
40  throw std::runtime_error("SIGNAL FPE probably int div0"); \
41  } \
42  else \
43  {
44 
45 #elif __linux__
46  #define JLE_HANDLE_DIV0_INIT \
47  { \
48  jle::init_handle_signal_FPE_intdiv0(); \
49  if (sigsetjmp(jle::env_jmp_div0, 1)!=0) \
50  { \
51  throw std::runtime_error("SIGNAL FPE probably int div0"); \
52  } \
53  else \
54  {
55 
56  #define JLE_HANDLE_DIV0_INIT_A(__A__) \
57  { \
58  jmp_buf previus_env_jmp_div0##__A__; \
59  memcpy(previus_env_jmp_div0##__A__, jle::env_jmp_div0, sizeof(jmp_buf)); \
60  bool previus_init_jump_div0##__A__ = jle::init_jump_div0; \
61  jle::init_jump_div0 = true; \
62  jle::init_handle_signal_FPE_intdiv0(); \
63  if (sigsetjmp(jle::env_jmp_div0, 1)!=0) \
64  { \
65  memcpy(jle::env_jmp_div0, previus_env_jmp_div0##__A__, sizeof(jmp_buf)); \
66  jle::init_jump_div0 = previus_init_jump_div0##__A__; \
67  throw std::runtime_error("SIGNAL FPE probably int div0"); \
68  } \
69  else \
70  {
71 
72 #else
73  #error "Unknown platfom..."
74 #endif
75 
76 
77 #define JLE_HANDLE_DIV0_END \
78  } \
79  }
80 
81 
82 #define JLE_HANDLE_DIV0_END_A(__A__) \
83  } \
84  memcpy(jle::env_jmp_div0, previus_env_jmp_div0##__A__, sizeof(jmp_buf)); \
85  jle::init_jump_div0 = previus_init_jump_div0##__A__; \
86  }
87 
88 
89 
90  // Using JLE_HANDLE_DIV0 doesn't require to call this function
91  // it is called by such macro
92  void init_handle_signal_FPE_intdiv0 (void);
93  extern jmp_buf env_jmp_div0;
94  extern bool init_jump_div0;
95 
96 
97 
98 
99 
100 
101 }; // end namespace jle
102 
103 #endif // JLE_INT_DIV0__H
104 
generic namespace
Definition: alarm.cpp:12