[sheepdog] [PATCH RFC] sheep: remove assert() for better error messages
Hitoshi Mitake
h.mitake at gmail.com
Fri Oct 5 13:04:55 CEST 2012
On Wed, Oct 3, 2012 at 11:26 AM, MORITA Kazutaka
<morita.kazutaka at lab.ntt.co.jp> wrote:
> At Mon, 1 Oct 2012 22:34:25 +0900,
> Hitoshi Mitake wrote:
>>
>> diff --git a/include/sd_assert.h b/include/sd_assert.h
>> new file mode 100644
>> index 0000000..05c553e
>> --- /dev/null
>> +++ b/include/sd_assert.h
>> @@ -0,0 +1,31 @@
>> +#ifndef SD_ASSERT_H
>> +#define SD_ASSERT_H
>> +
>> +#include "logger.h"
>> +#include "daemonize.h"
>> +
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +
>> +#ifdef assert
>> +#error "don't include assert.h directly"
>> +#endif
>> +
>> +#define assert(expr) do { \
>> + if (expr) \
>> + break; \
>> + \
>> + if (is_daemonized()) { \
>> + vprintf(SDOG_ERR, "assert: %s:%d: %s: " \
>> + "Asserting `%s' failed.\n", \
>> + __FILE__, __LINE__, __func__, #expr); \
>> + } else { \
>> + fprintf(stderr, "assert: %s:%d: %s: " \
>> + "Asserting `%s' failed.\n", \
>> + __FILE__, __LINE__, __func__, #expr); \
>> + } \
>> + \
>> + abort(); \
>> + } while (0)
>> +
>> +#endif /* SD_ASSERT_H */
>
> Some comments:
>
> - assert() should do nothing when NDEBUG is defined.
> - I think the log level should be SDOG_EMERG rather than SDOG_ERR.
> - How about using vprintf in any case? vprintf prints message to
> stderr when the program is running in foreground.
> - How about define assert in lib/util.h directly?
>
> Then, I think the definition should be something like the following.
>
> =
> #ifdef assert
> #undef assert
> #endif
>
> #ifdef NDEBUG
> #define assert(e) ((void)0)
> #else
> #define assert(e) (!(e) && panic(....))
> #endif
> ==
Thanks for your comments.
I'll update my patch based on your comments and post it later.
Thanks,
Hitoshi
More information about the sheepdog
mailing list