Kaynağa Gözat

return old handler from esp_log_set_vprintf()

Merges #1286
Andrew Dikarev 8 yıl önce
ebeveyn
işleme
08ba79cc2b
2 değiştirilmiş dosya ile 16 ekleme ve 4 silme
  1. 6 3
      components/log/include/esp_log.h
  2. 10 1
      components/log/log.c

+ 6 - 3
components/log/include/esp_log.h

@@ -55,11 +55,14 @@ void esp_log_level_set(const char* tag, esp_log_level_t level);
  * @brief Set function used to output log entries
  *
  * By default, log output goes to UART0. This function can be used to redirect log
- * output to some other destination, such as file or network.
+ * output to some other destination, such as file or network. Returns the original
+ * log handler, which may be necessary to return output to the previous destination.
  *
- * @param func Function used for output. Must have same signature as vprintf.
+ * @param func new Function used for output. Must have same signature as vprintf.
+ *
+ * @return func old Function used for output.
  */
-void esp_log_set_vprintf(vprintf_like_t func);
+vprintf_like_t esp_log_set_vprintf(vprintf_like_t func);
 
 /**
  * @brief Function which returns timestamp to be used in log output

+ 10 - 1
components/log/log.c

@@ -106,9 +106,18 @@ static inline void heap_swap(int i, int j);
 static inline bool should_output(esp_log_level_t level_for_message, esp_log_level_t level_for_tag);
 static inline void clear_log_level_list();
 
-void esp_log_set_vprintf(vprintf_like_t func)
+vprintf_like_t esp_log_set_vprintf(vprintf_like_t func)
 {
+    if (!s_log_mutex) {
+        s_log_mutex = xSemaphoreCreateMutex();
+    }
+    xSemaphoreTake(s_log_mutex, portMAX_DELAY);
+
+    vprintf_like_t orig_func = s_log_print_func;
     s_log_print_func = func;
+
+    xSemaphoreGive(s_log_mutex);
+    return orig_func;
 }
 
 void esp_log_level_set(const char* tag, esp_log_level_t level)