fatal-signal: Clean up code by using shash.
authorBen Pfaff <blp@nicira.com>
Mon, 21 Sep 2009 19:38:58 +0000 (12:38 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 21 Sep 2009 23:44:57 +0000 (16:44 -0700)
This simplifies the code here and should speed it up, too, when there are
lots of files to unlink on a fatal signal.

lib/fatal-signal.c

index fc126caa95192a1c3577fbdb9dd38123c59558e9..ff011363e307b8dce9b1e1a70a6a1b3cef6da975 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include "shash.h"
 #include "util.h"
 
 /* Signals to catch. */
@@ -165,8 +166,7 @@ call_hooks(int sig_nr)
     }
 }
 \f
-static char **files;
-static size_t n_files, max_files;
+static struct shash files = SHASH_INITIALIZER(&files);
 
 static void unlink_files(void *aux);
 static void do_unlink_files(void);
@@ -183,10 +183,9 @@ fatal_signal_add_file_to_unlink(const char *file)
     }
 
     fatal_signal_block();
-    if (n_files >= max_files) {
-        files = x2nrealloc(files, &max_files, sizeof *files);
+    if (!shash_find(&files, file)) {
+        shash_add(&files, file, NULL);
     }
-    files[n_files++] = xstrdup(file);
     fatal_signal_unblock();
 }
 
@@ -195,15 +194,12 @@ fatal_signal_add_file_to_unlink(const char *file)
 void
 fatal_signal_remove_file_to_unlink(const char *file)
 {
-    size_t i;
+    struct shash_node *node;
 
     fatal_signal_block();
-    for (i = 0; i < n_files; i++) {
-        if (!strcmp(files[i], file)) {
-            free(files[i]);
-            files[i] = files[--n_files];
-            break;
-        }
+    node = shash_find(&files, file);
+    if (node) {
+        shash_delete(&files, node);
     }
     fatal_signal_unblock();
 }
@@ -217,10 +213,10 @@ unlink_files(void *aux UNUSED)
 static void
 do_unlink_files(void)
 {
-    size_t i;
+    struct shash_node *node;
 
-    for (i = 0; i < n_files; i++) {
-        unlink(files[i]);
+    SHASH_FOR_EACH (node, &files) {
+        unlink(node->name);
     }
 }
 \f