summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/rbtreenext.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/rbtreenext.c')
-rw-r--r--cpukit/score/src/rbtreenext.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/cpukit/score/src/rbtreenext.c b/cpukit/score/src/rbtreenext.c
new file mode 100644
index 0000000000..e79f175f35
--- /dev/null
+++ b/cpukit/score/src/rbtreenext.c
@@ -0,0 +1,80 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreRBTree
+ *
+ * @brief _RBTree_Next_unprotected() and _RBTree_Next() implementation.
+ */
+
+/*
+ * Copyright (c) 2012 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <rtems/score/rbtree.h>
+#include <rtems/score/isr.h>
+
+RBTree_Node *_RBTree_Next_unprotected(
+ const RBTree_Control *rbtree,
+ const RBTree_Node *node,
+ RBTree_Direction dir
+)
+{
+ RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
+ RBTree_Node *current = node->child [dir];
+ RBTree_Node *next = NULL;
+
+ if ( current != NULL ) {
+ next = current;
+ while ( (current = current->child [opp_dir]) != NULL ) {
+ next = current;
+ }
+ } else {
+ const RBTree_Node *null = (const RBTree_Node *) rbtree;
+ RBTree_Node *parent = node->parent;
+
+ if ( parent != null && node == parent->child [opp_dir] ) {
+ next = parent;
+ } else {
+ while ( parent != null && node == parent->child [dir] ) {
+ node = parent;
+ parent = node->parent;
+ }
+
+ if ( parent != null ) {
+ next = parent;
+ }
+ }
+ }
+
+ return next;
+}
+
+RBTree_Node *_RBTree_Next(
+ const RBTree_Control *rbtree,
+ const RBTree_Node *node,
+ RBTree_Direction dir
+)
+{
+ RBTree_Node *next;
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ next = _RBTree_Next_unprotected( rbtree, node, dir );
+ _ISR_Enable( level );
+
+ return next;
+}