[PATCH 2/2] rbtree: Rename find header in find control

2014-07-26 Thread Sebastian Huber
Simplify _RBTree_Find_control().  Avoid superfluous NULL pointer checks.
---
 cpukit/sapi/include/rtems/rbtree.h   |  8 
 cpukit/score/include/rtems/score/rbtree.h| 29 ++--
 testsuites/sptests/sprbtree01/init.c |  9 ++---
 testsuites/sptests/sprbtree01/sprbtree01.scn |  2 +-
 4 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/cpukit/sapi/include/rtems/rbtree.h 
b/cpukit/sapi/include/rtems/rbtree.h
index dbc6d20..4e6d852 100644
--- a/cpukit/sapi/include/rtems/rbtree.h
+++ b/cpukit/sapi/include/rtems/rbtree.h
@@ -369,13 +369,13 @@ RTEMS_INLINE_ROUTINE rtems_rbtree_node 
*rtems_rbtree_peek_max(
 }
 
 /**
- * @copydoc _RBTree_Find_header()
+ * @copydoc _RBTree_Find_control()
  */
-RTEMS_INLINE_ROUTINE rtems_rbtree_control *rtems_rbtree_find_header(
-  rtems_rbtree_node *the_node
+RTEMS_INLINE_ROUTINE rtems_rbtree_control *rtems_rbtree_find_control(
+  const rtems_rbtree_node *the_node
 )
 {
-  return _RBTree_Find_header( the_node );
+  return _RBTree_Find_control( the_node );
 }
 
 /**
diff --git a/cpukit/score/include/rtems/score/rbtree.h 
b/cpukit/score/include/rtems/score/rbtree.h
index 94c8ee5..c4effce 100644
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ b/cpukit/score/include/rtems/score/rbtree.h
@@ -431,19 +431,28 @@ RTEMS_INLINE_ROUTINE bool _RBTree_Is_root(
 }
 
 /**
- * @brief Find the RBTree_Control header given a node in the tree.
+ * @brief Finds the red-black tree control given a node in the tree.
  *
- * This function returns a pointer to the header of the Red Black
- * Tree containing @a the_node if it exists, and NULL if not.
+ * In case the node is not a node of a tree, then this function yields
+ * unpredictable results.
+ *
+ * @param[in] the_node The node of interest.
+ *
+ * @return The red-black tree control of the node.
  */
-RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_header(
-RBTree_Node *the_node
-)
+RTEMS_INLINE_ROUTINE RBTree_Control *_RBTree_Find_control(
+  const RBTree_Node *the_node
+)
 {
-  if(!the_node) return NULL;
-  if(!(the_node->parent)) return NULL;
-  while(the_node->parent) the_node = the_node->parent;
-  return (RBTree_Control*)the_node;
+  RBTree_Node*parent = the_node->parent;
+  RBTree_Control *rbtree;
+
+  do {
+rbtree = (RBTree_Control *) parent;
+parent = parent->parent;
+  } while ( parent != NULL );
+
+  return rbtree;
 }
 
 /**
diff --git a/testsuites/sptests/sprbtree01/init.c 
b/testsuites/sptests/sprbtree01/init.c
index 68b2c92..c43871a 100644
--- a/testsuites/sptests/sprbtree01/init.c
+++ b/testsuites/sptests/sprbtree01/init.c
@@ -580,8 +580,8 @@ rtems_task Init( rtems_task_argument ignored )
   }
 
   p = rb_find_unique(&rbtree1, &search_node.Node);
-  puts( "INIT - Verify rtems_rbtree_find_header" );
-  if (rtems_rbtree_find_header(p) != &rbtree1) {
+  puts( "INIT - Verify rtems_rbtree_find_control" );
+  if (rtems_rbtree_find_control(p) != &rbtree1) {
 puts ("INIT - ERROR ON RBTREE HEADER MISMATCH");
 rtems_test_exit(0);
   }
@@ -620,11 +620,6 @@ rtems_task Init( rtems_task_argument ignored )
 rtems_test_exit(0);
   }
 
-  if (rtems_rbtree_find_header(NULL) != NULL) {
-puts ("INIT - ERROR ON RBTREE HEADER MISMATCH");
-rtems_test_exit(0);
-  }
-
   puts("INIT - Insert 20 random numbers");
   for (i = 0; i < 20; i++) {
 node_array[i].id = numbers[i];
diff --git a/testsuites/sptests/sprbtree01/sprbtree01.scn 
b/testsuites/sptests/sprbtree01/sprbtree01.scn
index 0d37566..73491be 100644
--- a/testsuites/sptests/sprbtree01/sprbtree01.scn
+++ b/testsuites/sptests/sprbtree01/sprbtree01.scn
@@ -18,7 +18,7 @@ INIT - Removing 100 nodes
 INIT - Verify rtems_rbtree_get_max with 100 nodes value [0,99]
 INIT - Verify rtems_rbtree_find
 INIT - Verify rtems_rbtree_predecessor/successor
-INIT - Verify rtems_rbtree_find_header
+INIT - Verify rtems_rbtree_find_control
 INIT - Removing 100 nodes
 INIT - Insert 20 random numbers
 INIT - Removing 20 nodes
-- 
1.8.1.4

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


[PATCH 1/2] rbtree: Simplify off-tree handling

2014-07-26 Thread Sebastian Huber
Only use the parent pointer, since this pointer is never NULL for nodes
which are part of a tree.

Rename functions from *_off_rbtree() to *_off_tree().
---
 cpukit/sapi/include/rtems/rbtree.h|  8 +++
 cpukit/score/include/rtems/score/rbtree.h | 37 +--
 testsuites/sptests/sprbtree01/init.c  |  8 +++
 3 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/cpukit/sapi/include/rtems/rbtree.h 
b/cpukit/sapi/include/rtems/rbtree.h
index 2005b36..dbc6d20 100644
--- a/cpukit/sapi/include/rtems/rbtree.h
+++ b/cpukit/sapi/include/rtems/rbtree.h
@@ -121,11 +121,11 @@ RTEMS_INLINE_ROUTINE void rtems_rbtree_initialize_empty(
  * This function sets the next and previous fields of the @a node to NULL
  * indicating the @a node is not part of any rbtree.
  */
-RTEMS_INLINE_ROUTINE void rtems_rbtree_set_off_rbtree(
+RTEMS_INLINE_ROUTINE void rtems_rbtree_set_off_tree(
   rtems_rbtree_node *node
 )
 {
-  _RBTree_Set_off_rbtree( node );
+  _RBTree_Set_off_tree( node );
 }
 
 /**
@@ -134,11 +134,11 @@ RTEMS_INLINE_ROUTINE void rtems_rbtree_set_off_rbtree(
  * This function returns true if the @a node is not on a rbtree. A @a node is
  * off rbtree if the next and previous fields are set to NULL.
  */
-RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_node_off_rbtree(
+RTEMS_INLINE_ROUTINE bool rtems_rbtree_is_node_off_tree(
   const rtems_rbtree_node *node
 )
 {
-  return _RBTree_Is_node_off_rbtree( node );
+  return _RBTree_Is_node_off_tree( node );
 }
 
 /**
diff --git a/cpukit/score/include/rtems/score/rbtree.h 
b/cpukit/score/include/rtems/score/rbtree.h
index 2ec77ea..94c8ee5 100644
--- a/cpukit/score/include/rtems/score/rbtree.h
+++ b/cpukit/score/include/rtems/score/rbtree.h
@@ -245,7 +245,7 @@ RBTree_Node *_RBTree_Insert(
  * @brief Extracts (removes) the node from the red-black tree.
  *
  * This function does not set the node off-tree.  In case this is desired, then
- * call _RBTree_Set_off_rbtree() after the extraction.
+ * call _RBTree_Set_off_tree() after the extraction.
  *
  * In case the node to extract is not a node of the tree, then this function
  * yields unpredictable results.
@@ -273,32 +273,35 @@ RBTree_Node *_RBTree_Next(
 );
 
 /**
- * @brief Set off RBtree.
+ * @brief Sets a red-black tree node as off-tree.
  *
- * This function sets the parent and child fields of the @a node to NULL
- * indicating the @a node is not part of a rbtree.
+ * Do not use this function on nodes which are a part of a tree.
  *
+ * @param[in] the_node The node to set off-tree.
+ *
+ * @see _RBTree_Is_node_off_tree().
  */
-RTEMS_INLINE_ROUTINE void _RBTree_Set_off_rbtree(
-RBTree_Node *node
-)
+RTEMS_INLINE_ROUTINE void _RBTree_Set_off_tree( RBTree_Node *the_node )
 {
-  node->parent = node->child[RBT_LEFT] = node->child[RBT_RIGHT] = NULL;
+  the_node->parent = NULL;
 }
 
 /**
- * @brief Is the node off RBTree.
+ * @brief Returns true, if this red-black tree node is off-tree, and false
+ * otherwise.
+ *
+ * @param[in] the_node The node to test.
+ *
+ * @retval true The node is not a part of a tree (off-tree).
+ * @retval false Otherwise.
  *
- * This function returns true if the @a node is not on a rbtree. A @a node is
- * off rbtree if the parent and child fields are set to NULL.
+ * @see _RBTree_Set_off_tree().
  */
-RTEMS_INLINE_ROUTINE bool _RBTree_Is_node_off_rbtree(
-const RBTree_Node *node
-)
+RTEMS_INLINE_ROUTINE bool _RBTree_Is_node_off_tree(
+  const RBTree_Node *the_node
+)
 {
-  return (node->parent == NULL) &&
- (node->child[RBT_LEFT] == NULL) &&
- (node->child[RBT_RIGHT] == NULL);
+  return the_node->parent == NULL;
 }
 
 /**
diff --git a/testsuites/sptests/sprbtree01/init.c 
b/testsuites/sptests/sprbtree01/init.c
index 2c62d12..68b2c92 100644
--- a/testsuites/sptests/sprbtree01/init.c
+++ b/testsuites/sptests/sprbtree01/init.c
@@ -235,8 +235,8 @@ rtems_task Init( rtems_task_argument ignored )
   puts( "Init - Initialize rbtree empty" );
   rtems_rbtree_initialize_empty( &rbtree1 );
 
-  rtems_rbtree_set_off_rbtree( &node1.Node );
-  rtems_test_assert( rtems_rbtree_is_node_off_rbtree( &node1.Node ) );
+  rtems_rbtree_set_off_tree( &node1.Node );
+  rtems_test_assert( rtems_rbtree_is_node_off_tree( &node1.Node ) );
 
   /* verify that the rbtree insert work */
   puts( "INIT - Verify rtems_rbtree_insert with two nodes" );
@@ -247,7 +247,7 @@ rtems_task Init( rtems_task_argument ignored )
   rb_insert_unique( &rbtree1, &node1.Node );
   rb_insert_unique( &rbtree1, &node2.Node );
 
-  rtems_test_assert( !rtems_rbtree_is_node_off_rbtree( &node1.Node ) );
+  rtems_test_assert( !rtems_rbtree_is_node_off_tree( &node1.Node ) );
 
   _RBTree_Rotate(NULL, RBT_LEFT);
   i = (node1.Node.parent == &node2.Node);
@@ -360,7 +360,7 @@ rtems_task Init( rtems_task_argument ignored )
 puts( "INIT - rtems_rbtree_extract failed");
 rtems_test_exit(0);
   }
-  rtems_test_assert( !rtems_rbtree_is_node_off_rbtree( p ) );
+  rtems_test_assert( !r

[PATCH] RTEMS thread model configuration

2014-07-26 Thread Sebastian Huber
The command line to build a GCC for RTEMS contained virtually always a
'--enable-threads'.  This patch helps to avoid this extra configuration
command line parameter and makes the GCC build a bit more user friendly
for RTEMS.

This patch should be applied to GCC 4.9 branch and master.

2014-04-18  Sebastian Huber  

* config.gcc (*-*-rtems*): Default to 'rtems' thread model.
Enable selection of 'posix' or no thread model.
---
 gcc/config.gcc | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 9b6a5f3..6eefa53 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -791,7 +791,13 @@ case ${target} in
   ;;
 *-*-rtems*)
   case ${enable_threads} in
-yes) thread_file='rtems' ;;
+"" | yes | rtems) thread_file='rtems' ;;
+posix) thread_file='posix' ;;
+no) ;;
+*)
+  echo 'Unknown thread configuration for RTEMS'
+  exit 1
+  ;;
   esac
   tmake_file="${tmake_file} t-rtems"
   extra_options="${extra_options} rtems.opt"
-- 
1.8.1.4

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel