Hi, I have a doubt regarding this.
We do rtems_chain_append( &chain1, &node1.Node ); And get the node pointer when we use: rtems_chain_node *p= rtems_chain_first(&chain1), After this, Do we really need to use the CONTAINER_OF and other such methods? Can we not simply do: test_node node1=(test_node*) p; Since our structure test_node has the rtems_chain_node Node; as its first variable, it should work, right? References: https://stackoverflow.com/q/3766229 https://git.rtems.org/rtems/tree/cpukit/score/src/scheduleredfsmp.c#n178 Please let me know. Thanks. On Fri, Jun 12, 2020 at 7:28 PM Gedare Bloom <ged...@rtems.org> wrote: > On Fri, Jun 12, 2020 at 7:50 AM Richi Dubey <richidu...@gmail.com> 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_node node1, 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