Jan Kiszka wrote:
> 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.

No, please nothing like that.

This one works for me:
#include <stdlib.h>
#include <stdio.h>

#define __name2(a, b) a ## b
#define name2(a, b) __name2(a, b)

#define DECLARE_ASSERT_SYMBOL(sym)                                      \
        static const int XENO_OPT_DEBUG_##sym = 0; \
        static const int CONFIG_XENO_OPT_DEBUG_##sym##0 = 0

#define XENO_DEBUG(sym) \
        (name2(CONFIG_XENO_OPT_DEBUG_##sym,0) > XENO_OPT_DEBUG_##sym)

#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);

int main(void)
{
        if (XENO_DEBUG(NUCLEUS))
                printf("Hello\n");
}

Please try and send me the result of pre-processing if
it does not work for you.

-- 
                                            Gilles.


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

Reply via email to