Add tree freeing to avoid valgrind lightning storm
authorRaphaël Gertz <git@rapsys.eu>
Tue, 5 Jul 2016 16:35:22 +0000 (18:35 +0200)
committerRaphaël Gertz <git@rapsys.eu>
Tue, 5 Jul 2016 16:35:22 +0000 (18:35 +0200)
README
analyse.c

diff --git a/README b/README
index 898574b..59e7822 100644 (file)
--- a/README
+++ b/README
@@ -14,3 +14,6 @@ Run analyse.c:
 
 Run analyse.c tests:
 ./cunittest
+
+Valgrind check:
+valgrind --leak-check=full --show-leak-kinds=all ./analyse sirens_fxt.txt
index 1adcdd9..08b8e03 100644 (file)
--- a/analyse.c
+++ b/analyse.c
@@ -50,9 +50,12 @@ struct leaf {
        unsigned count;
 };
 
-/* Lookup leaf prototype */
+/* Lookup leaf function prototype */
 struct leaf *lookupLeaf(void **, const char *, unsigned);
 
+/* Freeing node function prototype */
+void freeTree(void *, unsigned);
+
 /* Main function */
 int main(int argc, char **argv) {
 
@@ -140,6 +143,9 @@ int main(int argc, char **argv) {
        /* Read until end of file */
        } while (ret != 0);
 
+       /* Free tree */
+       freeTree(tree, 0);
+
        /* Close file */
        if (close(fd) == -1) {
                perror("Close failed");
@@ -153,6 +159,36 @@ int main(int argc, char **argv) {
        exit(EXIT_SUCCESS);
 }
 
+/* Recursive freeing of node function */
+void freeTree(void *base, unsigned index) {
+       void *current = base, *next;
+       if (base != NULL) {
+               /* Branch level */
+               if (index < 8) {
+                       /* Free horizontaly */
+                       do {
+                               /* Free children */
+                               if (((struct branch *)current)->child != NULL) {
+                                       freeTree(((struct branch *)current)->child, index + 1);
+                               }
+                               /* Free current and switch to next */
+                               next = ((struct branch *)current)->next;
+                               free(current);
+                               current = next;
+                       } while (current != NULL);
+               /* Leaf level */
+               } else {
+                       /* Free horizontaly */
+                       do {
+                               /* Free current and switch to next */
+                               next = ((struct leaf *)current)->next;
+                               free(current);
+                               current = next;
+                       } while (current != NULL);
+               }
+       }
+}
+
 /* Recursive lookup and populate tree function */
 struct leaf *lookupLeaf(void **base, const char *key, unsigned index) {
        /* Return leaf */