OLD | NEW |
1 /* Copyright (C) 2002-2003 Jean-Marc Valin | 1 /* Copyright (C) 2002-2003 Jean-Marc Valin |
2 Copyright (C) 2007-2009 Xiph.Org Foundation */ | 2 Copyright (C) 2007-2009 Xiph.Org Foundation */ |
3 /** | 3 /** |
4 @file stack_alloc.h | 4 @file stack_alloc.h |
5 @brief Temporary memory allocation on stack | 5 @brief Temporary memory allocation on stack |
6 */ | 6 */ |
7 /* | 7 /* |
8 Redistribution and use in source and binary forms, with or without | 8 Redistribution and use in source and binary forms, with or without |
9 modification, are permitted provided that the following conditions | 9 modification, are permitted provided that the following conditions |
10 are met: | 10 are met: |
(...skipping 14 matching lines...) Expand all Loading... |
25 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 25 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
26 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 26 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
27 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 27 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
28 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 28 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
29 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 */ | 30 */ |
31 | 31 |
32 #ifndef STACK_ALLOC_H | 32 #ifndef STACK_ALLOC_H |
33 #define STACK_ALLOC_H | 33 #define STACK_ALLOC_H |
34 | 34 |
| 35 #include "opus_types.h" |
| 36 #include "opus_defines.h" |
| 37 |
35 #if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_P
SEUDOSTACK)) | 38 #if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_P
SEUDOSTACK)) |
36 #error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTAC
K be defined to select the temporary allocation mode." | 39 #error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTAC
K be defined to select the temporary allocation mode." |
37 #endif | 40 #endif |
38 | 41 |
39 #ifdef USE_ALLOCA | 42 #ifdef USE_ALLOCA |
40 # ifdef WIN32 | 43 # ifdef WIN32 |
41 # include <malloc.h> | 44 # include <malloc.h> |
42 # else | 45 # else |
43 # ifdef HAVE_ALLOCA_H | 46 # ifdef HAVE_ALLOCA_H |
44 # include <alloca.h> | 47 # include <alloca.h> |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 * @param type Type of element | 88 * @param type Type of element |
86 */ | 89 */ |
87 | 90 |
88 #if defined(VAR_ARRAYS) | 91 #if defined(VAR_ARRAYS) |
89 | 92 |
90 #define VARDECL(type, var) | 93 #define VARDECL(type, var) |
91 #define ALLOC(var, size, type) type var[size] | 94 #define ALLOC(var, size, type) type var[size] |
92 #define SAVE_STACK | 95 #define SAVE_STACK |
93 #define RESTORE_STACK | 96 #define RESTORE_STACK |
94 #define ALLOC_STACK | 97 #define ALLOC_STACK |
| 98 /* C99 does not allow VLAs of size zero */ |
| 99 #define ALLOC_NONE 1 |
95 | 100 |
96 #elif defined(USE_ALLOCA) | 101 #elif defined(USE_ALLOCA) |
97 | 102 |
98 #define VARDECL(type, var) type *var | 103 #define VARDECL(type, var) type *var |
99 | 104 |
100 # ifdef WIN32 | 105 # ifdef WIN32 |
101 # define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) | 106 # define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) |
102 # else | 107 # else |
103 # define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) | 108 # define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) |
104 # endif | 109 # endif |
105 | 110 |
106 #define SAVE_STACK | 111 #define SAVE_STACK |
107 #define RESTORE_STACK | 112 #define RESTORE_STACK |
108 #define ALLOC_STACK | 113 #define ALLOC_STACK |
| 114 #define ALLOC_NONE 0 |
109 | 115 |
110 #else | 116 #else |
111 | 117 |
112 #ifdef CELT_C | 118 #ifdef CELT_C |
113 char *global_stack=0; | 119 char *global_stack=0; |
114 #else | 120 #else |
115 extern char *global_stack; | 121 extern char *global_stack; |
116 #endif /* CELT_C */ | 122 #endif /* CELT_C */ |
117 | 123 |
118 #ifdef ENABLE_VALGRIND | 124 #ifdef ENABLE_VALGRIND |
(...skipping 17 matching lines...) Expand all Loading... |
136 #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack
)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeo
f(char)))) | 142 #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack
)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeo
f(char)))) |
137 #define RESTORE_STACK (global_stack = _saved_stack) | 143 #define RESTORE_STACK (global_stack = _saved_stack) |
138 #define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? opus
_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack); _saved_stack = global_stack; | 144 #define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? opus
_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack); _saved_stack = global_stack; |
139 | 145 |
140 #endif /* ENABLE_VALGRIND */ | 146 #endif /* ENABLE_VALGRIND */ |
141 | 147 |
142 #include "os_support.h" | 148 #include "os_support.h" |
143 #define VARDECL(type, var) type *var | 149 #define VARDECL(type, var) type *var |
144 #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) | 150 #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) |
145 #define SAVE_STACK char *_saved_stack = global_stack; | 151 #define SAVE_STACK char *_saved_stack = global_stack; |
| 152 #define ALLOC_NONE 0 |
146 | 153 |
147 #endif /* VAR_ARRAYS */ | 154 #endif /* VAR_ARRAYS */ |
148 | 155 |
149 | 156 |
150 #ifdef ENABLE_VALGRIND | 157 #ifdef ENABLE_VALGRIND |
151 | 158 |
152 #include <valgrind/memcheck.h> | 159 #include <valgrind/memcheck.h> |
153 #define OPUS_CHECK_ARRAY(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof
(*ptr)) | 160 #define OPUS_CHECK_ARRAY(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof
(*ptr)) |
154 #define OPUS_CHECK_VALUE(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) | 161 #define OPUS_CHECK_VALUE(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) |
155 #define OPUS_CHECK_ARRAY_COND(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*s
izeof(*ptr)) | 162 #define OPUS_CHECK_ARRAY_COND(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*s
izeof(*ptr)) |
156 #define OPUS_CHECK_VALUE_COND(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) | 163 #define OPUS_CHECK_VALUE_COND(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value) |
157 #define OPUS_PRINT_INT(value) do {fprintf(stderr, #value " = %d at %s:%d\n", val
ue, __FILE__, __LINE__);}while(0) | 164 #define OPUS_PRINT_INT(value) do {fprintf(stderr, #value " = %d at %s:%d\n", val
ue, __FILE__, __LINE__);}while(0) |
158 #define OPUS_FPRINTF fprintf | 165 #define OPUS_FPRINTF fprintf |
159 | 166 |
160 #else | 167 #else |
161 | 168 |
162 static inline int _opus_false(void) {return 0;} | 169 static OPUS_INLINE int _opus_false(void) {return 0;} |
163 #define OPUS_CHECK_ARRAY(ptr, len) _opus_false() | 170 #define OPUS_CHECK_ARRAY(ptr, len) _opus_false() |
164 #define OPUS_CHECK_VALUE(value) _opus_false() | 171 #define OPUS_CHECK_VALUE(value) _opus_false() |
165 #define OPUS_PRINT_INT(value) do{}while(0) | 172 #define OPUS_PRINT_INT(value) do{}while(0) |
166 #define OPUS_FPRINTF (void) | 173 #define OPUS_FPRINTF (void) |
167 | 174 |
168 #endif | 175 #endif |
169 | 176 |
170 | 177 |
171 #endif /* STACK_ALLOC_H */ | 178 #endif /* STACK_ALLOC_H */ |
OLD | NEW |