From 1337affc914d87e305fbec144643bcf73c7a48cc Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Sun, 29 Sep 2013 14:45:34 +0200 Subject: [PATCH] Buffer allocator threading support --- include/polarssl/memory.h | 7 +++++ library/memory_buffer_alloc.c | 46 ++++++++++++++++++++++++++++++--- programs/ssl/ssl_server2.c | 5 +++- programs/test/selftest.c | 3 +++ tests/suites/main_test.function | 9 ++++--- 5 files changed, 62 insertions(+), 8 deletions(-) diff --git a/include/polarssl/memory.h b/include/polarssl/memory.h index 567a64a16..6a3dab94b 100644 --- a/include/polarssl/memory.h +++ b/include/polarssl/memory.h @@ -71,6 +71,8 @@ int memory_set_own( void * (*malloc_func)( size_t ), * presented buffer and does not call malloc() and free(). * It sets the global polarssl_malloc() and polarssl_free() pointers * to its own functions. + * (Provided polarssl_malloc() and polarssl_free() are thread-safe if + * POLARSSL_THREADING_C is defined) * * \note This code is not optimized and provides a straight-forward * implementation of a stack-based memory allocator. @@ -82,6 +84,11 @@ int memory_set_own( void * (*malloc_func)( size_t ), */ int memory_buffer_alloc_init( unsigned char *buf, size_t len ); +/** + * \brief Free the mutex for thread-safety and clear remaining memory + */ +void memory_buffer_alloc_free(); + /** * \brief Determine when the allocator should automatically verify the state * of the entire chain of headers / meta-data. diff --git a/library/memory_buffer_alloc.c b/library/memory_buffer_alloc.c index de2811fb2..7ec6498de 100644 --- a/library/memory_buffer_alloc.c +++ b/library/memory_buffer_alloc.c @@ -38,6 +38,10 @@ #endif #endif +#if defined(POLARSSL_THREADING_C) +#include "polarssl/threading.h" +#endif + #define MAGIC1 0xFF00AA55 #define MAGIC2 0xEE119966 #define MAX_BT 20 @@ -74,6 +78,9 @@ typedef struct size_t maximum_used; size_t header_count; #endif +#if defined(POLARSSL_THREADING_C) + threading_mutex_t mutex; +#endif } buffer_alloc_ctx; @@ -349,7 +356,6 @@ static void buffer_alloc_free( void *ptr ) memory_header *hdr, *old = NULL; unsigned char *p = (unsigned char *) ptr; - if( ptr == NULL || heap.buf == NULL || heap.first == NULL ) return; @@ -492,14 +498,38 @@ void memory_buffer_alloc_status() } #endif /* POLARSSL_MEMORY_BUFFER_ALLOC_DEBUG */ +#if defined(POLARSSL_THREADING_C) +static void *buffer_alloc_malloc_mutexed( size_t len ) +{ + void *buf; + polarssl_mutex_lock( &heap.mutex ); + buf = buffer_alloc_malloc( len ); + polarssl_mutex_unlock( &heap.mutex ); + return( buf ); +} + +static void buffer_alloc_free_mutexed( void *ptr ) +{ + polarssl_mutex_lock( &heap.mutex ); + buffer_alloc_free( ptr ); + polarssl_mutex_unlock( &heap.mutex ); +} +#endif + int memory_buffer_alloc_init( unsigned char *buf, size_t len ) { - polarssl_malloc = buffer_alloc_malloc; - polarssl_free = buffer_alloc_free; - memset( &heap, 0, sizeof(buffer_alloc_ctx) ); memset( buf, 0, len ); +#if defined(POLARSSL_THREADING_C) + polarssl_mutex_init( &heap.mutex ); + polarssl_malloc = buffer_alloc_malloc_mutexed; + polarssl_free = buffer_alloc_free_mutexed; +#else + polarssl_malloc = buffer_alloc_malloc; + polarssl_free = buffer_alloc_free; +#endif + heap.buf = buf; heap.len = len; @@ -511,4 +541,12 @@ int memory_buffer_alloc_init( unsigned char *buf, size_t len ) return( 0 ); } +void memory_buffer_alloc_free() +{ +#if defined(POLARSSL_THREADING_C) + polarssl_mutex_free( &heap.mutex ); +#endif + memset( &heap, 0, sizeof(buffer_alloc_ctx) ); +} + #endif /* POLARSSL_MEMORY_C && POLARSSL_MEMORY_BUFFER_ALLOC_C */ diff --git a/programs/ssl/ssl_server2.c b/programs/ssl/ssl_server2.c index a6ff57fea..43d7d79b7 100644 --- a/programs/ssl/ssl_server2.c +++ b/programs/ssl/ssl_server2.c @@ -969,9 +969,12 @@ exit: ssl_cache_free( &cache ); #endif -#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && defined(POLARSSL_MEMORY_DEBUG) +#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) +#if defined(POLARSSL_MEMORY_DEBUG) memory_buffer_alloc_status(); #endif + memory_buffer_alloc_free(); +#endif #if defined(_WIN32) printf( " + Press Enter to exit this program.\n" ); diff --git a/programs/test/selftest.c b/programs/test/selftest.c index 246276500..fb9a7cc72 100644 --- a/programs/test/selftest.c +++ b/programs/test/selftest.c @@ -190,6 +190,9 @@ int main( int argc, char *argv[] ) fflush( stdout ); getchar(); #endif } +#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) + memory_buffer_alloc_free(); +#endif return( ret ); } diff --git a/tests/suites/main_test.function b/tests/suites/main_test.function index d5aa3862c..c64d9be8a 100644 --- a/tests/suites/main_test.function +++ b/tests/suites/main_test.function @@ -202,8 +202,8 @@ int main() char *params[50]; #if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) - unsigned char buf[1000000]; - memory_buffer_alloc_init( buf, sizeof(buf) ); + unsigned char alloc_buf[1000000]; + memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) ); #endif file = fopen( filename, "r" ); @@ -288,9 +288,12 @@ int main() fprintf( stdout, " (%d / %d tests (%d skipped))\n", total_tests - total_errors, total_tests, total_skipped ); -#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && defined(POLARSSL_MEMORY_DEBUG) +#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) +#if defined(POLARSSL_MEMORY_DEBUG) memory_buffer_alloc_status(); #endif + memory_buffer_alloc_free(); +#endif return( total_errors != 0 ); }