annotate packages/infra/current/include/cyg_ass.h @ 22:53104bbd5f99 ecos-sw-1999-07-09

Merge from eCos master repository on 1999-07-09-05:47:06-BST
author jlarmour
date Fri, 09 Jul 1999 07:15:07 +0000
parents 443894e2e912
children c38311975d4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 #ifndef CYGONCE_INFRA_CYG_ASS_H
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_INFRA_CYG_ASS_H
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
6 // assert.h
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
8 // Macros and prototypes for the assert system
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 //####COPYRIGHTBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
14 // The contents of this file are subject to the Cygnus eCos Public License
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
15 // Version 1.0 (the "License"); you may not use this file except in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
16 // compliance with the License. You may obtain a copy of the License at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 // http://sourceware.cygnus.com/ecos
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 // Software distributed under the License is distributed on an "AS IS"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 // License for the specific language governing rights and limitations under
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 // the License.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 // The Original Code is eCos - Embedded Cygnus Operating System, released
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 // September 30, 1998.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 // The Initial Developer of the Original Code is Cygnus. Portions created
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
28 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
35 // Author(s): nickg from an original by hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
36 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
37 // Date: 1997-09-08
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
38 // Purpose: Use asserts to avoid writing duff code.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
39 // Description: Runtime tests that compile to nothing in
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 // release versions of the code, to allow
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 // as-you-go testing of alternate builds.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
42 // Usage: #include <cyg/infra/cyg_ass.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
43 // ...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // CYG_ASSERT( pcount > 0, "Number of probes should be > 0!" );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 // which can result, for example, in a message of the form:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 // ASSERT FAILED: probemgr.cxx:1340, scan_probes() :
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // number of probes should be > 0!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 // if the boolean "pcount > 0" is false.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <pkgconf/infra.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
57 #include <cyg/infra/cyg_type.h> // for CYGBLD_ATTRIB_NORET
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 // If we do not have a function name macro, define it ourselves
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #ifndef CYGDBG_INFRA_DEBUG_FUNCTION_PSEUDOMACRO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 // __PRETTY_FUNCTION__ does not work
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 # ifndef __PRETTY_FUNCTION__ // And it is not already defined
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 # define __PRETTY_FUNCTION__ NULL
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 # endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
69 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
70 // this is executed to deal with failure - breakpoint it first!
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
71
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
72 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
73 cyg_assert_fail( const char* /* psz_func */, const char* /* psz_file */,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
74 cyg_uint32 /* linenum */, const char* /* psz_msg */ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
75 CYGBLD_ATTRIB_NORET;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
76
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 // We define macros and appropriate prototypes for the assert/fail
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 // system. These are:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
84 // CYG_FAIL - unconditional panic
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
85 // CYG_ASSERT - panic if boolean expression is false
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
86 // CYG_ASSERTC - compact version of CYG_ASSERT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 # ifdef CYGDBG_INFRA_DEBUG_ASSERT_MESSAGE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
89 # define CYG_ASSERT_DOCALL( _msg_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 cyg_assert_fail( __PRETTY_FUNCTION__, __FILE__, __LINE__, _msg_ );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 # else
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
92 # define CYG_ASSERT_DOCALL( _msg_ ) \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 CYG_MACRO_START \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
94 const char* _tmp1_ = _msg_; \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 _tmp1_ = _tmp1_; \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 cyg_assert_fail( __PRETTY_FUNCTION__, __FILE__, __LINE__, NULL ); \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 # endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 // unconditional failure; use like panic(), coredump() &c.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 # define CYG_FAIL( _msg_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 CYG_MACRO_START \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
103 CYG_ASSERT_DOCALL( _msg_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 // conditioned assert; if the condition is false, fail.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 # define CYG_ASSERT( _bool_, _msg_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 CYG_MACRO_START \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 if ( ! ( _bool_ ) ) \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
110 CYG_ASSERT_DOCALL( _msg_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
113 # define CYG_ASSERTC( _bool_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
114 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
115 if ( ! ( _bool_ ) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
116 CYG_ASSERT_DOCALL( #_bool_ );\
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
117 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
118
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 #else // ! CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 // No asserts: we define empty statements for assert & fail.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
124 # define CYG_FAIL( _msg_ ) CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 # define CYG_ASSERT( _bool_, _msg_ ) CYG_EMPTY_STATEMENT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
126 # define CYG_ASSERTC( _bool_ ) CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 #endif // ! CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 // Pointer integrity checks.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 // These check not only for NULL pointer, but can also check for pointers
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 // that are outside to defined memory areas of the platform or executable.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 // We differentiate between data and function pointers, so that we can cope
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 // with different formats, and so we can check them against different memory
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 // regions.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 externC cyg_bool cyg_check_data_ptr(void *ptr);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 externC cyg_bool cyg_check_func_ptr(void (*ptr)(void));
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 # define CYG_CHECK_DATA_PTR( _ptr_, _msg_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 CYG_MACRO_START \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 if( !cyg_check_data_ptr((void *)(_ptr_))) \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
146 CYG_ASSERT_DOCALL( _msg_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 # define CYG_CHECK_FUNC_PTR( _ptr_, _msg_ ) \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 CYG_MACRO_START \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 if( !cyg_check_func_ptr((void (*)(void))(_ptr_))) \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
152 CYG_ASSERT_DOCALL( _msg_ ); \
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 CYG_MACRO_END
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
155 # define CYG_CHECK_DATA_PTRC( _ptr_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
156 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
157 if ( !cyg_check_data_ptr((void *)(_ptr_))) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
158 CYG_ASSERT_DOCALL("data pointer (" #_ptr_ ") is valid");\
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
159 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
160
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
161 # define CYG_CHECK_FUNC_PTRC( _ptr_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
162 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
163 if ( !cyg_check_func_ptr((void (*)(void))(_ptr_))) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
164 CYG_ASSERT_DOCALL("function pointer (" #_ptr_ ") is valid"); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
165 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
166
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 #else // CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 # define CYG_CHECK_DATA_PTR( _ptr_, _msg_ ) CYG_EMPTY_STATEMENT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
170 # define CYG_CHECK_FUNC_PTR( _ptr_, _msg_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
171 # define CYG_CHECK_DATA_PTRC( _ptr_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
172 # define CYG_CHECK_FUNC_PTRC( _ptr_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
173
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 #endif // CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 // Unconditional definitions:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179 // Check an object for validity by calling its own checker.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 // Usage:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 // ClassThing *p = &classobject;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 // CYG_ASSERTCLASS( p, "Object at p is broken!" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 // this enum gives some options as to how keenly to test; avoids cluttering
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 // the member function declaration if the implementor wants to do more
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 // zealous tests themselves.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 enum cyg_assert_class_zeal {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 cyg_system_test = -1,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 cyg_none = 0,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 cyg_trivial,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 cyg_quick,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 cyg_thorough,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 cyg_extreme
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 // Define macros for checking classes:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
200 // CYG_ASSERT_CLASS - do proforma check on a class pointer
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
201 // CYG_ASSERT_CLASSO - do proforma check on a class object
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
202 // CYG_ASSERT_ZERO_OR_CLASS- a class pointer is NULL or valid
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
203 // CYG_ASSERT_THIS - "this" is valid
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
204 // + 3 compact variants and two aliases for backwards compatibility.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
205 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
206 // All of these end up going via CYG_ASSERT(), which will be an empty
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
207 // statement if CYGDBG_USE_ASSERTS is disabled. There is no need to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
208 // test CYGDBG_USE_ASSERTS again here.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 // The idiom required is that a class have a member function called
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
211 // "bool check_this( cyg_assert_class_zeal ) const" that returns true
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
212 // iff the object is OK. This need not be conditionally compiled against
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 // CYGDBG_USE_ASSERTS but it can be if only this macro is used to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 // invoke it. Alternatively it can be invoked by hand with other
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 // choices from the above enum.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 // Assert the checker function of an object by pointer, or in hand.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 #ifdef __cplusplus
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
221 # ifndef CYG_ASSERT_CLASS_ZEAL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
222 # define CYG_ASSERT_CLASS_ZEAL (cyg_quick) // can be redefined locally
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
223 # endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
225 # define CYG_ASSERT_CLASS( _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
226 CYG_ASSERT( ((0 != (_pobj_)) && \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
227 (_pobj_)->check_this( CYG_ASSERT_CLASS_ZEAL )), _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
228
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
229 # define CYG_ASSERTCLASS( _pobj_,_msg_) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
230 CYG_ASSERT_CLASS( (_pobj_), _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
231
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
232 # define CYG_ASSERT_CLASSO( _obj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
233 CYG_ASSERT( (_obj_).check_this( CYG_ASSERT_CLASS_ZEAL ), _msg_ )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235 # define CYG_ASSERTCLASSO( _obj_, _msg_ ) \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
236 CYG_ASSERT_CLASSO( (_obj_), _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
237
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
238 # define CYG_ASSERT_ZERO_OR_CLASS( _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
239 CYG_ASSERT( ((0 == (_pobj_)) || \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
240 (_pobj_)->check_this( CYG_ASSERT_CLASS_ZEAL )), _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
241
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
242 # define CYG_ASSERT_THIS( _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
243 CYG_ASSERT( this->check_this( CYG_ASSERT_CLASS_ZEAL ), _msg_ )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
245 # define CYG_ASSERT_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
246 CYG_ASSERT_CLASS( (_pobj_), "class pointer (" #_pobj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
247
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
248 # define CYG_ASSERT_CLASSOC( _obj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
249 CYG_ASSERT_CLASSO( (_obj_), "object (" #_obj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
250
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
251 # define CYG_ASSERT_ZERO_OR_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
252 CYG_ASSERT_ZERO_OR_CLASS((_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
253 "class pointer (" #_pobj_ ") is zero or valid")
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
254
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
255 # define CYG_ASSERT_THISC( ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
256 CYG_ASSERT_THIS( "\"this\" pointer is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
257
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 #define CYGDBG_DEFINE_CHECK_THIS \
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
259 bool check_this( cyg_assert_class_zeal zeal ) const;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
260
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
261 #endif // __cplusplus
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 // Some alternative names for basic assertions that we can disable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 // individually.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 // CYG_PRECONDITION - argument checking etc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 // CYG_POSTCONDITION - results etc
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 // CYG_LOOP_INVARIANT - for putting in loops
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
270 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
271 // C++ programmers have class-related variants of all of these.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 #ifdef CYGDBG_INFRA_DEBUG_PRECONDITIONS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 # define CYG_PRECONDITION( _bool_ , _msg_ ) CYG_ASSERT( _bool_, _msg_ )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
275 # define CYG_PRECONDITIONC( _bool_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
276 CYG_ASSERT( _bool_, "precondition " #_bool_)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 # define CYG_PRECONDITION( _bool_ , _msg_ ) CYG_EMPTY_STATEMENT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
279 # define CYG_PRECONDITIONC( _bool_ ) CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 #ifdef CYGDBG_INFRA_DEBUG_POSTCONDITIONS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 # define CYG_POSTCONDITION( _bool_ , _msg_ ) CYG_ASSERT( _bool_, _msg_ )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
284 # define CYG_POSTCONDITIONC( _bool_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
285 CYG_ASSERT( _bool_, "postcondition " #_bool_)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287 # define CYG_POSTCONDITION( _bool_ , _msg_ ) CYG_EMPTY_STATEMENT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
288 # define CYG_POSTCONDITIONC( _bool_ ) CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 #ifdef CYGDBG_INFRA_DEBUG_LOOP_INVARIANTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 # define CYG_LOOP_INVARIANT( _bool_ , _msg_ ) CYG_ASSERT( _bool_, _msg_ )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
293 # define CYG_LOOP_INVARIANTC( _bool_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
294 CYG_ASSERT( _bool_, "loop invariant " #_bool_ )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 # define CYG_LOOP_INVARIANT( _bool_ , _msg_ ) CYG_EMPTY_STATEMENT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
297 # define CYG_LOOP_INVARIANTC( _bool_ ) CYG_EMPTY_STATEMENT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
300 #ifdef __cplusplus
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
301
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
302 // All variants of _CLASS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
303 # define CYG_PRECONDITION_CLASS( _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
304 CYG_PRECONDITION( ((0 != (_pobj_)) && \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
305 (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
306
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
307 # define CYG_PRECONDITION_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
308 CYG_PRECONDITION_CLASS( (_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
309 "precondition, class pointer (" #_pobj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
310
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
311 # define CYG_POSTCONDITION_CLASS( _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
312 CYG_POSTCONDITION( ((0 != (_pobj_)) && \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
313 (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
314
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
315 # define CYG_POSTCONDITION_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
316 CYG_POSTCONDITION_CLASS( (_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
317 "postcondition, class pointer (" #_pobj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
318
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
319 # define CYG_LOOP_INVARIANT_CLASS( _pobj_, _msg_) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
320 CYG_LOOP_INVARIANT( ((0 != (_pobj_)) && \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
321 (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
322
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
323 # define CYG_LOOP_INVARIANT_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
324 CYG_LOOP_INVARIANT_CLASS( (_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
325 "loop invariant, class pointer (" #_pobj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
326
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
327 // All variants of _CLASSO
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
328 # define CYG_PRECONDITION_CLASSO( _obj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
329 CYG_PRECONDITION( (_obj_).check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
330
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
331 # define CYG_PRECONDITION_CLASSOC( _obj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
332 CYG_PRECONDITION_CLASSO( (_obj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
333 "precondition, object (" #_obj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
334
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
335 # define CYG_POSTCONDITION_CLASSO( _obj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
336 CYG_POSTCONDITION( (_obj_).check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
337
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
338 # define CYG_POSTCONDITION_CLASSOC( _obj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
339 CYG_POSTCONDITION_CLASSO( (_obj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
340 "postcondition, object (" #_obj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
341
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
342 # define CYG_LOOP_INVARIANT_CLASSO( _obj_, _msg_) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
343 CYG_LOOP_INVARIANT( (_obj_).check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
344
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
345 # define CYG_LOOP_INVARIANT_CLASSOC( _obj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
346 CYG_LOOP_INVARIANT_CLASSO( (_obj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
347 "loop invariant, object (" #_obj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
348
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
349 // All variants of _ZERO_OR_CLASS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
350 # define CYG_PRECONDITION_ZERO_OR_CLASS( _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
351 CYG_PRECONDITION( ((0 == (_pobj_)) || \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
352 (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
353
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
354 # define CYG_PRECONDITION_ZERO_OR_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
355 CYG_PRECONDITION_ZERO_OR_CLASS( (_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
356 "precondition, class pointer (" #_pobj_ ") is zero or valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
357
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
358 # define CYG_POSTCONDITION_ZERO_OR_CLASS( _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
359 CYG_POSTCONDITION( ((0 == (_pobj_)) || \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
360 (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
361
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
362 # define CYG_POSTCONDITION_ZERO_OR_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
363 CYG_POSTCONDITION_ZERO_OR_CLASS( (_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
364 "postcondition, class pointer (" #_pobj_ ") is zero or valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
365
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
366 # define CYG_LOOP_INVARIANT_ZERO_OR_CLASS( _pobj_, _msg_) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
367 CYG_LOOP_INVARIANT( ((0 == (_pobj_)) || \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
368 (_pobj_)->check_this(CYG_ASSERT_CLASS_ZEAL)), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
369
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
370 # define CYG_LOOP_INVARIANT_ZERO_OR_CLASSC( _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
371 CYG_LOOP_INVARIANT_ZERO_OR_CLASS( (_pobj_), \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
372 "loop invariant, class pointer (" #_pobj_ ") is zero or valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
373
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
374 // All variants of _THIS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
375 # define CYG_PRECONDITION_THIS( _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
376 CYG_PRECONDITION( this->check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
377
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
378 # define CYG_PRECONDITION_THISC() \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
379 CYG_PRECONDITION_THIS( "precondition, \"this\" is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
380
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
381 # define CYG_POSTCONDITION_THIS( _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
382 CYG_POSTCONDITION( this->check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
383
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
384 # define CYG_POSTCONDITION_THISC() \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
385 CYG_POSTCONDITION_THIS( "postcondition, \"this\" is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
386
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
387 # define CYG_LOOP_INVARIANT_THIS( _msg_) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
388 CYG_LOOP_INVARIANT( this->check_this(CYG_ASSERT_CLASS_ZEAL), _msg_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
389
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
390 # define CYG_LOOP_INVARIANT_THISC() \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
391 CYG_LOOP_INVARIANT_THIS( "loop invariant, \"this\" is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
392
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
393 #endif // __cplusplus
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
394
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
395 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
396 // Invariants. These are a bit more interesting. The ordinary invariants
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
397 // take an arbitrary boolean expression, and C++ does not provide any way
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
398 // of evaluating this expression automatically on entry and exit - any
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
399 // attempt to use local objects leads to trying to evaluate the expression
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
400 // when it is not in scope. This problem does not arise with objects.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
401 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
402 // For C++ objects it is possible to do a bit better. A template can be
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
403 // used to create a local object whose constructor will validate the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
404 // target object and whose destructor will validate the target object
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
405 // again. Unfortunately it is necessary to pass the type as well as
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
406 // the object: typeof() is a gcc extension, and RTTI's typeid facility
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
407 // would provide the derived class and not what we actually want.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
408
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
409 #ifdef CYGDBG_INFRA_DEBUG_INVARIANTS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
410
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
411 # define CYG_INVARIANT( _bool_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
412 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
413 if ( ! ( _bool_ ) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
414 CYG_ASSERT_DOCALL( _msg_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
415 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
416
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
417 # define CYG_INVARIANTC( _bool_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
418 CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
419 if ( ! ( _bool_ ) ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
420 CYG_ASSERT_DOCALL( "invariant (" #_bool_ ")" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
421 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
422
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
423 # ifdef __cplusplus
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
424 // NOTE: if the compiler does not manage to inline the appropriate
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
425 // template functions then the impact on code size and performance becomes
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
426 // rather large. But there are significant performance overheads anyway
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
427 // simply because of the call to check_this()...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
428 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
429 template<class X> class __CygInvariantObject {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
430
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
431 const X* rep;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
432
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
433 private:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
434 // Prevent access to the default constructors.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
435 __CygInvariantObject() { }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
436 __CygInvariantObject( const __CygInvariantObject& arg ) { }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
437 __CygInvariantObject & operator=( const __CygInvariantObject & arg) { return *this; }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
438
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
439 public:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
440 __CygInvariantObject( X* arg, const char* msg ) : rep(arg) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
441 if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
442 CYG_ASSERT_DOCALL( msg );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
443 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
444 __CygInvariantObject( X& arg, const char* msg ) : rep(&arg) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
445 if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
446 CYG_ASSERT_DOCALL( msg );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
447 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
448 __CygInvariantObject( const X* arg, const char* msg ) : rep(arg) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
449 if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
450 CYG_ASSERT_DOCALL( msg );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
451 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
452 __CygInvariantObject( const X& arg, const char* msg ) : rep(&arg) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
453 if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
454 CYG_ASSERT_DOCALL( msg );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
455 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
456 ~__CygInvariantObject( ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
457 if ( !rep->check_this( CYG_ASSERT_CLASS_ZEAL ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
458 CYG_ASSERT_DOCALL( "invariant, object valid on exit" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
459 rep = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
460 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
461 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
462
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
463 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
464 // These macros provide sensible concatenation facilities at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
465 // the C preprocessor level, getting around complications in the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
466 // macro expansion rules related to __LINE__ and __FILE__.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
467
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
468 # define __CYG_INVARIANT_CLASSNAME_AUX( a, b) a ## b
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
469 # define __CYG_INVARIANT_CLASSNAME( a, b ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
470 __CYG_INVARIANT_CLASSNAME_AUX( a, b )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
471
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
472
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
473 // These macro definitions do not use CYG_MACRO_START because
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
474 // I do not want the scope of the local objects to get confused.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
475 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
476 // The first line of the macro expansion specifies the type of
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
477 // the local object being created. The second line invents a
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
478 // name for this object. The third line provides command-line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
479 // arguments.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
480
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
481 # define CYG_INVARIANT_CLASS( _type_, _pobj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
482 __CygInvariantObject<_type_> \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
483 __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
484 ( _pobj_, _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
485
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
486 # define CYG_INVARIANT_CLASSC( _type_, _pobj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
487 __CygInvariantObject<_type_> \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
488 __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
489 ( _pobj_, "invariant, class pointer (" #_pobj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
490
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
491 # define CYG_INVARIANT_CLASSO( _type_, _obj_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
492 __CygInvariantObject<_type_> \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
493 __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
494 ( _obj_, _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
495
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
496 # define CYG_INVARIANT_CLASSOC( _type_, _obj_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
497 __CygInvariantObject<_type_> \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
498 __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
499 ( _obj_, "invariant, object (" #_obj_ ") is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
500
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
501 # define CYG_INVARIANT_THIS( _type_, _msg_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
502 __CygInvariantObject<_type_> \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
503 __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
504 ( this, _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
505
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
506 # define CYG_INVARIANT_THISC( _type_ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
507 __CygInvariantObject<_type_> \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
508 __CYG_INVARIANT_CLASSNAME( __invariant_class_, __LINE__ ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
509 ( this, "invariant, \"this\" is valid" )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
510
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
511 # endif // __cplusplus
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
512
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
513 #else // !CYGDBG_INFRA_DEBUG_INVARIANTS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
514
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
515 # define CYG_INVARIANT( _bool_, _msg_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
516 # define CYG_INVARIANTC( _bool_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
517
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
518 # ifdef __cplusplus
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
519
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
520 # define CYG_INVARIANT_CLASS( _type_, _pobj_, _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
521 # define CYG_INVARIANT_CLASSC( _type_, _pobj_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
522 # define CYG_INVARIANT_CLASSO( _type_, _obj_, _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
523 # define CYG_INVARIANT_CLASSOC( _type_, _obj_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
524 # define CYG_INVARIANT_THIS( _type_, _msg_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
525 # define CYG_INVARIANT_THISC( _type_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
526
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
527 # endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
528
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
529 #endif // CYGDBG_INFRA_DEBUG_INVARIANTS
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
530
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
531 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
532 // Compile time failure; like #error but in a macro so we can use it in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
533 // other definitions.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
534 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
535 // Usage:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536 // #define new CYG_COMPILETIMEFAIL( "Do NOT use new!")
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
537
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
538 #define CYG_COMPILETIMEFAIL( _msg_ ) !!!-- _msg_ --!!!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541 // -------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
542 // The host-side implementation of the infrastructure provides a number
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
543 // of additional functions that allow applications to provide their own
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
544 // implementation of cyg_assert_fail(). This is not strictly necessary
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
545 // since the presence of cyg_assert_fail() in the application would
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
546 // override the one in the library anyway, but it is useful to make
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
547 // certain functionality more readily available.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
548 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
549 // These declarations are only available if the symbol
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
550 // CYG_DECLARE_HOST_ASSERTION_SUPPORT is defined.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
551 #ifdef CYG_DECLARE_HOST_ASSERTION_SUPPORT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
552
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
553 // The default assertion handler writes its output to a file and
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
554 // if possible a suitable message to stdout. It is possible to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
555 // install an alternative handler. If this alternative returns false
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
556 // then the default handler will be invoked instead, otherwise the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
557 // application will exit.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
558 externC void cyg_assert_install_failure_handler(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
559 bool (*)(const char* /* psz_func */,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
560 const char* /* psz_file */,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
561 cyg_uint32 /* linenum */,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
562 const char* /* psz_msg */) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
563
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
564 // Register a callback that should get invoked as part of handling an
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
565 // assertion failure and that will typically produce some additional
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
566 // output. For example the trace code will install a callback to output
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
567 // trace information.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
568 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
569 // The first argument is a string identifying the callback. The second
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
570 // argument is a function pointer for the callback itself, whose
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
571 // argument is another function that can be invoked for output.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
572 externC void cyg_assert_install_failure_callback(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
573 const char* /* name */,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
574 void (*)( void (*)(const char*) ));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
575
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
576 // This function can be called by assert failure handlers to invoke
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
577 // the installed callbacks. The three arguments are function pointers
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
578 // that get invoked prior to callback invocation, by the callback itself,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
579 // and after each callback. In the first case the argument will be the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
580 // callback name.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
581 externC void cyg_assert_failure_invoke_callbacks(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
582 void (*)(const char* /* name */),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
583 void (*)(const char* /* callback data */ ),
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
584 void (*)(void) );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
585
22
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 2
diff changeset
586 // This function is intended to be called from inside gdb instead of
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 2
diff changeset
587 // cyg_assert_fail(),, without the need to specify a filename or
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 2
diff changeset
588 // anything else.
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 2
diff changeset
589 externC void cyg_assert_quickfail(void);
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 2
diff changeset
590
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
591 #endif // CYG_DECLARE_HOST_ASSERTION_SUPPORT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
592
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
593 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 #endif // CYGONCE_INFRA_CYG_ASS_H multiple inclusion protection
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596 // EOF cyg_ass.h