From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shreyansh Jain Subject: Re: [PATCH v2 1/8] eal: define container_of macro Date: Tue, 22 Nov 2016 15:33:58 +0530 Message-ID: References: <1479747322-5774-1-git-send-email-jblunck@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit Cc: , , Jan Viktorin To: Jan Blunck Return-path: Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0080.outbound.protection.outlook.com [104.47.34.80]) by dpdk.org (Postfix) with ESMTP id E0AEC5582 for ; Tue, 22 Nov 2016 11:01:49 +0100 (CET) In-Reply-To: <1479747322-5774-1-git-send-email-jblunck@infradead.org> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Monday 21 November 2016 10:25 PM, Jan Blunck wrote: > This macro is based on Jan Viktorin's original patch but also checks the > type of the passed pointer against the type of the member. > > Signed-off-by: Jan Viktorin > Signed-off-by: Shreyansh Jain > [jblunck@infradead.org: add type checking and __extension__] > Signed-off-by: Jan Blunck > --- > lib/librte_eal/common/include/rte_common.h | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/lib/librte_eal/common/include/rte_common.h b/lib/librte_eal/common/include/rte_common.h > index db5ac91..8dda3e2 100644 > --- a/lib/librte_eal/common/include/rte_common.h > +++ b/lib/librte_eal/common/include/rte_common.h > @@ -331,6 +331,26 @@ rte_bsf32(uint32_t v) > #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) > #endif > > +/** > + * Return pointer to the wrapping struct instance. > + * > + * Example: > + * > + * struct wrapper { > + * ... > + * struct child c; > + * ... > + * }; > + * > + * struct child *x = obtain(...); > + * struct wrapper *w = container_of(x, struct wrapper, c); > + */ > +#ifndef container_of > +#define container_of(ptr, type, member) __extension__ ({ \ > + typeof(((type *)0)->member) *_ptr = (ptr); \ > + (type *)(((char *)_ptr) - offsetof(type, member)); }) > +#endif > + > #define _RTE_STR(x) #x > /** Take a macro value and get a string version of it */ > #define RTE_STR(x) _RTE_STR(x) > I will start using this in my patchset. Acked-by: Shreyansh Jain