comparison riviera/support/exception.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:75a11d740a02
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 // Authorization to use this source code communicated to Christophe Favergeon
18 // by email
19
20 #include "../../include/config.h"
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <assert.h>
25 #include "exception.h"
26
27
28 /* global stack of exception context */
29 struct _exceptionContext_ *const _returnExceptionContext_[MAX_RVF_TASKS]=
30 #if (!GSMLITE)
31 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
32 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
33 #else
34 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
35 #endif
36
37 struct _exceptionContext_ *_currentExceptionContext_ [MAX_RVF_TASKS]=
38 #if (!GSMLITE)
39 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
40 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
41 #else
42 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
43 #endif
44
45 /* delete protected pointers and throw exception */
46 void
47 _exceptionThrow_(int exception)
48 {
49 struct _protectedPtr_ *p;
50 struct _protectedPtr_ *oldp;
51
52 /* no exception context saved, exit program */
53 if (!_currentExceptionContext_[rvf_get_taskid()]) exit(exception);
54
55 /* free pointers stored on the current exception context pointers stack */
56 p=_currentExceptionContext_[rvf_get_taskid()]->stack;
57
58 while(p)
59 {
60 oldp=p->previous;
61 p->func(p->ptr);
62 rvf_free_buf(p);
63 p=oldp;
64 }
65
66 _currentExceptionContext_[rvf_get_taskid()]->stack=NULL;
67
68 /* jump to previous exception context */
69 rvf_restore_context_buffer_(_currentExceptionContext_[rvf_get_taskid()]->context, exception);
70 }
71
72
73 // Protect a pointer when there is a try/ctahc block active
74 void rvf_protect_pointer(T_RVF_MB_ID mb_id,void *p,T_RVF_RELEASE_PROTECTED_POINTER func)
75 {
76
77 struct _protectedPtr_ *ptr;
78 struct _exceptionContext_ *context;
79 T_RVF_MB_STATUS err;
80
81
82
83 if (_currentExceptionContext_[rvf_get_taskid()])
84 {
85
86 if (p==NULL)
87 throw(E_not_enough_memory);
88
89 context=_currentExceptionContext_[rvf_get_taskid()];
90 err=rvf_get_buf(mb_id,sizeof(struct _protectedPtr_),(void*)&ptr);
91
92
93 if (err==RVF_GREEN)
94 {
95 ptr->next=NULL;
96 ptr->previous=NULL;
97 ptr->ptr=p;
98 ptr->func=func;
99
100 if (context->stack==NULL)
101 {
102 context->stack=ptr;
103 }
104 else
105 {
106 ptr->previous=context->stack;
107 context->stack->next=ptr;
108 context->stack=ptr;
109 }
110 }
111 else
112 {
113 if (p!=NULL)
114 rvf_free_buf(p);
115 throw(E_not_enough_memory);
116 }
117 }
118 }
119
120 void rvf_forget_protected_ptr()
121 {
122 struct _protectedPtr_ *p;
123 struct _protectedPtr_ *oldp;
124
125 p=_currentExceptionContext_[rvf_get_taskid()]->stack;
126
127 while(p)
128 {
129 oldp=p->previous;
130 rvf_free_buf(p);
131 p=oldp;
132 }
133
134 _currentExceptionContext_[rvf_get_taskid()]->stack=NULL;
135 }