diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-01-03 17:07:14 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-01-07 15:07:39 +0100 |
commit | b41f2e226b4b76961a65d6e4cffafb76217c6b82 (patch) | |
tree | 567590873909962b55cb3e371a974549aa979a24 /cpukit | |
parent | bsps: Fix rtems_interrupt_server_handler_remove() (diff) | |
download | rtems-b41f2e226b4b76961a65d6e4cffafb76217c6b82.tar.bz2 |
score: Fix _Objects_Shrink_information()
The chain iteration was wrong. The chain tail is not an object.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/score/src/objectshrinkinformation.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/cpukit/score/src/objectshrinkinformation.c b/cpukit/score/src/objectshrinkinformation.c index de32f24d8d..466a85df74 100644 --- a/cpukit/score/src/objectshrinkinformation.c +++ b/cpukit/score/src/objectshrinkinformation.c @@ -34,12 +34,9 @@ void _Objects_Shrink_information( Objects_Information *information ) { - Objects_Control *the_object; - Objects_Control *extract_me; uint32_t block_count; uint32_t block; uint32_t index_base; - uint32_t index; /* * Search the list to find block or chunk with all objects inactive. @@ -52,25 +49,24 @@ void _Objects_Shrink_information( for ( block = 0; block < block_count; block++ ) { if ( information->inactive_per_block[ block ] == information->allocation_size ) { + Chain_Node *node = _Chain_First( &information->Inactive ); + const Chain_Node *tail = _Chain_Immutable_tail( &information->Inactive ); + uint32_t index_end = index_base + information->allocation_size; - /* - * Assume the Inactive chain is never empty at this point - */ - the_object = (Objects_Control *) _Chain_First( &information->Inactive ); + while ( node != tail ) { + Objects_Control *object = (Objects_Control *) node; + uint32_t index = _Objects_Get_index( object->id ); + + /* + * Get the next node before the node is extracted + */ + node = _Chain_Next( node ); + + if ( index >= index_base && index < index_end ) { + _Chain_Extract( &object->Node ); + } + } - do { - index = _Objects_Get_index( the_object->id ); - /* - * Get the next node before the node is extracted - */ - extract_me = the_object; - the_object = (Objects_Control *) the_object->Node.next; - if ((index >= index_base) && - (index < (index_base + information->allocation_size))) { - _Chain_Extract( &extract_me->Node ); - } - } - while ( the_object ); /* * Free the memory and reset the structures in the object' information */ |