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.

-- 
                                            Gilles.


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

Reply via email to