Gilles Chanteperdrix wrote:
> Gilles Chanteperdrix wrote:
>> Jan Kiszka wrote:
>>> Gilles Chanteperdrix wrote:
>>>> Jan Kiszka wrote:
>>>>> Gilles Chanteperdrix wrote:
>>>>>> Jan Kiszka wrote:
>>>>>>> Philippe Gerum wrote:
>>>>>>>>>>> config XENO_OPT_DEBUG_FOO
>>>>>>>>>>>     bool "..."
>>>>>>>>>>>
>>>>>>>>>>> config XENO_OPT_DEBUG_FOO_P
>>>>>>>>>>>     int
>>>>>>>>>>>     default "1" if XENO_OPT_DEBUG_FOO
>>>>>>>>>>>     default "0"
>>>>>>>>>>>
>>>>>>>>>>> and XENO_DEBUG() could be extended to test for
>>>>>>>>>>> CONFIG_XENO_OPT_DEBUG_FOO_P when given "FOO". I'm just not sure if 
>>>>>>>>>>> this
>>>>>>>>>>> can be expressed for legacy 2.4 kernels, so it might have to wait 
>>>>>>>>>>> for
>>>>>>>>>>> Xenomai 3.
>>>>>>>> Well, actually, I would not merge this in Xenomai 3. I find this rather
>>>>>>>> overkill; mainline first I mean, and mainline, i.e. the Xenomai code
>>>>>>>> base only requires a simple and straightforward way to get debug
>>>>>>>> switches right. Having to make Kconfig a kitchen sink for some unknown
>>>>>>>> out of tree modules to be happy is not really my preferred approach in
>>>>>>>> this particular case.
>>>>>>>>
>>>>>>>> Don't get me wrong, I'm not opposed to a more decentralized approach on
>>>>>>>> the paper, it's just that I only care about the mainline tree here.
>>>>>>> The point is not out-of-tree but robustness. Neither the current
>>>>>>> decentralized #ifdef-#define nor its centralized brother meet this
>>>>>>> criteria. An approach like the above which forces you to provide all
>>>>>>> required bits before any of the cases (disabled/enabled) starts to work
>>>>>>> does so.
>>>>>> Ok. What about:
>>>>>>
>>>>>> #define __name2(a, b) a ## b
>>>>>> #define name2(a, b) __name2(a, b)
>>>>>>
>>>>>> #define DECLARE_ASSERT_SYMBOL(sym)                                       
>>>>>> \
>>>>>>  static const int CONFIG_XENO_OPT_DEBUG_##sym##0 = 0,            \
>>>>>>          __CONFIG_XENO_OPT_DEBUG_##sym = 
>>>>>> name2(CONFIG_XENO_OPT_DEBUG_##sym, 0)
>>>>>>
>>>>>> #define XENO_ASSERT(subsystem,cond,action)  do { \
>>>>>>     if (unlikely(__CONFIG_XENO_OPT_DEBUG_##subsystem > 0 && !(cond))) { \
>>>>>>         xnarch_trace_panic_freeze(); \
>>>>>>         xnlogerr("assertion failed at %s:%d (%s)\n", __FILE__, __LINE__, 
>>>>>> (#cond)); \
>>>>>>         xnarch_trace_panic_dump(); \
>>>>>>         action; \
>>>>>>     } \
>>>>>> } while(0)
>>>>>>
>>>>>> DECLARE_ASSERT_SYMBOL(NUCLEUS);
>>>>>>
>>>>>> It fails to compile when the debug symbol is set and
>>>>>> DECLARE_ASSERT_SYMBOL is missing, which plugs the failure of my previous
>>>>>> attempt.
>>>>> I'm still wrapping my head around this. What would be the usage,
>>>>>
>>>>> #ifndef CONFIG_XENO_OPT_DEBUG_FOO
>>>>> #define CONFIG_XENO_OPT_DEBUG_FOO 0
>>>>> #endif
>>>>>
>>>>> DECLARE_ASSERT_SYMBOL(FOO);
>>>>>
>>>>> ? If the compiler is smart enough to still drop the asserts based on
>>>>> static const, I'm fine as this is an improvement.
>>>> No, you just use DECLARE_ASSERT_SYMBOL(FOO)
>>> Would be nice - if it worked.
>>>
>>>>> Still, IMHO, this solution would not even win the second league beauty
>>>>> contest (now it comes with as many additional lines as the
>>>>> Kconfig-approach).
>>>> Yes, it is not pretty but to add a config option you just add the usual
>>>> Kconfig stuff, then DECLARE_ASSERT_SYMBOL in the code instead of the
>>>> #ifndef #define foo 0 #endif.
>>>>
>>>> If you do not do it, you get a compilation error whether the option is
>>>> enabled or not.
>>>>
>>>> It can be decentralized, the find | grep mentioned earlier will still work.
>>> If we can make it work like that, I'm all for it. But:
>>>
>>> error: initializer element is not constant
>>> (when disabled)
>>>
>>> or
>>>
>>> error: ‘y0’ undeclared here (not in a function)
>>> (when enabled)
>>>
>>> I'm afraid the preprocessor is not powerful enough for this task (we
>>> would need macros that include preprocessor conditionals).
>> The following seems to work for me:
>>
>> #define __name2(a, b) a ## b
>> #define name2(a, b) __name2(a, b)
>>
>> #define DECLARE_ASSERT_SYMBOL(sym)                                      \
>>         static const int CONFIG_XENO_OPT_DEBUG_##sym##0 = 0
>>
>> #define XENO_DEBUG(sym) (name2(CONFIG_XENO_OPT_DEBUG_##sym,0) > 0)
>>
>> #define XENO_ASSERT(subsystem,cond,action)  do { \
>>     if (unlikely(XENO_DEBUG(subsystem) && !(cond))) { \
>>         xnarch_trace_panic_freeze(); \
>>         xnlogerr("assertion failed at %s:%d (%s)\n", __FILE__, __LINE__, 
>> (#cond)); \
>>         xnarch_trace_panic_dump(); \
>>         action; \
>>     } \
>> } while(0)
>>
>> DECLARE_ASSERT_SYMBOL(NUCLEUS);
>>
> 
> We only loose the detection of the debug symbol used and not declared if
> it is enabled. But this looks to me like a minor issue. Still trying though.
> 

My compiler still complains about undefined 'y0' in the enabled case.

I'll try to dig into a different direction now: Automatic generation
during build. This is what the kernel does as well when the preprocessor
gives up. Would even save the DECLARE and should make everyone happy.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to