<div dir="ltr">Hi,<div><br></div><div>I have a doubt regarding this.</div><div><br></div><div>We do</div><div>  rtems_chain_append( &chain1, &node1.Node );<br></div><div><br></div><div>And get the node pointer when we use:</div><div>  rtems_chain_node    *p= rtems_chain_first(&chain1),<br></div><div><br></div><div>After this, Do we really need to use the CONTAINER_OF and other such methods?</div><div><br></div><div>Can we not simply do:</div><div>  test_node node1=(test_node*) p;</div><div><br></div><div><br></div><div>Since our structure test_node has the  rtems_chain_node Node; as its first variable, it should work, right?</div><div><br></div><div>References:</div><div><a href="https://stackoverflow.com/q/3766229">https://stackoverflow.com/q/3766229</a><br></div><div><a href="https://git.rtems.org/rtems/tree/cpukit/score/src/scheduleredfsmp.c#n178">https://git.rtems.org/rtems/tree/cpukit/score/src/scheduleredfsmp.c#n178</a><br></div><div><br></div><div>Please let me know.</div><div>Thanks.</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>