diff --git a/tools/spi-hdlc-adapter/spi-hdlc-adapter.c b/tools/spi-hdlc-adapter/spi-hdlc-adapter.c index 6d8707d0f..cc1f3e138 100644 --- a/tools/spi-hdlc-adapter/spi-hdlc-adapter.c +++ b/tools/spi-hdlc-adapter/spi-hdlc-adapter.c @@ -27,6 +27,10 @@ #define _GNU_SOURCE 1 +#if HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include @@ -46,7 +50,10 @@ #include #include + +#if HAVE_EXECINFO_H #include +#endif #if HAVE_PTY_H #include @@ -70,10 +77,6 @@ #define EXIT_QUIT 65535 -#ifndef FAULT_BACKTRACE_STACK_DEPTH -#define FAULT_BACKTRACE_STACK_DEPTH 20 -#endif - #ifndef MSEC_PER_SEC #define MSEC_PER_SEC 1000 #endif @@ -95,6 +98,12 @@ #define SOCKET_DEBUG_BYTES_PER_LINE 16 +#ifndef AUTO_PRINT_BACKTRACE +#define AUTO_PRINT_BACKTRACE (HAVE_EXECINFO_H || __APPLE__) +#endif + +#define AUTO_PRINT_BACKTRACE_STACK_DEPTH 20 + static const uint8_t kHdlcResetSignal[] = { 0x7E, 0x13, 0x11, 0x7E }; static const uint16_t kHdlcCrcCheckValue = 0xf0b8; static const uint16_t kHdlcCrcResetValue = 0xffff; @@ -209,12 +218,13 @@ static void signal_SIGHUP(int sig) (void) sig; } +#if AUTO_PRINT_BACKTRACE static void signal_critical(int sig, siginfo_t * info, void * ucontext) { // This is the last hurah for this process. // We dump the stack, because that's all we can do. - void *stack_mem[FAULT_BACKTRACE_STACK_DEPTH]; + void *stack_mem[AUTO_PRINT_BACKTRACE_STACK_DEPTH]; void **stack = stack_mem; char **stack_symbols; int stack_depth, i; @@ -236,7 +246,7 @@ static void signal_critical(int sig, siginfo_t * info, void * ucontext) fprintf(stderr, " *** FATAL ERROR: Caught signal %d (%s):\n", sig, strsignal(sig)); - stack_depth = backtrace(stack, FAULT_BACKTRACE_STACK_DEPTH); + stack_depth = backtrace(stack, AUTO_PRINT_BACKTRACE_STACK_DEPTH); // Here are are trying to update the pointer in the backtrace // to be the actual location of the fault. @@ -267,6 +277,7 @@ static void signal_critical(int sig, siginfo_t * info, void * ucontext) exit(EXIT_FAILURE); } +#endif // if AUTO_PRINT_BACKTRACE static void log_debug_buffer(const char* desc, const uint8_t* buffer_ptr, int buffer_len) { @@ -1214,12 +1225,17 @@ int main(int argc, char *argv[]) { int i = 0; const char* prog = argv[0]; - struct sigaction sigact; static fd_set read_set; static fd_set write_set; static fd_set error_set; struct timeval timeout; int max_fd = -1; + bool did_print_rate_limit_log = false; + +#if AUTO_PRINT_BACKTRACE + struct sigaction sigact; +#endif // if AUTO_PRINT_BACKTRACE + enum { ARG_SPI_MODE = 1001, ARG_SPI_SPEED = 1002, @@ -1257,6 +1273,7 @@ int main(int argc, char *argv[]) sPreviousHandlerForSIGTERM = signal(SIGTERM, &signal_SIGTERM); signal(SIGHUP, &signal_SIGHUP); +#if AUTO_PRINT_BACKTRACE sigact.sa_sigaction = &signal_critical; sigact.sa_flags = SA_RESTART | SA_SIGINFO | SA_NOCLDWAIT; @@ -1264,7 +1281,7 @@ int main(int argc, char *argv[]) sigaction(SIGBUS, &sigact, (struct sigaction *)NULL); sigaction(SIGILL, &sigact, (struct sigaction *)NULL); sigaction(SIGABRT, &sigact, (struct sigaction *)NULL); - +#endif // if AUTO_PRINT_BACKTRACE // ======================================================================== // ARGUMENT PARSING @@ -1481,13 +1498,19 @@ int main(int argc, char *argv[]) { // We are being rate-limited by the NCP. timeout_ms = SPI_POLL_PERIOD_MSEC; - syslog(LOG_INFO, "Rate limiting transactions"); + + if (!did_print_rate_limit_log) { + // Avoid printing out this message over and over. + syslog(LOG_INFO, "NCP is rate limiting transactions"); + did_print_rate_limit_log = true; + } } else { // We have data to send to the slave. Unless we // are being rate-limited, proceed immediately. timeout_ms = 0; + did_print_rate_limit_log = false; } if (sSpiRxPayloadSize != 0)