Derrick Stolee <stolee@xxxxxxxxx> wrote: > On 8/25/2019 10:43 PM, Eric Wong wrote: > > + * container_of - Get the address of an object containing a field. > > + * > > + * @ptr: pointer to the field. > > + * @type: type of the object. > > + * @member: name of the field within the object. > > + */ > > +#define container_of(ptr, type, member) \ > > + ((type *) ((char *)(ptr) - offsetof(type, member))) > > + > > #endif > > I think it would be good to include at least one use of this > macro in this patch. As it stands, I need to look at the next > patch to make sense of what this is doing. Yeah, I considered making list_entry an alias of this. But I wasn't sure about including git-compat-util.h in list.h... > It took me a little while to parse what is happening here. > 'ptr' is a pointer to the generic struct (in our case, > 'struct hashmap_entry *'), while 'type' is the parent type, > and 'member' is the name of the member in 'type' that is > of type typeof(*ptr). > > Perhaps this is easier to grok for others than it was for me. *shrug* I only dabble in C, but I've been using it for a good while. I'm probably drawn to it because I'm not a great C programmer like having it to prevent mistakes. I also find open-coded linked lists (even singly-linked ones!) hard-to-follow, so I always reach for something like urcu/list.h or ccan/list.h.