blob: fef43312fde95ced125ea8a9f644a2792ec390de [file] [log] [blame]
Paul Bakker6e339b52013-07-03 13:37:05 +02001/*
2 * Buffer-based memory allocator
3 *
Paul Bakker7dc4c442014-02-01 22:50:26 +01004 * Copyright (C) 2006-2014, Brainspark B.V.
Paul Bakker6e339b52013-07-03 13:37:05 +02005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8 *
9 * All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
26#include "polarssl/config.h"
27
28#if defined(POLARSSL_MEMORY_C) && defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
29
30#include "polarssl/memory.h"
31
32#include <string.h>
33
34#if defined(POLARSSL_MEMORY_DEBUG)
35#include <stdio.h>
36#if defined(POLARSSL_MEMORY_BACKTRACE)
37#include <execinfo.h>
38#endif
39#endif
40
Paul Bakker1337aff2013-09-29 14:45:34 +020041#if defined(POLARSSL_THREADING_C)
42#include "polarssl/threading.h"
43#endif
44
Paul Bakker7dc4c442014-02-01 22:50:26 +010045#if defined(POLARSSL_PLATFORM_C)
46#include "polarssl/platform.h"
47#else
48#define polarssl_fprintf fprintf
49#endif
50
Paul Bakker6e339b52013-07-03 13:37:05 +020051#define MAGIC1 0xFF00AA55
52#define MAGIC2 0xEE119966
53#define MAX_BT 20
54
55typedef struct _memory_header memory_header;
56struct _memory_header
57{
58 size_t magic1;
59 size_t size;
60 size_t alloc;
61 memory_header *prev;
62 memory_header *next;
Paul Bakker1ef120f2013-07-03 17:20:39 +020063 memory_header *prev_free;
64 memory_header *next_free;
Paul Bakker6e339b52013-07-03 13:37:05 +020065#if defined(POLARSSL_MEMORY_BACKTRACE)
66 char **trace;
67 size_t trace_count;
68#endif
69 size_t magic2;
70};
71
72typedef struct
73{
74 unsigned char *buf;
75 size_t len;
76 memory_header *first;
Paul Bakker1ef120f2013-07-03 17:20:39 +020077 memory_header *first_free;
Paul Bakker6e339b52013-07-03 13:37:05 +020078 size_t current_alloc_size;
79 int verify;
Paul Bakker891998e2013-07-03 14:45:05 +020080#if defined(POLARSSL_MEMORY_DEBUG)
81 size_t malloc_count;
82 size_t free_count;
83 size_t total_used;
84 size_t maximum_used;
85 size_t header_count;
Manuel Pégourié-Gonnard70896a02013-12-30 18:06:41 +010086 size_t maximum_header_count;
Paul Bakker891998e2013-07-03 14:45:05 +020087#endif
Paul Bakker1337aff2013-09-29 14:45:34 +020088#if defined(POLARSSL_THREADING_C)
89 threading_mutex_t mutex;
90#endif
Paul Bakker6e339b52013-07-03 13:37:05 +020091}
92buffer_alloc_ctx;
93
94static buffer_alloc_ctx heap;
95
96#if defined(POLARSSL_MEMORY_DEBUG)
97static void debug_header( memory_header *hdr )
98{
99#if defined(POLARSSL_MEMORY_BACKTRACE)
100 size_t i;
101#endif
102
Paul Bakker7dc4c442014-02-01 22:50:26 +0100103 polarssl_fprintf( stderr, "HDR: PTR(%10u), PREV(%10u), NEXT(%10u), "
104 "ALLOC(%u), SIZE(%10u)\n",
105 (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next,
106 hdr->alloc, hdr->size );
107 polarssl_fprintf( stderr, " FPREV(%10u), FNEXT(%10u)\n",
108 (size_t) hdr->prev_free, (size_t) hdr->next_free );
Paul Bakker6e339b52013-07-03 13:37:05 +0200109
110#if defined(POLARSSL_MEMORY_BACKTRACE)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100111 polarssl_fprintf( stderr, "TRACE: \n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200112 for( i = 0; i < hdr->trace_count; i++ )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100113 polarssl_fprintf( stderr, "%s\n", hdr->trace[i] );
114 polarssl_fprintf( stderr, "\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200115#endif
116}
117
118static void debug_chain()
119{
120 memory_header *cur = heap.first;
121
Paul Bakker7dc4c442014-02-01 22:50:26 +0100122 polarssl_fprintf( stderr, "\nBlock list\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200123 while( cur != NULL )
124 {
125 debug_header( cur );
Paul Bakker6e339b52013-07-03 13:37:05 +0200126 cur = cur->next;
127 }
Paul Bakker1ef120f2013-07-03 17:20:39 +0200128
Paul Bakker7dc4c442014-02-01 22:50:26 +0100129 polarssl_fprintf( stderr, "Free list\n" );
Paul Bakker1ef120f2013-07-03 17:20:39 +0200130 cur = heap.first_free;
131
132 while( cur != NULL )
133 {
134 debug_header( cur );
135 cur = cur->next_free;
136 }
Paul Bakker6e339b52013-07-03 13:37:05 +0200137}
138#endif /* POLARSSL_MEMORY_DEBUG */
139
140static int verify_header( memory_header *hdr )
141{
142 if( hdr->magic1 != MAGIC1 )
143 {
144#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100145 polarssl_fprintf( stderr, "FATAL: MAGIC1 mismatch\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200146#endif
147 return( 1 );
148 }
149
150 if( hdr->magic2 != MAGIC2 )
151 {
152#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100153 polarssl_fprintf( stderr, "FATAL: MAGIC2 mismatch\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200154#endif
155 return( 1 );
156 }
157
158 if( hdr->alloc > 1 )
159 {
160#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100161 polarssl_fprintf( stderr, "FATAL: alloc has illegal value\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200162#endif
163 return( 1 );
164 }
165
Paul Bakker1ef120f2013-07-03 17:20:39 +0200166 if( hdr->prev != NULL && hdr->prev == hdr->next )
167 {
168#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100169 polarssl_fprintf( stderr, "FATAL: prev == next\n" );
Paul Bakker1ef120f2013-07-03 17:20:39 +0200170#endif
171 return( 1 );
172 }
173
174 if( hdr->prev_free != NULL && hdr->prev_free == hdr->next_free )
175 {
176#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100177 polarssl_fprintf( stderr, "FATAL: prev_free == next_free\n" );
Paul Bakker1ef120f2013-07-03 17:20:39 +0200178#endif
179 return( 1 );
180 }
181
Paul Bakker6e339b52013-07-03 13:37:05 +0200182 return( 0 );
183}
184
185static int verify_chain()
186{
187 memory_header *prv = heap.first, *cur = heap.first->next;
188
189 if( verify_header( heap.first ) != 0 )
190 {
191#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100192 polarssl_fprintf( stderr, "FATAL: verification of first header "
193 "failed\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200194#endif
195 return( 1 );
196 }
197
198 if( heap.first->prev != NULL )
199 {
200#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100201 polarssl_fprintf( stderr, "FATAL: verification failed: "
202 "first->prev != NULL\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200203#endif
204 return( 1 );
205 }
206
207 while( cur != NULL )
208 {
209 if( verify_header( cur ) != 0 )
210 {
211#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100212 polarssl_fprintf( stderr, "FATAL: verification of header "
213 "failed\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200214#endif
215 return( 1 );
216 }
217
218 if( cur->prev != prv )
219 {
220#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100221 polarssl_fprintf( stderr, "FATAL: verification failed: "
222 "cur->prev != prv\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200223#endif
224 return( 1 );
225 }
226
227 prv = cur;
228 cur = cur->next;
229 }
230
231 return( 0 );
232}
233
234static void *buffer_alloc_malloc( size_t len )
235{
Paul Bakker1ef120f2013-07-03 17:20:39 +0200236 memory_header *new, *cur = heap.first_free;
Paul Bakker6e339b52013-07-03 13:37:05 +0200237 unsigned char *p;
238#if defined(POLARSSL_MEMORY_BACKTRACE)
239 void *trace_buffer[MAX_BT];
240 size_t trace_cnt;
241#endif
242
243 if( heap.buf == NULL || heap.first == NULL )
244 return( NULL );
245
246 if( len % POLARSSL_MEMORY_ALIGN_MULTIPLE )
247 {
248 len -= len % POLARSSL_MEMORY_ALIGN_MULTIPLE;
249 len += POLARSSL_MEMORY_ALIGN_MULTIPLE;
250 }
251
252 // Find block that fits
253 //
254 while( cur != NULL )
255 {
Paul Bakker1ef120f2013-07-03 17:20:39 +0200256 if( cur->size >= len )
Paul Bakker6e339b52013-07-03 13:37:05 +0200257 break;
258
Paul Bakker1ef120f2013-07-03 17:20:39 +0200259 cur = cur->next_free;
Paul Bakker6e339b52013-07-03 13:37:05 +0200260 }
261
262 if( cur == NULL )
263 return( NULL );
264
Paul Bakker1ef120f2013-07-03 17:20:39 +0200265 if( cur->alloc != 0 )
266 {
267#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100268 polarssl_fprintf( stderr, "FATAL: block in free_list but allocated "
269 "data\n" );
Paul Bakker1ef120f2013-07-03 17:20:39 +0200270#endif
271 exit( 1 );
272 }
273
Paul Bakker891998e2013-07-03 14:45:05 +0200274#if defined(POLARSSL_MEMORY_DEBUG)
275 heap.malloc_count++;
276#endif
277
Paul Bakker6e339b52013-07-03 13:37:05 +0200278 // Found location, split block if > memory_header + 4 room left
279 //
280 if( cur->size - len < sizeof(memory_header) + POLARSSL_MEMORY_ALIGN_MULTIPLE )
281 {
282 cur->alloc = 1;
283
Paul Bakker1ef120f2013-07-03 17:20:39 +0200284 // Remove from free_list
285 //
286 if( cur->prev_free != NULL )
287 cur->prev_free->next_free = cur->next_free;
288 else
289 heap.first_free = cur->next_free;
290
291 if( cur->next_free != NULL )
292 cur->next_free->prev_free = cur->prev_free;
293
294 cur->prev_free = NULL;
295 cur->next_free = NULL;
296
Paul Bakker891998e2013-07-03 14:45:05 +0200297#if defined(POLARSSL_MEMORY_DEBUG)
298 heap.total_used += cur->size;
299 if( heap.total_used > heap.maximum_used)
300 heap.maximum_used = heap.total_used;
301#endif
Paul Bakker6e339b52013-07-03 13:37:05 +0200302#if defined(POLARSSL_MEMORY_BACKTRACE)
303 trace_cnt = backtrace( trace_buffer, MAX_BT );
304 cur->trace = backtrace_symbols( trace_buffer, trace_cnt );
305 cur->trace_count = trace_cnt;
306#endif
307
308 if( ( heap.verify & MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 )
309 exit( 1 );
310
311 return ( (unsigned char *) cur ) + sizeof(memory_header);
312 }
313
314 p = ( (unsigned char *) cur ) + sizeof(memory_header) + len;
315 new = (memory_header *) p;
316
317 new->size = cur->size - len - sizeof(memory_header);
318 new->alloc = 0;
319 new->prev = cur;
320 new->next = cur->next;
321#if defined(POLARSSL_MEMORY_BACKTRACE)
322 new->trace = NULL;
323 new->trace_count = 0;
324#endif
325 new->magic1 = MAGIC1;
326 new->magic2 = MAGIC2;
327
328 if( new->next != NULL )
329 new->next->prev = new;
330
Paul Bakker1ef120f2013-07-03 17:20:39 +0200331 // Replace cur with new in free_list
332 //
333 new->prev_free = cur->prev_free;
334 new->next_free = cur->next_free;
335 if( new->prev_free != NULL )
336 new->prev_free->next_free = new;
337 else
338 heap.first_free = new;
339
340 if( new->next_free != NULL )
341 new->next_free->prev_free = new;
342
Paul Bakker6e339b52013-07-03 13:37:05 +0200343 cur->alloc = 1;
344 cur->size = len;
345 cur->next = new;
Paul Bakker1ef120f2013-07-03 17:20:39 +0200346 cur->prev_free = NULL;
347 cur->next_free = NULL;
Paul Bakker6e339b52013-07-03 13:37:05 +0200348
Paul Bakker891998e2013-07-03 14:45:05 +0200349#if defined(POLARSSL_MEMORY_DEBUG)
350 heap.header_count++;
Manuel Pégourié-Gonnard70896a02013-12-30 18:06:41 +0100351 if( heap.header_count > heap.maximum_header_count )
352 heap.maximum_header_count = heap.header_count;
Paul Bakker891998e2013-07-03 14:45:05 +0200353 heap.total_used += cur->size;
354 if( heap.total_used > heap.maximum_used)
355 heap.maximum_used = heap.total_used;
356#endif
Paul Bakker6e339b52013-07-03 13:37:05 +0200357#if defined(POLARSSL_MEMORY_BACKTRACE)
358 trace_cnt = backtrace( trace_buffer, MAX_BT );
359 cur->trace = backtrace_symbols( trace_buffer, trace_cnt );
360 cur->trace_count = trace_cnt;
361#endif
362
363 if( ( heap.verify & MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 )
364 exit( 1 );
365
366 return ( (unsigned char *) cur ) + sizeof(memory_header);
367}
368
369static void buffer_alloc_free( void *ptr )
370{
Paul Bakker1ef120f2013-07-03 17:20:39 +0200371 memory_header *hdr, *old = NULL;
Paul Bakker6e339b52013-07-03 13:37:05 +0200372 unsigned char *p = (unsigned char *) ptr;
373
Paul Bakker6e339b52013-07-03 13:37:05 +0200374 if( ptr == NULL || heap.buf == NULL || heap.first == NULL )
375 return;
376
377 if( p < heap.buf || p > heap.buf + heap.len )
378 {
379#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100380 polarssl_fprintf( stderr, "FATAL: polarssl_free() outside of managed "
381 "space\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200382#endif
Paul Bakker41350a92013-07-03 15:33:47 +0200383 exit( 1 );
Paul Bakker6e339b52013-07-03 13:37:05 +0200384 }
385
386 p -= sizeof(memory_header);
387 hdr = (memory_header *) p;
388
389 if( verify_header( hdr ) != 0 )
390 exit( 1 );
391
392 if( hdr->alloc != 1 )
393 {
394#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker7dc4c442014-02-01 22:50:26 +0100395 polarssl_fprintf( stderr, "FATAL: polarssl_free() on unallocated "
396 "data\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200397#endif
Paul Bakker41350a92013-07-03 15:33:47 +0200398 exit( 1 );
Paul Bakker6e339b52013-07-03 13:37:05 +0200399 }
400
401 hdr->alloc = 0;
402
Paul Bakker891998e2013-07-03 14:45:05 +0200403#if defined(POLARSSL_MEMORY_DEBUG)
404 heap.free_count++;
405 heap.total_used -= hdr->size;
406#endif
407
Paul Bakker6e339b52013-07-03 13:37:05 +0200408 // Regroup with block before
409 //
410 if( hdr->prev != NULL && hdr->prev->alloc == 0 )
411 {
Paul Bakker891998e2013-07-03 14:45:05 +0200412#if defined(POLARSSL_MEMORY_DEBUG)
413 heap.header_count--;
414#endif
Paul Bakker6e339b52013-07-03 13:37:05 +0200415 hdr->prev->size += sizeof(memory_header) + hdr->size;
416 hdr->prev->next = hdr->next;
417 old = hdr;
418 hdr = hdr->prev;
419
420 if( hdr->next != NULL )
421 hdr->next->prev = hdr;
422
423#if defined(POLARSSL_MEMORY_BACKTRACE)
424 free( old->trace );
425#endif
426 memset( old, 0, sizeof(memory_header) );
427 }
428
429 // Regroup with block after
430 //
431 if( hdr->next != NULL && hdr->next->alloc == 0 )
432 {
Paul Bakker891998e2013-07-03 14:45:05 +0200433#if defined(POLARSSL_MEMORY_DEBUG)
434 heap.header_count--;
435#endif
Paul Bakker6e339b52013-07-03 13:37:05 +0200436 hdr->size += sizeof(memory_header) + hdr->next->size;
437 old = hdr->next;
438 hdr->next = hdr->next->next;
439
Paul Bakker1ef120f2013-07-03 17:20:39 +0200440 if( hdr->prev_free != NULL || hdr->next_free != NULL )
441 {
442 if( hdr->prev_free != NULL )
443 hdr->prev_free->next_free = hdr->next_free;
444 else
445 heap.first_free = hdr->next_free;
446
447 if( hdr->next_free != NULL )
448 hdr->next_free->prev_free = hdr->prev_free;
449 }
450
451 hdr->prev_free = old->prev_free;
452 hdr->next_free = old->next_free;
453
454 if( hdr->prev_free != NULL )
455 hdr->prev_free->next_free = hdr;
456 else
457 heap.first_free = hdr;
458
459 if( hdr->next_free != NULL )
460 hdr->next_free->prev_free = hdr;
461
Paul Bakker6e339b52013-07-03 13:37:05 +0200462 if( hdr->next != NULL )
463 hdr->next->prev = hdr;
464
465#if defined(POLARSSL_MEMORY_BACKTRACE)
466 free( old->trace );
467#endif
468 memset( old, 0, sizeof(memory_header) );
469 }
470
Paul Bakker1ef120f2013-07-03 17:20:39 +0200471 // Prepend to free_list if we have not merged
472 // (Does not have to stay in same order as prev / next list)
473 //
474 if( old == NULL )
475 {
476 hdr->next_free = heap.first_free;
477 heap.first_free->prev_free = hdr;
478 heap.first_free = hdr;
479 }
480
Paul Bakker6e339b52013-07-03 13:37:05 +0200481#if defined(POLARSSL_MEMORY_BACKTRACE)
482 hdr->trace = NULL;
483 hdr->trace_count = 0;
484#endif
485
486 if( ( heap.verify & MEMORY_VERIFY_FREE ) && verify_chain() != 0 )
487 exit( 1 );
488}
489
Paul Bakkerbf796ac2013-09-28 11:06:38 +0200490void memory_buffer_set_verify( int verify )
491{
492 heap.verify = verify;
493}
494
Paul Bakker6e339b52013-07-03 13:37:05 +0200495int memory_buffer_alloc_verify()
496{
497 return verify_chain();
498}
499
500#if defined(POLARSSL_MEMORY_DEBUG)
501void memory_buffer_alloc_status()
502{
Paul Bakker7dc4c442014-02-01 22:50:26 +0100503 polarssl_fprintf( stderr,
504 "Current use: %u blocks / %u bytes, max: %u blocks / "
505 "%u bytes (total %u bytes), malloc / free: %u / %u\n",
506 heap.header_count, heap.total_used,
507 heap.maximum_header_count, heap.maximum_used,
508 heap.maximum_header_count * sizeof( memory_header )
509 + heap.maximum_used,
510 heap.malloc_count, heap.free_count );
Paul Bakker891998e2013-07-03 14:45:05 +0200511
Paul Bakker6e339b52013-07-03 13:37:05 +0200512 if( heap.first->next == NULL )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100513 polarssl_fprintf( stderr, "All memory de-allocated in stack buffer\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200514 else
515 {
Paul Bakker7dc4c442014-02-01 22:50:26 +0100516 polarssl_fprintf( stderr, "Memory currently allocated:\n" );
Paul Bakker6e339b52013-07-03 13:37:05 +0200517 debug_chain();
518 }
519}
520#endif /* POLARSSL_MEMORY_BUFFER_ALLOC_DEBUG */
521
Paul Bakker1337aff2013-09-29 14:45:34 +0200522#if defined(POLARSSL_THREADING_C)
523static void *buffer_alloc_malloc_mutexed( size_t len )
524{
525 void *buf;
526 polarssl_mutex_lock( &heap.mutex );
527 buf = buffer_alloc_malloc( len );
528 polarssl_mutex_unlock( &heap.mutex );
529 return( buf );
530}
531
532static void buffer_alloc_free_mutexed( void *ptr )
533{
534 polarssl_mutex_lock( &heap.mutex );
535 buffer_alloc_free( ptr );
536 polarssl_mutex_unlock( &heap.mutex );
537}
538#endif
539
Paul Bakker6e339b52013-07-03 13:37:05 +0200540int memory_buffer_alloc_init( unsigned char *buf, size_t len )
541{
Paul Bakker6e339b52013-07-03 13:37:05 +0200542 memset( &heap, 0, sizeof(buffer_alloc_ctx) );
543 memset( buf, 0, len );
544
Paul Bakker1337aff2013-09-29 14:45:34 +0200545#if defined(POLARSSL_THREADING_C)
546 polarssl_mutex_init( &heap.mutex );
547 polarssl_malloc = buffer_alloc_malloc_mutexed;
548 polarssl_free = buffer_alloc_free_mutexed;
549#else
550 polarssl_malloc = buffer_alloc_malloc;
551 polarssl_free = buffer_alloc_free;
552#endif
553
Paul Bakker6e339b52013-07-03 13:37:05 +0200554 heap.buf = buf;
555 heap.len = len;
556
557 heap.first = (memory_header *) buf;
558 heap.first->size = len - sizeof(memory_header);
559 heap.first->magic1 = MAGIC1;
560 heap.first->magic2 = MAGIC2;
Paul Bakker1ef120f2013-07-03 17:20:39 +0200561 heap.first_free = heap.first;
Paul Bakker6e339b52013-07-03 13:37:05 +0200562 return( 0 );
563}
564
Paul Bakker1337aff2013-09-29 14:45:34 +0200565void memory_buffer_alloc_free()
566{
567#if defined(POLARSSL_THREADING_C)
568 polarssl_mutex_free( &heap.mutex );
569#endif
570 memset( &heap, 0, sizeof(buffer_alloc_ctx) );
571}
572
Paul Bakker6e339b52013-07-03 13:37:05 +0200573#endif /* POLARSSL_MEMORY_C && POLARSSL_MEMORY_BUFFER_ALLOC_C */