summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-11-03 11:10:21 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-11-05 11:30:09 +0100
commitaa473025f70d144ef9b50e833e7d9b91aad134f9 (patch)
tree2b38fa0e54f742b5bb2b28baefafac1bb1a9e4ad
parentscore: Fix warning (diff)
downloadrtems-aa473025f70d144ef9b50e833e7d9b91aad134f9.tar.bz2
sapi: Add rtems_chain_get_first_unprotected()
Close #2459.
-rw-r--r--cpukit/sapi/include/rtems/chain.h10
-rw-r--r--doc/user/chains.t33
-rw-r--r--testsuites/sptests/spchain/init.c7
3 files changed, 50 insertions, 0 deletions
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
@@ -624,6 +624,16 @@ RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get_unprotected(
}
/**
+ * @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
*
* This routine inserts @a the_node on a chain immediately following
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
@@ -661,6 +662,38 @@ interrupts.
@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
+@page
@subsection Insert a Node
@cindex chain insert a node
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)