summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi/src/rbheap.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-08-03 13:02:58 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-08-05 09:30:37 +0200
commit60fe374247eba365afb7f1a7055298af575434c7 (patch)
treec3323eaf5c6939c5c9e4fd64671a443dcd521150 /cpukit/sapi/src/rbheap.c
parentAdd and use RTEMS_CONTAINER_OF() (diff)
downloadrtems-60fe374247eba365afb7f1a7055298af575434c7.tar.bz2
rbtree: Add and use RBTree_Compare_result
Diffstat (limited to 'cpukit/sapi/src/rbheap.c')
-rw-r--r--cpukit/sapi/src/rbheap.c70
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;