mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-26 10:15:38 +01:00
Buffer allocator threading support
This commit is contained in:
parent
f4e7dc50ea
commit
1337affc91
@ -71,6 +71,8 @@ int memory_set_own( void * (*malloc_func)( size_t ),
|
|||||||
* presented buffer and does not call malloc() and free().
|
* presented buffer and does not call malloc() and free().
|
||||||
* It sets the global polarssl_malloc() and polarssl_free() pointers
|
* It sets the global polarssl_malloc() and polarssl_free() pointers
|
||||||
* to its own functions.
|
* 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
|
* \note This code is not optimized and provides a straight-forward
|
||||||
* implementation of a stack-based memory allocator.
|
* 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 );
|
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
|
* \brief Determine when the allocator should automatically verify the state
|
||||||
* of the entire chain of headers / meta-data.
|
* of the entire chain of headers / meta-data.
|
||||||
|
@ -38,6 +38,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(POLARSSL_THREADING_C)
|
||||||
|
#include "polarssl/threading.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAGIC1 0xFF00AA55
|
#define MAGIC1 0xFF00AA55
|
||||||
#define MAGIC2 0xEE119966
|
#define MAGIC2 0xEE119966
|
||||||
#define MAX_BT 20
|
#define MAX_BT 20
|
||||||
@ -74,6 +78,9 @@ typedef struct
|
|||||||
size_t maximum_used;
|
size_t maximum_used;
|
||||||
size_t header_count;
|
size_t header_count;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(POLARSSL_THREADING_C)
|
||||||
|
threading_mutex_t mutex;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
buffer_alloc_ctx;
|
buffer_alloc_ctx;
|
||||||
|
|
||||||
@ -349,7 +356,6 @@ static void buffer_alloc_free( void *ptr )
|
|||||||
memory_header *hdr, *old = NULL;
|
memory_header *hdr, *old = NULL;
|
||||||
unsigned char *p = (unsigned char *) ptr;
|
unsigned char *p = (unsigned char *) ptr;
|
||||||
|
|
||||||
|
|
||||||
if( ptr == NULL || heap.buf == NULL || heap.first == NULL )
|
if( ptr == NULL || heap.buf == NULL || heap.first == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -492,14 +498,38 @@ void memory_buffer_alloc_status()
|
|||||||
}
|
}
|
||||||
#endif /* POLARSSL_MEMORY_BUFFER_ALLOC_DEBUG */
|
#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 )
|
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( &heap, 0, sizeof(buffer_alloc_ctx) );
|
||||||
memset( buf, 0, len );
|
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.buf = buf;
|
||||||
heap.len = len;
|
heap.len = len;
|
||||||
|
|
||||||
@ -511,4 +541,12 @@ int memory_buffer_alloc_init( unsigned char *buf, size_t len )
|
|||||||
return( 0 );
|
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 */
|
#endif /* POLARSSL_MEMORY_C && POLARSSL_MEMORY_BUFFER_ALLOC_C */
|
||||||
|
@ -969,9 +969,12 @@ exit:
|
|||||||
ssl_cache_free( &cache );
|
ssl_cache_free( &cache );
|
||||||
#endif
|
#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();
|
memory_buffer_alloc_status();
|
||||||
#endif
|
#endif
|
||||||
|
memory_buffer_alloc_free();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
printf( " + Press Enter to exit this program.\n" );
|
printf( " + Press Enter to exit this program.\n" );
|
||||||
|
@ -190,6 +190,9 @@ int main( int argc, char *argv[] )
|
|||||||
fflush( stdout ); getchar();
|
fflush( stdout ); getchar();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
|
||||||
|
memory_buffer_alloc_free();
|
||||||
|
#endif
|
||||||
|
|
||||||
return( ret );
|
return( ret );
|
||||||
}
|
}
|
||||||
|
@ -202,8 +202,8 @@ int main()
|
|||||||
char *params[50];
|
char *params[50];
|
||||||
|
|
||||||
#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
|
#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
|
||||||
unsigned char buf[1000000];
|
unsigned char alloc_buf[1000000];
|
||||||
memory_buffer_alloc_init( buf, sizeof(buf) );
|
memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
file = fopen( filename, "r" );
|
file = fopen( filename, "r" );
|
||||||
@ -288,9 +288,12 @@ int main()
|
|||||||
fprintf( stdout, " (%d / %d tests (%d skipped))\n",
|
fprintf( stdout, " (%d / %d tests (%d skipped))\n",
|
||||||
total_tests - total_errors, total_tests, total_skipped );
|
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();
|
memory_buffer_alloc_status();
|
||||||
#endif
|
#endif
|
||||||
|
memory_buffer_alloc_free();
|
||||||
|
#endif
|
||||||
|
|
||||||
return( total_errors != 0 );
|
return( total_errors != 0 );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user