<div dir="ltr"><div dir="ltr">Hi Dr. Bloom,<div><br></div><div>Thanks for the link, The article has another link to an article(<a href="http://www.kroah.com/log/linux/container_of.html">http://www.kroah.com/log/linux/container_of.html</a>) by one of the maintainers of Linux and both the articles are really well written. The idea is, we have the size of the structure and the size of the pointer(for our chain), so we should be able to figure out the start of the structure. Smart!</div><div><br></div><div>I can't do justice to RTEMS if I write with the current knowledge that I have :p. I'll do it after a month or so.</div><div><br></div><div>Thanks,</div><div>Richi.</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 12, 2020 at 7:28 PM Gedare Bloom <<a href="mailto:gedare@rtems.org">gedare@rtems.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Fri, Jun 12, 2020 at 7:50 AM Richi Dubey <<a href="mailto:richidubey@gmail.com" target="_blank">richidubey@gmail.com</a>> wrote:<br>
><br>
> Hi everyone,<br>
><br>
> While going through testsuites/sptests/spchain/init.c, I noticed the following code:<br>
><br>
> -----------------------------------------------<br>
> rtems_task Init(<br>
>   rtems_task_argument ignored<br>
> )<br>
> {<br>
>   rtems_chain_control  chain1;<br>
>   rtems_chain_node    *p;<br>
>   test_node            node1, node2;<br>
>   int                  id;<br>
><br>
>   TEST_BEGIN();<br>
><br>
>   puts( "Init - Initialize chain empty" );<br>
>   rtems_chain_initialize_empty( &chain1 );<br>
>   rtems_chain_initialize_node( &node1.Node );<br>
>   rtems_chain_initialize_node( &node2.Node );<br>
><br>
>   /* verify that the chain append and insert work */<br>
>   puts( "INIT - Verify rtems_chain_insert" );<br>
>   <a href="http://node1.id" rel="noreferrer" target="_blank">node1.id</a> = 1;<br>
>   <a href="http://node2.id" rel="noreferrer" target="_blank">node2.id</a> = 2;<br>
>   rtems_chain_append( &chain1, &node1.Node );<br>
>   rtems_chain_insert( &node1.Node, &node2.Node );<br>
><br>
>   for ( p = rtems_chain_first(&chain1), id = 1 ;<br>
>         !rtems_chain_is_tail(&chain1, p) ;<br>
>         p = p->next , id++ ) {<br>
>      test_node *t = (test_node *)p;<br>
>      if ( id > 2 ) {<br>
>        puts( "INIT - TOO MANY NODES ON CHAIN" );<br>
>        rtems_test_exit(0);<br>
>      }<br>
>      if ( t->id != id ) {<br>
>        puts( "INIT - ERROR ON CHAIN ID MISMATCH" );<br>
>        rtems_test_exit(0);<br>
>      }<br>
>   }<br>
><br>
> -----------------------------------------<br>
> Where test_node is defined as:<br>
><br>
> typedef struct {<br>
>   rtems_chain_node Node;<br>
>   int              id;<br>
> } test_node;<br>
><br>
> ----------------------------------<br>
><br>
><br>
> 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.:<br>
>   rtems_chain_append( &chain1, &node1.Node );<br>
>   rtems_chain_insert( &node1.Node, &node2.Node );<br>
><br>
> So, how do we ever get our <a href="http://node1.id" rel="noreferrer" target="_blank">node1.id</a> ? 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?<br>
><br>
> I hope my doubt is not too vague.<br>
><br>
Hi Richi,<br>
<br>
This is an old C programming trick.<br>
<br>
This looks like a reasonable explanation:<br>
<a href="https://medium.com/@414apache/kernel-data-structures-linkedlist-b13e4f8de4bf" rel="noreferrer" target="_blank">https://medium.com/@414apache/kernel-data-structures-linkedlist-b13e4f8de4bf</a><br>
<br>
Feel free to write something for rtems ;)<br>
<br>
> Thanks,<br>
> Richi.<br>
><br>
><br>
> _______________________________________________<br>
> devel mailing list<br>
> <a href="mailto:devel@rtems.org" target="_blank">devel@rtems.org</a><br>
> <a href="http://lists.rtems.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.rtems.org/mailman/listinfo/devel</a><br>
</blockquote></div>