[PATCH 2/2] malloc: Make deferred free support optional
Sebastian Huber
sebastian.huber at embedded-brains.de
Thu Apr 9 04:50:23 UTC 2020
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
More information about the devel
mailing list