Small doubt in how chain works in RTEMS

2020-06-12 Thread Richi Dubey
Hi everyone,

While going through testsuites/sptests/spchain/init.c, I noticed the
following code:

---
rtems_task Init(
  rtems_task_argument ignored
)
{
  rtems_chain_control  chain1;
  rtems_chain_node*p;
  test_nodenode1, node2;
  int  id;

  TEST_BEGIN();

  puts( "Init - Initialize chain empty" );
  rtems_chain_initialize_empty( &chain1 );
  rtems_chain_initialize_node( &node1.Node );
  rtems_chain_initialize_node( &node2.Node );

  /* verify that the chain append and insert work */
  puts( "INIT - Verify rtems_chain_insert" );
  node1.id = 1;
  node2.id = 2;
  rtems_chain_append( &chain1, &node1.Node );
  rtems_chain_insert( &node1.Node, &node2.Node );

  for ( p = rtems_chain_first(&chain1), id = 1 ;
!rtems_chain_is_tail(&chain1, p) ;
p = p->next , id++ ) {
 test_node *t = (test_node *)p;
 if ( id > 2 ) {
   puts( "INIT - TOO MANY NODES ON CHAIN" );
   rtems_test_exit(0);
 }
 if ( t->id != id ) {
   puts( "INIT - ERROR ON CHAIN ID MISMATCH" );
   rtems_test_exit(0);
 }
  }

-
Where test_node is defined as:

typedef struct {
  rtems_chain_node Node;
  int  id;
} test_node;

--


Now when we are inserting or appending our structure into the chain, we are
only inserting the part of strucuture correspoing to rtems_chain_node, i.e.:
  rtems_chain_append( &chain1, &node1.Node );
  rtems_chain_insert( &node1.Node, &node2.Node );

So, how do we ever get our node1.id ? How can we (or how do we ever) access
our data from the structure when we are only adding some part of the
structure into the node?

I hope my doubt is not too vague.

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

Re: Small doubt in how chain works in RTEMS

2020-06-12 Thread Gedare Bloom
On Fri, Jun 12, 2020 at 7:50 AM Richi Dubey  wrote:
>
> Hi everyone,
>
> While going through testsuites/sptests/spchain/init.c, I noticed the 
> following code:
>
> ---
> rtems_task Init(
>   rtems_task_argument ignored
> )
> {
>   rtems_chain_control  chain1;
>   rtems_chain_node*p;
>   test_nodenode1, node2;
>   int  id;
>
>   TEST_BEGIN();
>
>   puts( "Init - Initialize chain empty" );
>   rtems_chain_initialize_empty( &chain1 );
>   rtems_chain_initialize_node( &node1.Node );
>   rtems_chain_initialize_node( &node2.Node );
>
>   /* verify that the chain append and insert work */
>   puts( "INIT - Verify rtems_chain_insert" );
>   node1.id = 1;
>   node2.id = 2;
>   rtems_chain_append( &chain1, &node1.Node );
>   rtems_chain_insert( &node1.Node, &node2.Node );
>
>   for ( p = rtems_chain_first(&chain1), id = 1 ;
> !rtems_chain_is_tail(&chain1, p) ;
> p = p->next , id++ ) {
>  test_node *t = (test_node *)p;
>  if ( id > 2 ) {
>puts( "INIT - TOO MANY NODES ON CHAIN" );
>rtems_test_exit(0);
>  }
>  if ( t->id != id ) {
>puts( "INIT - ERROR ON CHAIN ID MISMATCH" );
>rtems_test_exit(0);
>  }
>   }
>
> -
> Where test_node is defined as:
>
> typedef struct {
>   rtems_chain_node Node;
>   int  id;
> } test_node;
>
> --
>
>
> Now when we are inserting or appending our structure into the chain, we are 
> only inserting the part of strucuture correspoing to rtems_chain_node, i.e.:
>   rtems_chain_append( &chain1, &node1.Node );
>   rtems_chain_insert( &node1.Node, &node2.Node );
>
> So, how do we ever get our node1.id ? How can we (or how do we ever) access 
> our data from the structure when we are only adding some part of the 
> structure into the node?
>
> I hope my doubt is not too vague.
>
Hi Richi,

This is an old C programming trick.

This looks like a reasonable explanation:
https://medium.com/@414apache/kernel-data-structures-linkedlist-b13e4f8de4bf

Feel free to write something for rtems ;)

> Thanks,
> Richi.
>
>
> ___
> devel mailing list
> devel@rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel