00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #define _XOPEN_SOURCE 600
00028
00029 #include "config.h"
00030
00031 #include <limits.h>
00032 #include <stdlib.h>
00033 #include <string.h>
00034 #if HAVE_MALLOC_H
00035 #include <malloc.h>
00036 #endif
00037
00038 #include "avutil.h"
00039 #include "mem.h"
00040
00041
00042 #undef free
00043 #undef malloc
00044 #undef realloc
00045
00046 #ifdef MALLOC_PREFIX
00047
00048 #define malloc AV_JOIN(MALLOC_PREFIX, malloc)
00049 #define memalign AV_JOIN(MALLOC_PREFIX, memalign)
00050 #define posix_memalign AV_JOIN(MALLOC_PREFIX, posix_memalign)
00051 #define realloc AV_JOIN(MALLOC_PREFIX, realloc)
00052 #define free AV_JOIN(MALLOC_PREFIX, free)
00053
00054 void *malloc(size_t size);
00055 void *memalign(size_t align, size_t size);
00056 int posix_memalign(void **ptr, size_t align, size_t size);
00057 void *realloc(void *ptr, size_t size);
00058 void free(void *ptr);
00059
00060 #endif
00061
00062 #define ALIGN (HAVE_AVX ? 32 : 16)
00063
00064
00065
00066
00067
00068
00069 static size_t max_alloc_size= INT_MAX;
00070
00071 void av_max_alloc(size_t max){
00072 max_alloc_size = max;
00073 }
00074
00075 void *av_malloc(size_t size)
00076 {
00077 void *ptr = NULL;
00078 #if CONFIG_MEMALIGN_HACK
00079 long diff;
00080 #endif
00081
00082
00083 if (size > (max_alloc_size-32))
00084 return NULL;
00085
00086 #if CONFIG_MEMALIGN_HACK
00087 ptr = malloc(size+ALIGN);
00088 if(!ptr)
00089 return ptr;
00090 diff= ((-(long)ptr - 1)&(ALIGN-1)) + 1;
00091 ptr = (char*)ptr + diff;
00092 ((char*)ptr)[-1]= diff;
00093 #elif HAVE_POSIX_MEMALIGN
00094 if (size)
00095 if (posix_memalign(&ptr,ALIGN,size))
00096 ptr = NULL;
00097 #elif HAVE_MEMALIGN
00098 ptr = memalign(ALIGN,size);
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 #else
00124 ptr = malloc(size);
00125 #endif
00126 if(!ptr && !size)
00127 ptr= av_malloc(1);
00128 return ptr;
00129 }
00130
00131 void *av_realloc(void *ptr, size_t size)
00132 {
00133 #if CONFIG_MEMALIGN_HACK
00134 int diff;
00135 #endif
00136
00137
00138 if (size > (max_alloc_size-32))
00139 return NULL;
00140
00141 #if CONFIG_MEMALIGN_HACK
00142
00143 if(!ptr) return av_malloc(size);
00144 diff= ((char*)ptr)[-1];
00145 ptr= realloc((char*)ptr - diff, size + diff);
00146 if(ptr) ptr = (char*)ptr + diff;
00147 return ptr;
00148 #else
00149 return realloc(ptr, size + !size);
00150 #endif
00151 }
00152
00153 void *av_realloc_f(void *ptr, size_t nelem, size_t elsize)
00154 {
00155 size_t size;
00156 void *r;
00157
00158 if (av_size_mult(elsize, nelem, &size)) {
00159 av_free(ptr);
00160 return NULL;
00161 }
00162 r = av_realloc(ptr, size);
00163 if (!r && size)
00164 av_free(ptr);
00165 return r;
00166 }
00167
00168 void av_free(void *ptr)
00169 {
00170 #if CONFIG_MEMALIGN_HACK
00171 if (ptr)
00172 free((char*)ptr - ((char*)ptr)[-1]);
00173 #else
00174 free(ptr);
00175 #endif
00176 }
00177
00178 void av_freep(void *arg)
00179 {
00180 void **ptr= (void**)arg;
00181 av_free(*ptr);
00182 *ptr = NULL;
00183 }
00184
00185 void *av_mallocz(size_t size)
00186 {
00187 void *ptr = av_malloc(size);
00188 if (ptr)
00189 memset(ptr, 0, size);
00190 return ptr;
00191 }
00192
00193 void *av_calloc(size_t nmemb, size_t size)
00194 {
00195 if (size <= 0 || nmemb >= INT_MAX / size)
00196 return NULL;
00197 return av_mallocz(nmemb * size);
00198 }
00199
00200 char *av_strdup(const char *s)
00201 {
00202 char *ptr= NULL;
00203 if(s){
00204 int len = strlen(s) + 1;
00205 ptr = av_malloc(len);
00206 if (ptr)
00207 memcpy(ptr, s, len);
00208 }
00209 return ptr;
00210 }
00211
00212
00213 void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem)
00214 {
00215
00216 int nb, nb_alloc;
00217 intptr_t *tab;
00218
00219 nb = *nb_ptr;
00220 tab = *(intptr_t**)tab_ptr;
00221 if ((nb & (nb - 1)) == 0) {
00222 if (nb == 0)
00223 nb_alloc = 1;
00224 else
00225 nb_alloc = nb * 2;
00226 tab = av_realloc(tab, nb_alloc * sizeof(intptr_t));
00227 *(intptr_t**)tab_ptr = tab;
00228 }
00229 tab[nb++] = (intptr_t)elem;
00230 *nb_ptr = nb;
00231 }
00232