flush all cookies upon termination.
authorHannes Gredler <hannes@gredler.at>
Tue, 13 May 2008 20:06:35 +0000 (22:06 +0200)
committerHannes Gredler <hannes@gredler.at>
Tue, 13 May 2008 20:06:35 +0000 (22:06 +0200)
free all memory pools upon cookie deletion.

src/main.c
src/olsr_cookie.c
src/olsr_cookie.h

index fa8f0af..9c3776b 100644 (file)
@@ -502,6 +502,9 @@ olsr_shutdown(int signal __attribute__((unused)))
   close(olsr_cnf->rts);
 #endif
 
+  /* Free cookies and memory pools attached. */
+  olsr_delete_all_cookies();
+
   olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version);
 
   OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n           http://www.olsr.org\n", olsrd_version);
index 09d6a3b..220dc0b 100644 (file)
@@ -102,6 +102,7 @@ olsr_alloc_cookie(const char *cookie_name, olsr_cookie_type cookie_type)
 void
 olsr_free_cookie(struct olsr_cookie_info *ci)
 {
+  struct list_node *memory_list;
 
   /* Mark the cookie as unused */
   cookies[ci->ci_id] = NULL;
@@ -110,9 +111,36 @@ olsr_free_cookie(struct olsr_cookie_info *ci)
   if (ci->ci_name) {
     free(ci->ci_name);
   }
+
+  /* Flush all the memory on the free list */
+  while (!list_is_empty(&ci->ci_free_list)) {
+    memory_list = ci->ci_free_list.next;
+    list_remove(memory_list);
+    free(memory_list);
+  }
+
   free(ci);
 }
 
+/*
+ * Flush all cookies. This is really only called upon shutdown.
+ */
+void
+olsr_delete_all_cookies(void)
+{
+  int ci_index;
+
+  /*
+   * Walk the full index range and kill 'em all.
+   */
+  for (ci_index = 1; ci_index < COOKIE_ID_MAX; ci_index++) {
+    if (!cookies[ci_index]) {
+      continue;
+    }
+    olsr_free_cookie(cookies[ci_index]);
+  }
+}
+
 /*
  * Set the size for fixed block allocations.
  * This is only allowed for memory cookies.
index 0d57251..24a38d1 100644 (file)
@@ -84,6 +84,7 @@ struct olsr_cookie_mem_brand {
 extern struct olsr_cookie_info *olsr_alloc_cookie(const char *,
                                                  olsr_cookie_type);
 extern void olsr_free_cookie(struct olsr_cookie_info *);
+extern void olsr_delete_all_cookies(void);
 extern char *olsr_cookie_name(olsr_cookie_t);
 extern void olsr_cookie_set_memory_size(struct olsr_cookie_info *, size_t);
 extern void olsr_cookie_usage_incr(olsr_cookie_t);