From aa473025f70d144ef9b50e833e7d9b91aad134f9 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 3 Nov 2015 11:10:21 +0100 Subject: sapi: Add rtems_chain_get_first_unprotected() Close #2459. --- cpukit/sapi/include/rtems/chain.h | 10 ++++++++++ doc/user/chains.t | 33 +++++++++++++++++++++++++++++++++ testsuites/sptests/spchain/init.c | 7 +++++++ 3 files changed, 50 insertions(+) diff --git a/cpukit/sapi/include/rtems/chain.h b/cpukit/sapi/include/rtems/chain.h index 8da355da0c..4d586ff06e 100644 --- a/cpukit/sapi/include/rtems/chain.h +++ b/cpukit/sapi/include/rtems/chain.h @@ -623,6 +623,16 @@ RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get_unprotected( return _Chain_Get_unprotected( the_chain ); } +/** + * @brief See _Chain_Get_first_unprotected(). + */ +RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get_first_unprotected( + rtems_chain_control *the_chain +) +{ + return _Chain_Get_first_unprotected( the_chain ); +} + /** * @brief Insert a node on a chain * diff --git a/doc/user/chains.t b/doc/user/chains.t index e5dffc24df..79e5984ffb 100644 --- a/doc/user/chains.t +++ b/doc/user/chains.t @@ -35,6 +35,7 @@ provided by RTEMS is: @item @code{@value{DIRPREFIX}chain_extract_unprotected} - Extract the node from the chain (unprotected) @item @code{@value{DIRPREFIX}chain_get} - Return the first node on the chain @item @code{@value{DIRPREFIX}chain_get_unprotected} - Return the first node on the chain (unprotected) +@item @code{@value{DIRPREFIX}chain_get_first_unprotected} - Get the first node on the chain (unprotected) @item @code{@value{DIRPREFIX}chain_insert} - Insert the node into the chain @item @code{@value{DIRPREFIX}chain_insert_unprotected} - Insert the node into the chain (unprotected) @item @code{@value{DIRPREFIX}chain_append} - Append the node to chain @@ -657,6 +658,38 @@ atomicity of the operation. Use @code{@value{DIRPREFIX}chain_get_unprotected()} to avoid disabling of interrupts. +@c +@c +@c +@page +@subsection Get the First Node (unprotected) + +@cindex chain get first node + +@subheading CALLING SEQUENCE: + +@ifset is-C +@findex @value{DIRPREFIX}chain_get_first_unprotected +@example +@value{DIRPREFIX}chain_node *@value{DIRPREFIX}chain_get_first_unprotected( + @value{DIRPREFIX}chain_control *the_chain +); +@end example +@end ifset + +@subheading RETURNS: + +A pointer to the former first node is returned. + +@subheading DESCRIPTION: + +Removes the first node from the chain and returns a pointer to it. In case the +chain was empty, then the results are unpredictable. + +@subheading NOTES: + +The function does nothing to ensure the atomicity of the operation. + @c @c @c diff --git a/testsuites/sptests/spchain/init.c b/testsuites/sptests/spchain/init.c index ca2e135e95..476629b548 100644 --- a/testsuites/sptests/spchain/init.c +++ b/testsuites/sptests/spchain/init.c @@ -117,6 +117,13 @@ static void test_chain_first_and_last(void) puts( "INIT - Verify rtems_chain_is_last" ); cnode = rtems_chain_last(&chain); rtems_test_assert( rtems_chain_is_last( cnode ) ); + + cnode = rtems_chain_get_first_unprotected( &chain ); + rtems_test_assert( cnode == &node1 ); + cnode = rtems_chain_first( &chain ); + rtems_test_assert( cnode == &node2 ); + cnode = rtems_chain_last( &chain ); + rtems_test_assert( cnode == &node2 ); } static void test_chain_with_notification(void) -- cgit v1.2.3