From 60fe374247eba365afb7f1a7055298af575434c7 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sun, 3 Aug 2014 13:02:58 +0200 Subject: rbtree: Add and use RBTree_Compare_result --- cpukit/sapi/src/rbheap.c | 70 +++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 31 deletions(-) (limited to 'cpukit/sapi/src/rbheap.c') 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; -- cgit v1.2.3