Changeset 5757:75c9b2e184f3 in roaraudio for libroar
- Timestamp:
- 11/16/12 17:58:26 (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/memmgr.c
r5755 r5757 49 49 #define _err(x) do { roar_err_set((x)); return NULL; } while (0) 50 50 51 #ifdef ROAR_HAVE_CALLOC 52 static void * __libroar_calloc (void * userdata, size_t nmemb, size_t size) { 53 void * ret; 54 roar_err_clear_all(); 55 ret = calloc(nmemb, size); 56 roar_err_update(); 57 return ret; 58 } 59 #endif 60 #ifdef ROAR_HAVE_MALLOC 61 static void * __libroar_malloc (void * userdata, size_t size) { 62 void * ret; 63 roar_err_clear_all(); 64 ret = malloc(size); 65 roar_err_update(); 66 return ret; 67 } 68 #endif 69 #ifdef ROAR_HAVE_FREE 70 static int __libroar_free (void * userdata, void * ptr) { 71 free(ptr); 72 return 0; 73 } 74 #endif 75 #ifdef ROAR_HAVE_REALLOC 76 static void * __libroar_realloc (void * userdata, void * ptr, size_t size) { 77 void * ret; 78 roar_err_clear_all(); 79 ret = realloc(ptr, size); 80 roar_err_update(); 81 return ret; 82 } 83 #endif 84 85 static const struct roar_libroar_memmgrapi __memory_default_api = { 86 #ifdef ROAR_HAVE_CALLOC 87 .calloc = __libroar_calloc, 88 #else 89 .calloc = NULL, 90 #endif 91 #ifdef ROAR_HAVE_MALLOC 92 .malloc = __libroar_malloc, 93 #else 94 .malloc = NULL, 95 #endif 96 #ifdef ROAR_HAVE_FREE 97 .free = __libroar_free, 98 #else 99 .free = NULL, 100 #endif 101 #ifdef ROAR_HAVE_REALLOC 102 .realloc = __libroar_realloc, 103 #else 104 .realloc = NULL, 105 #endif 106 .reset = NULL, // not needed 107 .sizeofbuf = NULL, // not supported 108 109 // Not yet supported: 110 .mlock = NULL, 111 .munlock = NULL, 112 .mlockall = NULL, 113 .munlockall = NULL, 114 115 // no need with C API. 116 .userdata = NULL 117 }; 118 119 static const struct roar_libroar_memmgrapi * memory_api = &__memory_default_api; 120 121 int roar_libroar_set_memmgrapi(const struct roar_libroar_memmgrapi * api) { 122 if ( api == NULL ) 123 memory_api = &__memory_default_api; 124 memory_api = api; 125 return 0; 126 } 127 51 128 #ifdef ROAR_USE_MEMMGR 52 53 129 int roar_mm_reset(void) { 54 130 // currently this does nothing. 55 131 // we need to free pools and such here later. 132 133 if ( memory_api->reset != NULL ) 134 return memory_api->reset(memory_api->userdata); 56 135 return 0; 57 136 } … … 66 145 return 0; 67 146 147 if ( memory_api->sizeofbuf != NULL ) 148 return memory_api->sizeofbuf(memory_api->userdata, buf); 149 68 150 roar_err_set(ROAR_ERROR_NOTSUP); 69 151 return -1; … … 78 160 } 79 161 80 #ifdef ROAR_HAVE_CALLOC 81 roar_err_clear_all(); 82 ret = calloc(nmemb, size); 83 84 if ( ret == NULL ) 85 roar_err_update(); 86 87 return ret; 88 #else 89 ret = roar_mm_malloc(nmemb*size); 90 if ( ret == NULL ) 91 return NULL; 92 93 memset(ret, 0, nmemb*size); 94 95 return ret; 96 #endif 162 if ( memory_api->calloc != NULL ) { 163 return memory_api->calloc(memory_api->userdata, nmemb, size); 164 } else { 165 ret = roar_mm_malloc(nmemb*size); 166 if ( ret == NULL ) 167 return NULL; 168 169 memset(ret, 0, nmemb*size); 170 171 return ret; 172 } 97 173 } 98 174 99 175 void * roar_mm_malloc(size_t size) { 100 void * ret;101 102 176 if ( size == 0 ) { 103 177 _libroar_null_buffer_check(); … … 105 179 } 106 180 107 #ifdef ROAR_HAVE_MALLOC 108 roar_err_clear_all(); 109 ret = malloc(size); 110 111 if ( ret == NULL ) 112 roar_err_update(); 113 114 return ret; 115 #elif defined(ROAR_HAVE_CALLOC) 116 return roar_mm_calloc(1, size); 117 #elif defined(ROAR_HAVE_REALLOC) 118 return roar_mm_realloc(NULL, size); 119 #else 120 _err(ROAR_ERROR_NOSYS); 121 #endif 181 if ( memory_api->malloc != NULL ) { 182 return memory_api->malloc(memory_api->userdata, size); 183 } else if ( memory_api->calloc != NULL ) { 184 return roar_mm_calloc(1, size); 185 } else if ( memory_api->realloc != NULL ) { 186 return roar_mm_realloc(NULL, size); 187 } else { 188 _err(ROAR_ERROR_NOSYS); 189 } 122 190 } 123 191 … … 129 197 } 130 198 131 #ifdef ROAR_HAVE_FREE 132 free(ptr); 133 return 0; 134 #elif defined(ROAR_HAVE_REALLOC) 135 if ( roar_mm_realloc(ptr, 0) != _libroar_null_buffer ) 136 return -1; 137 return 0; 138 #else 139 roar_err_set(ROAR_ERROR_NOSYS); 140 return -1; 141 #endif 199 if ( memory_api->free != NULL ) { 200 return memory_api->free(memory_api->userdata, ptr); 201 } else if ( memory_api->realloc != NULL ) { 202 if ( roar_mm_realloc(ptr, 0) != _libroar_null_buffer ) 203 return -1; 204 return 0; 205 } else { 206 roar_err_set(ROAR_ERROR_NOSYS); 207 return -1; 208 } 142 209 } 143 210 144 211 void * roar_mm_realloc(void *ptr, size_t size) { 145 212 void * ret; 146 #ifndef ROAR_HAVE_REALLOC147 213 ssize_t len; 148 #endif149 214 150 215 if ( ptr == NULL ) … … 157 222 } 158 223 159 #ifdef ROAR_HAVE_REALLOC 160 roar_err_clear_all(); 161 ret = realloc(ptr, size); 162 163 if ( ret == NULL ) 164 roar_err_update(); 165 166 return ret; 167 #else 168 len = roar_mm_sizeof(ptr); 169 if ( len == -1 ) 170 return NULL; 171 172 ret = roar_mm_malloc(size); 173 if ( ret == NULL ) 174 return NULL; 175 176 memcpy(ret, ptr, len > (ssize_t)size ? size : len); 177 178 return ret; 179 #endif 224 if ( memory_api->realloc != NULL ) { 225 return memory_api->realloc(memory_api->userdata, ptr, size); 226 } else { 227 len = roar_mm_sizeof(ptr); 228 if ( len == -1 ) 229 return NULL; 230 231 ret = roar_mm_malloc(size); 232 if ( ret == NULL ) 233 return NULL; 234 235 memcpy(ret, ptr, len > (ssize_t)size ? size : len); 236 237 return ret; 238 } 180 239 } 181 240 #endif
Note: See TracChangeset
for help on using the changeset viewer.