Red-black tree API Was: Re: [PATCH 2/2] score/rbtree: replace _RBTree_Peek_unprotected with _RBTree_First.

Gedare Bloom gedare at rtems.org
Wed May 2 15:54:47 UTC 2012


After further review I would prefer the default behavior of red-black
tree functions be unprotected unless an unprotected variant explicitly
is provided. Such behavior is a little bit arbitrary but relatively
easy to detect and understand.

This "rule" implies that the public API rtems_rbtree_peek_min/max
functions should be made unprotected unless we provide an explicit
rtems_rbtree_peek_min/max_unprotected, which I do not plan right now.
So more patches will be forthcoming.

-Gedare

On Wed, May 2, 2012 at 11:41 AM, Gedare Bloom <gedare at rtems.org> wrote:
> I guess the chain default behavior is unprotected unless the function
> modifies the chain. I would like to rework the red-black tree to be
> the same way. The primary difference is the "Find" function which
> right now defaults to protected but does not modify the red-black
> tree.
>
> If anyone has an objection to the default behavior of unprotected for
> read-only and protected otherwise please let me know. Otherwise I'll
> have a patch coming soon to make the red-black tree more consistently
> apply critical regions with respect to chains.
>
> -Gedare
>
> On Wed, May 2, 2012 at 11:32 AM, Gedare Bloom <gedare at rtems.org> wrote:
>> I noticed that RBTree_First and RBTree_Peek_unprotected implement the
>> same thing. I prefer to simplify to one of them and RBTree_First
>> seemed to be more commonly used and is "unprotected" by default.
>>
>> Right now I'm leaving RBTree_Peek in place as the protected interface.
>> The user API remains unchanged since it lacked an unprotected version
>> previously. I will follow-up with a user API wrapper for RBTree_First.
>>
>> I'm not really satisfied with the mixture of default protected vs
>> unprotected but the behavior generally follows the chains where a
>> function tends to be protected by default if it modifies or iterates a
>> chain and unprotected if it only deals with a single node. It might be
>> nice to formalize the reasoning and make sure the approach is
>> consistent between the two data structures.
>>
>> -Gedare
>>
>> On Wed, May 2, 2012 at 11:26 AM, Gedare Bloom <gedare at rtems.org> wrote:
>>> ---
>>>  cpukit/score/inline/rtems/score/rbtree.inl |   20 +-------------------
>>>  cpukit/score/src/rbtreepeek.c              |    6 ++----
>>>  2 files changed, 3 insertions(+), 23 deletions(-)
>>>
>>> diff --git a/cpukit/score/inline/rtems/score/rbtree.inl b/cpukit/score/inline/rtems/score/rbtree.inl
>>> index d646b06..a079745 100644
>>> --- a/cpukit/score/inline/rtems/score/rbtree.inl
>>> +++ b/cpukit/score/inline/rtems/score/rbtree.inl
>>> @@ -10,13 +10,11 @@
>>>  */
>>>
>>>  /*
>>> - *  Copyright (c) 2010 Gedare Bloom.
>>> + *  Copyright (c) 2010-2012 Gedare Bloom.
>>>  *
>>>  *  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.
>>> - *
>>> - *  $Id$
>>>  */
>>>
>>>  #ifndef _RTEMS_SCORE_RBTREE_H
>>> @@ -459,22 +457,6 @@ RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Get_unprotected(
>>>   return the_node;
>>>  }
>>>
>>> -/** @brief Peek at the First Node (unprotected)
>>> - *
>>> - *  This function returns a pointer to the first node, minimum if @a dir is 0
>>> - *  or maximum if @a dir is 1, from @a the_rbtree without extracting it.
>>> - *  It does NOT disable interrupts to ensure the atomicity of the peek.
>>> - *
>>> - *  @retval NULL if @a the_rbtree is empty.
>>> - */
>>> -RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Peek_unprotected(
>>> -  const RBTree_Control *the_rbtree,
>>> -  RBTree_Direction dir
>>> -)
>>> -{
>>> -  return(the_rbtree->first[dir]);
>>> -}
>>> -
>>>  /** @brief Rotate the_node in the direction passed as second argument
>>>  *
>>>  *  This routine rotates @a the_node to the direction @a dir, swapping
>>> diff --git a/cpukit/score/src/rbtreepeek.c b/cpukit/score/src/rbtreepeek.c
>>> index 13ea333..81ff0fd 100644
>>> --- a/cpukit/score/src/rbtreepeek.c
>>> +++ b/cpukit/score/src/rbtreepeek.c
>>> @@ -1,11 +1,9 @@
>>>  /*
>>> - *  Copyright (c) 2010 Gedare Bloom.
>>> + *  Copyright (c) 2010-2012 Gedare Bloom.
>>>  *
>>>  *  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.
>>> - *
>>> - *  $Id$
>>>  */
>>>
>>>  #if HAVE_CONFIG_H
>>> @@ -45,7 +43,7 @@ RBTree_Node *_RBTree_Peek(
>>>
>>>   return_node = NULL;
>>>   _ISR_Disable( level );
>>> -      return_node = _RBTree_Peek_unprotected( the_rbtree, dir );
>>> +      return_node = _RBTree_First( the_rbtree, dir );
>>>   _ISR_Enable( level );
>>>   return return_node;
>>>  }
>>> --
>>> 1.7.1
>>>




More information about the devel mailing list