2003-10-22 Joel Sherrill <joel@OARcorp.com>

PR 511/filesystem
	* src/malloc.c: Add deferred free and protect against C Program Heap
	operations while in a dispatch disable critical section or ISR.
This commit is contained in:
Joel Sherrill
2003-10-22 16:54:15 +00:00
parent 5150ab0448
commit 49f466c75d
2 changed files with 54 additions and 0 deletions

View File

@@ -1,3 +1,9 @@
2003-10-22 Joel Sherrill <joel@OARcorp.com>
PR 511/filesystem
* src/malloc.c: Add deferred free and protect against C Program Heap
operations while in a dispatch disable critical section or ISR.
2003-10-02 Phil Torre <ptorre@zetron.com> 2003-10-02 Phil Torre <ptorre@zetron.com>
PR 504/rtems PR 504/rtems

View File

@@ -33,6 +33,10 @@
#include <unistd.h> /* sbrk(2) */ #include <unistd.h> /* sbrk(2) */
#include <chain.h>
Chain_Control RTEMS_Malloc_GC_list;
rtems_id RTEMS_Malloc_Heap; rtems_id RTEMS_Malloc_Heap;
size_t RTEMS_Malloc_Sbrk_amount; size_t RTEMS_Malloc_Sbrk_amount;
@@ -70,6 +74,11 @@ void RTEMS_Malloc_Initialize(
rtems_unsigned32 old_address; rtems_unsigned32 old_address;
rtems_unsigned32 u32_address; rtems_unsigned32 u32_address;
/*
* Initialize the garbage collection list to start with nothing on it.
*/
Chain_Initialize_empty(&RTEMS_Malloc_GC_list);
/* /*
* If the starting address is 0 then we are to attempt to * If the starting address is 0 then we are to attempt to
* get length worth of memory using sbrk. Make sure we * get length worth of memory using sbrk. Make sure we
@@ -150,12 +159,29 @@ void *malloc(
rtems_unsigned32 the_size; rtems_unsigned32 the_size;
rtems_unsigned32 sbrk_amount; rtems_unsigned32 sbrk_amount;
rtems_status_code status; rtems_status_code status;
Chain_Node *to_be_freed;
MSBUMP(malloc_calls, 1); MSBUMP(malloc_calls, 1);
if ( !size ) if ( !size )
return (void *) 0; return (void *) 0;
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_Thread_Dispatch_disable_level > 0)
return (void *) 0;
if (_ISR_Nest_level > 0)
return (void *) 0;
/*
* If some free's have been deferred, then do them now.
*/
while ((to_be_freed = Chain_Get(&RTEMS_Malloc_GC_list)) != NULL)
free(to_be_freed);
/* /*
* Try to give a segment in the current region if there is not * Try to give a segment in the current region if there is not
* enough space then try to grow the region using rtems_region_extend(). * enough space then try to grow the region using rtems_region_extend().
@@ -267,6 +293,19 @@ void *realloc(
MSBUMP(realloc_calls, 1); MSBUMP(realloc_calls, 1);
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_Thread_Dispatch_disable_level > 0)
return (void *) 0;
if (_ISR_Nest_level > 0)
return (void *) 0;
/*
* Continue with calloc().
*/
if ( !ptr ) if ( !ptr )
return malloc( size ); return malloc( size );
@@ -313,6 +352,15 @@ void free(
if ( !ptr ) if ( !ptr )
return; return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ((_Thread_Dispatch_disable_level > 0) || (_ISR_Nest_level > 0)) {
Chain_Append(&RTEMS_Malloc_GC_list, (Chain_Node *)ptr);
return;
}
#ifdef MALLOC_STATS #ifdef MALLOC_STATS
{ {
unsigned32 size; unsigned32 size;