FreeCalypso > hg > ffs-editor
comparison src/cs/riviera/support/exception.h @ 0:92470e5d0b9e
src: partial import from FC Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 15 May 2020 01:28:16 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:92470e5d0b9e |
---|---|
1 /* | |
2 ****************************** | |
3 * | |
4 * | |
5 * Initialial version: Laurent Deniau, Laurent.Deniau@cern.ch | |
6 * | |
7 * For more information, please see the paper: | |
8 * http://cern.ch/Laurent.Deniau/html/oopc/exception.html | |
9 * | |
10 * ----------------------------------------------------------- | |
11 * | |
12 * Strong rework and adaption to riviera by Christophe Favergeon | |
13 * | |
14 ****************************** | |
15 */ | |
16 | |
17 #ifndef RVF_EXCEPTION_H | |
18 #define RVF_EXCEPTION_H | |
19 | |
20 #include "rvf/rvf_api.h" | |
21 #include "rvf/rvf_target.h" | |
22 | |
23 #include <string.h> | |
24 | |
25 | |
26 | |
27 //#ifndef __STDC__ | |
28 //# error "exception.h needs ISO C compiler to work properly" | |
29 //#endif | |
30 | |
31 #include <setjmp.h> | |
32 | |
33 typedef enum K_RVF_EXCEPTIONS { E_invalid=1, E_not_enough_memory,E_unknown } T_RVF_EXCEPTIONS; | |
34 | |
35 typedef void (*T_RVF_RELEASE_PROTECTED_POINTER)(void *p); | |
36 | |
37 /* | |
38 choose context savings | |
39 */ | |
40 | |
41 #define rvf_save_context_buffer_(context) setjmp(context) | |
42 #define rvf_restore_context_buffer_(context, val) longjmp(context, val) | |
43 | |
44 /* | |
45 some hidden types used to handle exceptions | |
46 */ | |
47 | |
48 /* type of stack of protected pointer */ | |
49 struct _protectedPtr_ { | |
50 struct _protectedPtr_ *next; | |
51 struct _protectedPtr_ *previous; | |
52 void *ptr; | |
53 T_RVF_RELEASE_PROTECTED_POINTER func; | |
54 }; | |
55 | |
56 /* type of stack of exception */ | |
57 struct _exceptionContext_ { | |
58 struct _exceptionContext_ *next; | |
59 struct _protectedPtr_ *stack; | |
60 jmp_buf context; | |
61 }; | |
62 | |
63 extern struct _exceptionContext_ *const _returnExceptionContext_[MAX_RVF_TASKS]; | |
64 extern struct _exceptionContext_ *_currentExceptionContext_[MAX_RVF_TASKS]; | |
65 | |
66 /* exception keywords */ | |
67 #define try \ | |
68 do { \ | |
69 struct _exceptionContext_ _localExceptionContext_ ;\ | |
70 memset(&_localExceptionContext_,0,sizeof(struct _exceptionContext_));\ | |
71 _localExceptionContext_.next=_currentExceptionContext_[rvf_get_taskid()];\ | |
72 _currentExceptionContext_[rvf_get_taskid()] = &_localExceptionContext_; \ | |
73 do { \ | |
74 int const exception = \ | |
75 rvf_save_context_buffer_(_currentExceptionContext_[rvf_get_taskid()]->context); \ | |
76 if (!exception) { | |
77 | |
78 #define catch(except) \ | |
79 } else if ((int)(except) == exception) { \ | |
80 _currentExceptionContext_[rvf_get_taskid()] = _currentExceptionContext_[rvf_get_taskid()]->next; | |
81 | |
82 #define catch_any \ | |
83 } else { \ | |
84 _currentExceptionContext_[rvf_get_taskid()] = _currentExceptionContext_[rvf_get_taskid()]->next; | |
85 | |
86 #define endtry \ | |
87 } \ | |
88 } while(0); \ | |
89 if (_currentExceptionContext_[rvf_get_taskid()] == &_localExceptionContext_) { \ | |
90 rvf_forget_protected_ptr();\ | |
91 _currentExceptionContext_[rvf_get_taskid()] = _currentExceptionContext_[rvf_get_taskid()]->next; \ | |
92 } \ | |
93 } while(0) | |
94 | |
95 #define rethrow throw(exception) | |
96 #define break_try break | |
97 | |
98 /* | |
99 #define return_try(...) \ | |
100 do { \ | |
101 _currentExceptionContext_ = _returnExceptionContext_; \ | |
102 return __VA_ARGS__; \ | |
103 } while(0) | |
104 */ | |
105 | |
106 #define throw(except) _exceptionThrow_((int)(except)) | |
107 | |
108 | |
109 /* | |
110 extern declarations | |
111 */ | |
112 | |
113 extern void _exceptionThrow_(int except); | |
114 | |
115 extern void rvf_forget_protected_ptr(); | |
116 extern void rvf_protect_pointer(T_RVF_MB_ID mb_id,void *p,T_RVF_RELEASE_PROTECTED_POINTER func); | |
117 | |
118 #define RVF_PROTECT(bank,p) rvf_protect_pointer(bank,p,(T_RVF_RELEASE_PROTECTED_POINTER)rvf_free_buf) | |
119 | |
120 #define THROW_IF_ERROR(err) if (err!=0) throw(E_unknown) | |
121 #define THROW_IF_NULL(p) if (p==NULL) throw(E_not_enough_memory) | |
122 #define THROW_IF_YELLOW(b,p) if ((p==NULL) || (rvf_get_mb_status(b)==RVF_YELLOW)) throw(E_not_enough_memory) | |
123 #endif |