Hey all,
adding '_ONCE' variants of DPRINTF, FIXME, WARN and ERR is a topic that
came up before on wine devel. The first version of the attached patch
was submitted by Max TenEyck Woodbury, but was deferred until after wine
1.2. I still thought it was a good idea to have the _ONCE variants, so I
mailed Max, but he said he backed out after finding out it was not
feasible to do it right. I fixed some errors in his patch, but as Max
pointed out to me, for compilers that don't support variadic macros,
it's not possible to create a scope block to declare the static variable
in. This is because of the (void)wine_dbg_printf call at the end of the
(non-variadic) __WINE_DPRINTF_ONCE macro. wine_dbg_printf is a variadic
function, any code after that function call breaks the macro (so a
';}while(0)' can't be added to close the scope). AFAIK, this is the
reason why a do{...}while(0) loop can't be used as it's done in the others.
Now I was wondering if there is a solution to this, or if it's ok to
implement the _ONCE variants with the current patch. Using the current
patch would mean that with a compiler that doesn't support C99, you
would still have you at lot of the FIXMEs/WARNs where you don't want
them. This would not be a problem right after the implementation, but
only after replacing constructions like
static int once;
if(!once++)
FIXME()
with the corresponding _ONCE(). It wouldn't really break anything though.
Also, it'd probably be better to replace
#elif defined(__SUNPRO_C)
with something like
#elif __STDC_VERSION__ >= 199901L
because that's what you're actually looking for. This would mean that
the non-variadic _ONCE implementation is less of a problem, because more
compilers would use the variadic __WINE_DPRINTF_ONCE macro. The #ifdef
__GNUC__ would still remain because of their own implementation of
variadic macros (from before C99).
Have a happy new year!
Sven
---
include/wine/debug.h | 44 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 43 insertions(+), 1 deletions(-)