openocd: fix simple cases of Yoda condition
[openocd.git] / src / helper / log.c
index ae26df5a1cf7c3913141c9de16ec92aa23e1eee1..785a8bded6bed6f29732133d88ef645114bdff9f 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "log.h"
 #include "command.h"
+#include "replacements.h"
 #include "time_support.h"
 
 #include <stdarg.h>
@@ -40,7 +41,7 @@
 #endif
 #endif
 
-int debug_level = -1;
+int debug_level = LOG_LVL_INFO;
 
 static FILE *log_output;
 static struct log_callback *log_callbacks;
@@ -91,6 +92,14 @@ static void log_puts(enum log_levels level,
        const char *string)
 {
        char *f;
+
+       if (!log_output) {
+               /* log_init() not called yet; print on stderr */
+               fputs(string, stderr);
+               fflush(stderr);
+               return;
+       }
+
        if (level == LOG_LVL_OUTPUT) {
                /* do not prepend any headers, just print out what we were given and return */
                fputs(string, log_output);
@@ -277,9 +286,6 @@ void log_init(void)
 {
        /* set defaults for daemon configuration,
         * if not set by cmdline or cfgfile */
-       if (debug_level == -1)
-               debug_level = LOG_LVL_INFO;
-
        char *debug_env = getenv("OPENOCD_DEBUG_LEVEL");
        if (NULL != debug_env) {
                int value;
@@ -401,25 +407,43 @@ char *alloc_printf(const char *format, ...)
  * fast when invoked more often than every 500ms.
  *
  */
-void keep_alive()
+#define KEEP_ALIVE_KICK_TIME_MS  500
+#define KEEP_ALIVE_TIMEOUT_MS   1000
+
+static void gdb_timeout_warning(int64_t delta_time)
+{
+       extern int gdb_actual_connections;
+
+       if (gdb_actual_connections)
+               LOG_WARNING("keep_alive() was not invoked in the "
+                       "%d ms timelimit. GDB alive packet not "
+                       "sent! (%" PRId64 " ms). Workaround: increase "
+                       "\"set remotetimeout\" in GDB",
+                       KEEP_ALIVE_TIMEOUT_MS,
+                       delta_time);
+       else
+               LOG_DEBUG("keep_alive() was not invoked in the "
+                       "%d ms timelimit (%" PRId64 " ms). This may cause "
+                       "trouble with GDB connections.",
+                       KEEP_ALIVE_TIMEOUT_MS,
+                       delta_time);
+}
+
+void keep_alive(void)
 {
        current_time = timeval_ms();
-       if (current_time-last_time > 1000) {
-               extern int gdb_actual_connections;
-
-               if (gdb_actual_connections)
-                       LOG_WARNING("keep_alive() was not invoked in the "
-                               "1000ms timelimit. GDB alive packet not "
-                               "sent! (%" PRId64 "). Workaround: increase "
-                               "\"set remotetimeout\" in GDB",
-                               current_time-last_time);
-               else
-                       LOG_DEBUG("keep_alive() was not invoked in the "
-                               "1000ms timelimit (%" PRId64 "). This may cause "
-                               "trouble with GDB connections.",
-                               current_time-last_time);
+
+       int64_t delta_time = current_time - last_time;
+
+       if (delta_time > KEEP_ALIVE_TIMEOUT_MS) {
+               last_time = current_time;
+
+               gdb_timeout_warning(delta_time);
        }
-       if (current_time-last_time > 500) {
+
+       if (delta_time > KEEP_ALIVE_KICK_TIME_MS) {
+               last_time = current_time;
+
                /* this will keep the GDB connection alive */
                LOG_USER_N("%s", "");
 
@@ -430,26 +454,30 @@ void keep_alive()
                 *
                 * These functions should be invoked at a well defined spot in server.c
                 */
-
-               last_time = current_time;
        }
 }
 
 /* reset keep alive timer without sending message */
-void kept_alive()
+void kept_alive(void)
 {
        current_time = timeval_ms();
+
+       int64_t delta_time = current_time - last_time;
+
        last_time = current_time;
+
+       if (delta_time > KEEP_ALIVE_TIMEOUT_MS)
+               gdb_timeout_warning(delta_time);
 }
 
-/* if we sleep for extended periods of time, we must invoke keep_alive() intermittantly */
+/* if we sleep for extended periods of time, we must invoke keep_alive() intermittently */
 void alive_sleep(uint64_t ms)
 {
-       uint64_t napTime = 10;
-       for (uint64_t i = 0; i < ms; i += napTime) {
+       uint64_t nap_time = 10;
+       for (uint64_t i = 0; i < ms; i += nap_time) {
                uint64_t sleep_a_bit = ms - i;
-               if (sleep_a_bit > napTime)
-                       sleep_a_bit = napTime;
+               if (sleep_a_bit > nap_time)
+                       sleep_a_bit = nap_time;
 
                usleep(sleep_a_bit * 1000);
                keep_alive();
@@ -466,7 +494,7 @@ void busy_sleep(uint64_t ms)
        }
 }
 
-/* Maximum size of socket error message retreived from operation system */
+/* Maximum size of socket error message retrieved from operation system */
 #define MAX_SOCKET_ERR_MSG_LENGTH 256
 
 /* Provide log message for the last socket error.
@@ -490,3 +518,16 @@ void log_socket_error(const char *socket_desc)
        LOG_ERROR("Error on socket '%s': errno==%d, message: %s.", socket_desc, error_code, strerror(error_code));
 #endif
 }
+
+/**
+ * Find the first non-printable character in the char buffer, return a pointer to it.
+ * If no such character exists, return NULL.
+ */
+char *find_nonprint_char(char *buf, unsigned buf_len)
+{
+       for (unsigned int i = 0; i < buf_len; i++) {
+               if (!isprint(buf[i]))
+                       return buf + i;
+       }
+       return NULL;
+}

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)