mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 06:46:37 +08:00
@@ -103,6 +103,24 @@ RTEMS_INLINE_ROUTINE void *_Freechain_Pop( Freechain_Control *freechain )
|
||||
return _Chain_Get_first_unprotected( &freechain->Free );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Extend the freechain with new nodes.
|
||||
*
|
||||
* @param freechain The freechain control.
|
||||
* @param allocator The allocator function.
|
||||
* @param number_nodes_to_extend The number of nodes to extend.
|
||||
* @param node_size The node size.
|
||||
*
|
||||
* @retval NULL The extend operation failed.
|
||||
* @retval nodes Pointer to the new nodes.
|
||||
*/
|
||||
void *_Freechain_Extend(
|
||||
Freechain_Control *freechain,
|
||||
Freechain_Allocator allocator,
|
||||
size_t number_nodes_to_extend,
|
||||
size_t node_size
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Gets a node from the freechain.
|
||||
*
|
||||
|
||||
@@ -21,6 +21,28 @@
|
||||
#include <rtems/score/freechain.h>
|
||||
#include <rtems/score/assert.h>
|
||||
|
||||
void *_Freechain_Extend(
|
||||
Freechain_Control *freechain,
|
||||
Freechain_Allocator allocator,
|
||||
size_t number_nodes_to_extend,
|
||||
size_t node_size
|
||||
)
|
||||
{
|
||||
void *starting_address;
|
||||
|
||||
starting_address = ( *allocator )( number_nodes_to_extend * node_size );
|
||||
number_nodes_to_extend *= ( starting_address != NULL );
|
||||
|
||||
_Chain_Initialize(
|
||||
&freechain->Free,
|
||||
starting_address,
|
||||
number_nodes_to_extend,
|
||||
node_size
|
||||
);
|
||||
|
||||
return starting_address;
|
||||
}
|
||||
|
||||
void *_Freechain_Get(
|
||||
Freechain_Control *freechain,
|
||||
Freechain_Allocator allocator,
|
||||
@@ -31,14 +53,9 @@ void *_Freechain_Get(
|
||||
_Assert( node_size >= sizeof( Chain_Node ) );
|
||||
|
||||
if ( _Chain_Is_empty( &freechain->Free ) && number_nodes_to_extend > 0 ) {
|
||||
void *starting_address;
|
||||
|
||||
starting_address = ( *allocator )( number_nodes_to_extend * node_size );
|
||||
number_nodes_to_extend *= ( starting_address != NULL );
|
||||
|
||||
_Chain_Initialize(
|
||||
&freechain->Free,
|
||||
starting_address,
|
||||
_Freechain_Extend(
|
||||
freechain,
|
||||
allocator,
|
||||
number_nodes_to_extend,
|
||||
node_size
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user