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