Only include the deferred free support if free() is actually used by the application. --- cpukit/libcsupport/src/free.c | 43 ++++++++++++++++++++++++++++++++ cpukit/libcsupport/src/malloc_deferred.c | 40 +++-------------------------- cpukit/libcsupport/src/malloc_p.h | 2 -- cpukit/libcsupport/src/realloc.c | 8 ++++++ 4 files changed, 54 insertions(+), 39 deletions(-)
diff --git a/cpukit/libcsupport/src/free.c b/cpukit/libcsupport/src/free.c index d8dd2bdb0e..b5e4214449 100644 --- a/cpukit/libcsupport/src/free.c +++ b/cpukit/libcsupport/src/free.c @@ -22,6 +22,49 @@ #include "malloc_p.h" #include <stdlib.h> +#include <rtems/chain.h> + +static RTEMS_CHAIN_DEFINE_EMPTY( _Malloc_GC_list ); + +RTEMS_INTERRUPT_LOCK_DEFINE( static, _Malloc_GC_lock, "Malloc GC" ) + +static void *_Malloc_Get_deferred_free( void ) +{ + rtems_interrupt_lock_context lock_context; + void *p; + + rtems_interrupt_lock_acquire( &_Malloc_GC_lock, &lock_context ); + p = rtems_chain_get_unprotected( &_Malloc_GC_list ); + rtems_interrupt_lock_release( &_Malloc_GC_lock, &lock_context ); + + return p; +} + +void _Malloc_Process_deferred_frees( void ) +{ + rtems_chain_node *to_be_freed; + + /* + * If some free's have been deferred, then do them now. + */ + while ( ( to_be_freed = _Malloc_Get_deferred_free() ) != NULL ) { + free( to_be_freed ); + } +} + +static void _Malloc_Deferred_free( void *p ) +{ + rtems_interrupt_lock_context lock_context; + rtems_chain_node *node; + + node = (rtems_chain_node *) p; + + rtems_interrupt_lock_acquire( &_Malloc_GC_lock, &lock_context ); + rtems_chain_initialize_node( node ); + rtems_chain_append_unprotected( &_Malloc_GC_list, node ); + rtems_interrupt_lock_release( &_Malloc_GC_lock, &lock_context ); +} + void free( void *ptr ) diff --git a/cpukit/libcsupport/src/malloc_deferred.c b/cpukit/libcsupport/src/malloc_deferred.c index ccb8dc3b8b..13b3266062 100644 --- a/cpukit/libcsupport/src/malloc_deferred.c +++ b/cpukit/libcsupport/src/malloc_deferred.c @@ -27,14 +27,9 @@ #include "malloc_p.h" -#include <rtems/chain.h> #include <rtems/score/sysstate.h> #include <rtems/score/threaddispatch.h> -static RTEMS_CHAIN_DEFINE_EMPTY( _Malloc_GC_list ); - -RTEMS_INTERRUPT_LOCK_DEFINE( static, _Malloc_GC_lock, "Malloc GC" ) - Malloc_System_state _Malloc_System_state( void ) { System_state_Codes state = _System_state_Get(); @@ -52,28 +47,12 @@ Malloc_System_state _Malloc_System_state( void ) } } -static void *_Malloc_Get_deferred_free( void ) -{ - rtems_interrupt_lock_context lock_context; - void *p; - - rtems_interrupt_lock_acquire( &_Malloc_GC_lock, &lock_context ); - p = rtems_chain_get_unprotected( &_Malloc_GC_list ); - rtems_interrupt_lock_release( &_Malloc_GC_lock, &lock_context ); - - return p; -} - -void _Malloc_Process_deferred_frees( void ) +RTEMS_WEAK void _Malloc_Process_deferred_frees( void ) { - rtems_chain_node *to_be_freed; - /* - * If some free's have been deferred, then do them now. + * Do nothing by default. If free() is used by the application, then a + * strong implementation of this function will be provided. */ - while ( ( to_be_freed = _Malloc_Get_deferred_free() ) != NULL ) { - free( to_be_freed ); - } } void *rtems_heap_allocate_aligned_with_boundary( @@ -125,19 +104,6 @@ void *rtems_heap_allocate_aligned_with_boundary( return p; } -void _Malloc_Deferred_free( void *p ) -{ - rtems_interrupt_lock_context lock_context; - rtems_chain_node *node; - - node = (rtems_chain_node *) p; - - rtems_interrupt_lock_acquire( &_Malloc_GC_lock, &lock_context ); - rtems_chain_initialize_node( node ); - rtems_chain_append_unprotected( &_Malloc_GC_list, node ); - rtems_interrupt_lock_release( &_Malloc_GC_lock, &lock_context ); -} - void *rtems_malloc( size_t size ) { if ( size == 0 ) { diff --git a/cpukit/libcsupport/src/malloc_p.h b/cpukit/libcsupport/src/malloc_p.h index f3715a9966..cb26050ff1 100644 --- a/cpukit/libcsupport/src/malloc_p.h +++ b/cpukit/libcsupport/src/malloc_p.h @@ -25,8 +25,6 @@ typedef enum { Malloc_System_state _Malloc_System_state( void ); -void _Malloc_Deferred_free( void * ); - void _Malloc_Process_deferred_frees( void ); #ifdef __cplusplus diff --git a/cpukit/libcsupport/src/realloc.c b/cpukit/libcsupport/src/realloc.c index 7912780c09..9927b3b903 100644 --- a/cpukit/libcsupport/src/realloc.c +++ b/cpukit/libcsupport/src/realloc.c @@ -25,6 +25,14 @@ #include "malloc_p.h" +RTEMS_WEAK void _Malloc_Process_deferred_frees( void ) +{ + /* + * Do nothing by default. If free() is used by the application, then a + * strong implementation of this function will be provided. + */ +} + static void *new_alloc( void *old_ptr, size_t new_size, size_t old_size ) { void *new_ptr; -- 2.16.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel