[ofw] [PATCH] typeof() not supported in Windows WDK compiler

Smith, Stan stan.smith at intel.com
Fri Oct 2 09:02:46 PDT 2009


Hello Sasha,
  Please skip the patch titled 'typeof() not supported in Windows WDK compiler' as Jason's fix does the job thus requiring no src code changes.

Thank you Jason.

Stan.


Jason Gunthorpe wrote:
> On Thu, Oct 01, 2009 at 03:59:00PM -0700, Sean Hefty wrote:
>>> diff --git a/opensm/opensm/osm_drop_mgr.c
>>> b/opensm/opensm/osm_drop_mgr.c index 4f98cc9..8fe5129 100644 +++
>>> b/opensm/opensm/osm_drop_mgr.c @@ -209,8 +209,13 @@ static void
>>>     drop_mgr_remove_port(osm_sm_t * sm, IN osm_port_t * p_port)
>>> drop_mgr_clean_physp(sm, p_port->p_physp);
>>>
>>>     while (!cl_is_qlist_empty(&p_port->mcm_list)) {
>>> +#ifndef __WIN__
>>>             mcm_port = cl_item_obj(cl_qlist_head(&p_port->mcm_list),
>>>                                    mcm_port, list_item);
>>> +#else
>>> +           mcm_port = cl_item_obj(cl_qlist_head(&p_port->mcm_list),
>>> +                                  mcm_port, list_item, (osm_mcm_port_t*) );
>>> +#endif
>>
>> I'd find this more readable if it were #ifdef rather than #ifndef.
>>
>> That said, I've got to believe that there's a better way to handle
>> these changes.  I just don't know what it is.
>
> Hmm
>
> How about
>
> #ifdef __GCC_
> #define cl_item_obj(item_ptr, obj_ptr, item_field) (typeof(obj_ptr)) \
>         ((void *)item_ptr - (unsigned
> long)&((typeof(obj_ptr))0)->item_field) #else
> #define cl_item_obj(item_ptr, obj_ptr, item_field) (typeof(obj_ptr)) \
>   (void *)((uint8_t*)item_ptr - ((uintptr_t)(&(obj_ptr)->item_field) -
>   ((uintptr_t)&(obj_ptr))))
> #endif
>
> And rely on the C implicit cast from void* to an object type, and rely
> on compiles with gcc to do the extra type checking.
>
> Jason




More information about the ofw mailing list