[Cbe-oss-dev] [PATCH 02/11]MARS: Workload queue block replace bit fields

Kazunori Asayama asayama at sm.sony.co.jp
Tue Sep 16 16:41:35 EST 2008


Yuji Mano wrote:
> Kazunori Asayama wrote:
>> Yuji Mano wrote:
>>> This replaces the bit fields usage for the workload queue block bits with
>>> explicit bitwise shift/mask operations for better portability.
>>>
>>> Signed-off-by: Yuji Mano <yuji.mano at am.sony.com>
>> (snip)
>>
>>> +#define MARS_BITS_CAST_TYPE			uint8_t
>>> +#define MARS_BITS_CAST_STATE			uint8_t
>>> +#define MARS_BITS_CAST_PRIORITY			uint8_t
>>> +#define MARS_BITS_CAST_SIGNAL			uint8_t
>>> +#define MARS_BITS_CAST_WAIT_ID			uint16_t
>>> +#define MARS_BITS_CAST_COUNTER			uint16_t
>>> +
>>> +#define MARS_BITS_GET(bits, name) (MARS_BITS_CAST_##name) \
>>> +	((*(bits) & MARS_BITS_MASK_##name) >> MARS_BITS_SHIFT_##name)
>> Why are these explicit casts needed?
> 
> I guess they may not be absolutely necessary...
> But I think it also makes it more clear what integer type you should store
> the value in when needed.

But the cast operation is completely hidden from the code by the macro
MARS_BITS_GET(). Additionally, I don't think types are enough to
represent the range of the fields. That is, e.g., actually TYPE is 4bits
length, but the cast is 'uint8_t'.

And in mars_kernel_scheduler.c, for example 'priority' is always casted
from 'uint8_t' to 'int', so I'm not sure the PRIORITY should be 'uint8_t'.

> 
> Also for example if you try to do aomething like the following without the cast:
> 
> printf("priority = %u\n", MARS_BITS_GET(&bits, PRIORITY);
> 
> you would get the following warning:
> 
> warning: format '%u' expects type 'unsigned int', but argument 2 has type 'long long unsigned int

Or you can use '%llu', instead?

-- 
(ASAYAMA Kazunori
  (asayama at sm.sony.co.jp))
t



More information about the cbe-oss-dev mailing list