|
@@ -26,30 +26,26 @@ static inline void sigsafe_printf(const char *format, ...)
|
|
|
{
|
|
|
va_list ap;
|
|
|
|
|
|
- va_start(ap, format);
|
|
|
if (!dprint_in_signal) {
|
|
|
+ va_start(ap, format);
|
|
|
vprintf(format, ap);
|
|
|
+ va_end(ap);
|
|
|
} else {
|
|
|
int ret;
|
|
|
- int len = vsnprintf(dprint_in_signal_buffer,
|
|
|
- DPRINT_IN_SIGNAL_BUF_SIZE,
|
|
|
- format, ap);
|
|
|
/*
|
|
|
- * len is amount that would have been printed,
|
|
|
- * but actual write is truncated at BUF_SIZE.
|
|
|
+ * No printf() functions are signal-safe.
|
|
|
+ * They deadlock easily. Write the format
|
|
|
+ * string to get some output, even if
|
|
|
+ * incomplete.
|
|
|
*/
|
|
|
- if (len > DPRINT_IN_SIGNAL_BUF_SIZE)
|
|
|
- len = DPRINT_IN_SIGNAL_BUF_SIZE;
|
|
|
- ret = write(1, dprint_in_signal_buffer, len);
|
|
|
+ ret = write(1, format, strlen(format));
|
|
|
if (ret < 0)
|
|
|
- abort();
|
|
|
+ exit(1);
|
|
|
}
|
|
|
- va_end(ap);
|
|
|
}
|
|
|
#define dprintf_level(level, args...) do { \
|
|
|
if (level <= DEBUG_LEVEL) \
|
|
|
sigsafe_printf(args); \
|
|
|
- fflush(NULL); \
|
|
|
} while (0)
|
|
|
#define dprintf0(args...) dprintf_level(0, args)
|
|
|
#define dprintf1(args...) dprintf_level(1, args)
|