diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-08-03 13:02:58 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-08-05 09:30:37 +0200 |
commit | 60fe374247eba365afb7f1a7055298af575434c7 (patch) | |
tree | c3323eaf5c6939c5c9e4fd64671a443dcd521150 /cpukit/sapi/src/rbheap.c | |
parent | Add and use RTEMS_CONTAINER_OF() (diff) | |
download | rtems-60fe374247eba365afb7f1a7055298af575434c7.tar.bz2 |
rbtree: Add and use RBTree_Compare_result
Diffstat (limited to '')
-rw-r--r-- | cpukit/sapi/src/rbheap.c | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/cpukit/sapi/src/rbheap.c b/cpukit/sapi/src/rbheap.c index 20338eb1bd..049a64d4df 100644 --- a/cpukit/sapi/src/rbheap.c +++ b/cpukit/sapi/src/rbheap.c @@ -46,12 +46,16 @@ static uintptr_t align_down(uintptr_t alignment, uintptr_t value) return value - excess; } -static int chunk_compare(const rtems_rbtree_node *a, const rtems_rbtree_node *b) +static rtems_rbtree_compare_result chunk_compare( + const rtems_rbtree_node *a, + const rtems_rbtree_node *b +) { const rtems_rbheap_chunk *left = rtems_rbheap_chunk_of_node(a); const rtems_rbheap_chunk *right = rtems_rbheap_chunk_of_node(b); - return (int) (left->begin - right->begin); + return (rtems_rbtree_compare_result) + ((left->begin >> 1) - (right->begin >> 1)); } static rtems_rbheap_chunk *get_chunk(rtems_rbheap_control *control) @@ -93,39 +97,43 @@ rtems_status_code rtems_rbheap_initialize( ) { rtems_status_code sc = RTEMS_SUCCESSFUL; + uintptr_t begin = (uintptr_t) area_begin; + uintptr_t end = begin + area_size; + uintptr_t aligned_begin; + uintptr_t aligned_end; - if (alignment > 0) { - uintptr_t begin = (uintptr_t) area_begin; - uintptr_t end = begin + area_size; - uintptr_t aligned_begin = align_up(alignment, begin); - uintptr_t aligned_end = align_down(alignment, end); - - if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) { - rtems_chain_control *free_chain = &control->free_chunk_chain; - rtems_rbtree_control *chunk_tree = &control->chunk_tree; - rtems_rbheap_chunk *first = NULL; - - rtems_chain_initialize_empty(free_chain); - rtems_chain_initialize_empty(&control->spare_descriptor_chain); - rtems_rbtree_initialize_empty(chunk_tree); - control->alignment = alignment; - control->handler_arg = handler_arg; - control->extend_descriptors = extend_descriptors; - - first = get_chunk(control); - if (first != NULL) { - first->begin = aligned_begin; - first->size = aligned_end - aligned_begin; - add_to_chain(free_chain, first); - insert_into_tree(chunk_tree, first); - } else { - sc = RTEMS_NO_MEMORY; - } + /* + * Ensure that the alignment is at least two, so that we can keep + * chunk_compare() that simple. + */ + alignment = alignment < 2 ? 2 : alignment; + + aligned_begin = align_up(alignment, begin); + aligned_end = align_down(alignment, end); + + if (begin < end && begin <= aligned_begin && aligned_begin < aligned_end) { + rtems_chain_control *free_chain = &control->free_chunk_chain; + rtems_rbtree_control *chunk_tree = &control->chunk_tree; + rtems_rbheap_chunk *first = NULL; + + rtems_chain_initialize_empty(free_chain); + rtems_chain_initialize_empty(&control->spare_descriptor_chain); + rtems_rbtree_initialize_empty(chunk_tree); + control->alignment = alignment; + control->handler_arg = handler_arg; + control->extend_descriptors = extend_descriptors; + + first = get_chunk(control); + if (first != NULL) { + first->begin = aligned_begin; + first->size = aligned_end - aligned_begin; + add_to_chain(free_chain, first); + insert_into_tree(chunk_tree, first); } else { - sc = RTEMS_INVALID_ADDRESS; + sc = RTEMS_NO_MEMORY; } } else { - sc = RTEMS_INVALID_NUMBER; + sc = RTEMS_INVALID_ADDRESS; } return sc; |