]> granicus.if.org Git - esp-idf/commitdiff
feat(log): add tags only when no one exist, otherwise refresh linked list and cache.
authormichael <xiaoxufeng@espressif.com>
Fri, 25 Aug 2017 03:46:55 +0000 (11:46 +0800)
committermichael <xiaoxufeng@espressif.com>
Mon, 28 Aug 2017 08:25:40 +0000 (16:25 +0800)
components/log/log.c

index 07f8135a41b84680a25c1dcdd82d7d5c06bdab21..33ebc2da41089c60b0c38fb66f6a3192a624c5e4 100644 (file)
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 /*
- * Log library รข\80implementation notes.
+ * Log library implementation notes.
  *
  * Log library stores all tags provided to esp_log_level_set as a linked
  * list. See uncached_tag_entry_t structure.
@@ -122,16 +122,40 @@ void esp_log_level_set(const char* tag, esp_log_level_t level)
         return;
     }
 
-    // allocate new linked list entry and append it to the head of the list
-    size_t entry_size = offsetof(uncached_tag_entry_t, tag) + strlen(tag) + 1;
-    uncached_tag_entry_t* new_entry = (uncached_tag_entry_t*) malloc(entry_size);
-    if (!new_entry) {
-        xSemaphoreGive(s_log_mutex);
-        return;
+    //searching exist tag
+    uncached_tag_entry_t *it = NULL;
+    SLIST_FOREACH( it, &s_log_tags, entries ) {
+        if ( strcmp(it->tag, tag)==0 ) {
+            //one tag in the linked list match, update the level
+            it->level = level;
+            //quit with it != NULL
+            break;
+        }
+    }
+    //no exist tag, append new one
+    if ( it == NULL ) {
+        // allocate new linked list entry and append it to the head of the list
+        size_t entry_size = offsetof(uncached_tag_entry_t, tag) + strlen(tag) + 1;
+        uncached_tag_entry_t* new_entry = (uncached_tag_entry_t*) malloc(entry_size);
+        if (!new_entry) {
+            xSemaphoreGive(s_log_mutex);
+            return;
+        }
+        new_entry->level = (uint8_t) level;
+        strcpy(new_entry->tag, tag);
+        SLIST_INSERT_HEAD( &s_log_tags, new_entry, entries );
+    }
+
+    //search in the cache and update it if exist         
+    for (int i = 0; i < s_log_cache_entry_count; ++i) {
+#ifdef LOG_BUILTIN_CHECKS
+        assert(i == 0 || s_log_cache[(i - 1) / 2].generation < s_log_cache[i].generation);
+#endif
+        if (s_log_cache[i].tag == tag) {
+            s_log_cache[i].level = level;
+            break;
+        }
     }
-    new_entry->level = (uint8_t) level;
-    strcpy(new_entry->tag, tag);
-    SLIST_INSERT_HEAD( &s_log_tags, new_entry, entries );
     xSemaphoreGive(s_log_mutex);
 }