sapi: SMP support for chains

Add ISR lock to chain control for proper SMP protection.  Replace
rtems_chain_extract() with rtems_chain_explicit_extract() and
rtems_chain_insert() with rtems_chain_explicit_insert() on SMP
configurations.  Use rtems_chain_explicit_extract() and
rtems_chain_explicit_insert() to provide SMP support.
This commit is contained in:
Sebastian Huber
2013-08-26 15:14:33 +02:00
parent e127c4c9ea
commit 1215fd4d94
9 changed files with 326 additions and 64 deletions

View File

@@ -1130,14 +1130,14 @@ bdbuf_tests_task_0_test_8 (bdbuf_task_control* tc)
bd = (rtems_bdbuf_buffer*) node;
pnode = node->previous;
rtems_chain_extract (node);
rtems_chain_explicit_extract (&buffers, node);
node = pnode;
bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[4]: ", tc->name);
passed = bdbuf_test_print_sc (rtems_bdbuf_release_modified (bd), true);
bd = (rtems_bdbuf_buffer*) node;
pnode = node->previous;
rtems_chain_extract (node);
rtems_chain_explicit_extract (&buffers, node);
node = pnode;
bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[3]: ", tc->name);
passed = bdbuf_test_print_sc (rtems_bdbuf_release_modified (bd), true);

View File

@@ -60,17 +60,29 @@ static void test_chain_control_initializer(void)
static void test_chain_control_layout(void)
{
rtems_chain_control chain;
Chain_Control chain;
puts( "INIT - Verify rtems_chain_control layout" );
rtems_test_assert(
sizeof(rtems_chain_control)
== sizeof(rtems_chain_node) + sizeof(rtems_chain_node *)
sizeof(Chain_Control)
== sizeof(Chain_Node) + sizeof(Chain_Node *)
);
rtems_test_assert(
sizeof(rtems_chain_control)
== 3 * sizeof(rtems_chain_node *)
sizeof(Chain_Control)
== 3 * sizeof(Chain_Node *)
);
rtems_test_assert( &chain.Head.Node.previous == &chain.Tail.Node.next );
rtems_test_assert(
_Chain_Previous( _Chain_Head( &chain ) )
== _Chain_Next( _Chain_Tail( &chain ) )
);
#if !defined( RTEMS_SMP )
rtems_test_assert(
sizeof(Chain_Control)
== sizeof(rtems_chain_control)
);
#endif
}
static void test_chain_get_with_wait(void)
@@ -94,7 +106,7 @@ static void test_chain_first_and_last(void)
rtems_chain_initialize_empty( &chain );
rtems_chain_append( &chain, &node1 );
rtems_chain_insert( &node1, &node2 );
rtems_chain_explicit_insert( &chain, &node1, &node2 );
puts( "INIT - Verify rtems_chain_is_first" );
cnode = rtems_chain_first(&chain);
@@ -296,7 +308,7 @@ rtems_task Init(
node1.id = 1;
node2.id = 2;
rtems_chain_append( &chain1, &node1.Node );
rtems_chain_insert( &node1.Node, &node2.Node );
rtems_chain_explicit_insert( &chain1, &node1.Node, &node2.Node );
for ( p = rtems_chain_first(&chain1), id = 1 ;
!rtems_chain_is_tail(&chain1, p) ;