[OpenAFS-devel] Re: osi_Panic on AIX and IRIX

Tom Keiser tkeiser@sinenomine.net
Wed, 10 Feb 2010 02:30:16 -0500 (EST)


On Tue, 9 Feb 2010, Garrett Wollman wrote:

> <<On Tue, 9 Feb 2010 23:50:25 -0500, Tom Keiser <tkeiser@sinenomine.net> said:
>
>> #ifdef AFS_AIX_ENV
>> #define osi_Panic(buf, ...) \
>>     do { \
>>         printf(buf, __VA_ARGS__); \
>>         panic(buf); \
>>     } while (0)
>> #endif
>
> If you're willing to use fancy C99 macro stuff, then why not:
>
> #ifdef AFS_PANIC_DOES_THE_RIGHT_THING
> #define osi_Panic panic
> #else
> #define osi_Panic(...) \
> 	do { \
> 		printf(__VA_ARGS__); \
> 		osi_DoPanic(__VA_ARGS__); \

Since AIX (and I think IRIX as well) kernel crash dumps include the panic 
string, I'd probably tweak this slightly:


extern char * osi_panic_msg;

#ifdef AFS_PANIC_DOES_THE_RIGHT_THING
#define osi_Panic panic
#else
#define osi_Panic(...) \
     do { \
         printf(__VA_ARGS__); \
         sprintf(osi_panic_msg, __VA_ARGS__); \
         osi_DoPanic(osi_panic_msg); \
     } while (0)

void
osi_DoPanic(const char * msg)
{
     panic(msg);
}

Admittedly, it's racy, but more helpful in the common case.


> 	} while (0)
>
> static void __inline

We'd probably just declare osi_DoPanic as extern to get around the whole 
inlining portability mess.


> osi_DoPanic(const char *fmt, ...)
> {
> 	panic(fmt);
> }
> #endif
>
> Or does it still require an extra lead-in argument there?
>

I think you're right that eliminating the lead-in argument is the right 
way to do this (verified on xlC).

-Tom