[rtems commit] rbtree: New function _RBTree_Iterate_unprotected()

Sebastian Huber sebh at rtems.org
Mon Jul 9 08:39:10 UTC 2012


Module:    rtems
Branch:    master
Commit:    8a83a863c0ead5d7bed50c16583100bc09396ed9
Changeset: http://git.rtems.org/rtems/commit/?id=8a83a863c0ead5d7bed50c16583100bc09396ed9

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Apr 10 10:54:22 2012 +0200

rbtree: New function _RBTree_Iterate_unprotected()

---

 cpukit/score/Makefile.am                  |    3 +-
 cpukit/score/include/rtems/score/rbtree.h |   33 +++++++++++++++++++++
 cpukit/score/src/rbtreeiterate.c          |   45 +++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 1 deletions(-)

diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 1c896e3..2f12905 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -265,7 +265,8 @@ libscore_a_SOURCES += src/pheapallocate.c \
 ## RBTREE_C_FILES
 libscore_a_SOURCES += src/rbtree.c \
     src/rbtreeextract.c src/rbtreefind.c src/rbtreefindheader.c \
-    src/rbtreeget.c src/rbtreeinsert.c src/rbtreepeek.c src/rbtreenext.c
+    src/rbtreeget.c src/rbtreeinsert.c src/rbtreepeek.c src/rbtreenext.c \
+    src/rbtreeiterate.c
 
 ## THREAD_C_FILES
 libscore_a_SOURCES += src/thread.c src/threadchangepriority.c \
diff --git a/cpukit/score/include/rtems/score/rbtree.h b/cpukit/score/include/rtems/score/rbtree.h
index b2e5776..2e9bb83 100644
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ b/cpukit/score/include/rtems/score/rbtree.h
@@ -348,6 +348,39 @@ RBTree_Node *_RBTree_Next(
   RBTree_Direction dir
 );
 
+/**
+ * @brief Red-black tree visitor.
+ *
+ * @param[in] node The node.
+ * @param[in] dir The direction.
+ * @param[in] visitor_arg The visitor argument.
+ *
+ * @retval true Stop the iteration.
+ * @retval false Continue the iteration.
+ *
+ * @see _RBTree_Iterate_unprotected().
+ */
+typedef bool (*RBTree_Visitor)(
+  const RBTree_Node *node,
+  RBTree_Direction dir,
+  void *visitor_arg
+);
+
+/**
+ * @brief Red-black tree iteration.
+ *
+ * @param[in] rbtree The red-black tree.
+ * @param[in] dir The direction.
+ * @param[in] visitor The visitor.
+ * @param[in] visitor_arg The visitor argument.
+ */
+void _RBTree_Iterate_unprotected(
+  const RBTree_Control *rbtree,
+  RBTree_Direction dir,
+  RBTree_Visitor visitor,
+  void *visitor_arg
+);
+
 #ifndef __RTEMS_APPLICATION__
 #include <rtems/score/rbtree.inl>
 #endif
diff --git a/cpukit/score/src/rbtreeiterate.c b/cpukit/score/src/rbtreeiterate.c
new file mode 100644
index 0000000..33f7e7d
--- /dev/null
+++ b/cpukit/score/src/rbtreeiterate.c
@@ -0,0 +1,45 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreRBTree
+ *
+ * @brief _RBTree_Iterate_unprotected() implementation.
+ */
+
+/*
+ * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at 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>
+
+void _RBTree_Iterate_unprotected(
+  const RBTree_Control *rbtree,
+  RBTree_Direction dir,
+  RBTree_Visitor visitor,
+  void *visitor_arg
+)
+{
+  RBTree_Direction opp_dir = _RBTree_Opposite_direction( dir );
+  const RBTree_Node *current = _RBTree_First( rbtree, opp_dir );
+  bool stop = false;
+
+  while ( !stop && current != NULL ) {
+    stop = (*visitor)( current, dir, visitor_arg );
+
+    current = _RBTree_Next_unprotected( rbtree, current, dir );
+  }
+}




More information about the vc mailing list