commit 4442930: [Minor] Fix free logic reversal (as dtors are now in variables themselves)

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Jan 27 16:35:06 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-01-27 16:27:35 +0000
URL: https://github.com/rspamd/rspamd/commit/4442930ade090c47aacdaceaf4fffb83f392e018

[Minor] Fix free logic reversal (as dtors are now in variables themselves)

---
 src/libutil/mem_pool.c | 111 ++++++++++++++++++++++++++-----------------------
 1 file changed, 60 insertions(+), 51 deletions(-)

diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c
index 9644485f4..357e8b693 100644
--- a/src/libutil/mem_pool.c
+++ b/src/libutil/mem_pool.c
@@ -715,6 +715,53 @@ rspamd_mempool_adjust_entry (struct rspamd_mempool_entry_point *e)
 	memset (e->elts, 0, sizeof (e->elts));
 }
 
+static void
+rspamd_mempool_variables_cleanup (rspamd_mempool_t * pool)
+{
+	if (pool->priv->variables) {
+		struct rspamd_mempool_variable *var;
+		kh_foreach_value_ptr (pool->priv->variables, var, {
+			if (var->dtor) {
+				var->dtor (var->data);
+			}
+		});
+
+		if (pool->priv->entry && pool->priv->entry->cur_vars <
+								 kh_size (pool->priv->variables)) {
+			/*
+			 * Increase preallocated size in two cases:
+			 * 1) Our previous guess was zero
+			 * 2) Our new variables count is not more than twice larger than
+			 * previous count
+			 * 3) Our variables count is less than some hard limit
+			 */
+			static const guint max_preallocated_vars = 512;
+
+			guint cur_size = kh_size (pool->priv->variables);
+			guint old_guess = pool->priv->entry->cur_vars;
+			guint new_guess;
+
+			if (old_guess == 0) {
+				new_guess = MIN (cur_size, max_preallocated_vars);
+			}
+			else {
+				if (old_guess * 2 < cur_size) {
+					new_guess = MIN (cur_size, max_preallocated_vars);
+				}
+				else {
+					/* Too large step */
+					new_guess = MIN (old_guess * 2, max_preallocated_vars);
+				}
+			}
+
+			pool->priv->entry->cur_vars = new_guess;
+		}
+
+		kh_destroy (rspamd_mempool_vars_hash, pool->priv->variables);
+		pool->priv->variables = NULL;
+	}
+}
+
 void
 rspamd_mempool_destructors_enforce (rspamd_mempool_t *pool)
 {
@@ -731,6 +778,8 @@ rspamd_mempool_destructors_enforce (rspamd_mempool_t *pool)
 
 	pool->priv->dtors_head = pool->priv->dtors_tail = NULL;
 
+	rspamd_mempool_variables_cleanup (pool);
+
 	POOL_MTX_UNLOCK ();
 }
 
@@ -824,6 +873,17 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
 		}
 	}
 
+	rspamd_mempool_variables_cleanup (pool);
+
+	if (pool->priv->trash_stack) {
+		for (i = 0; i < pool->priv->trash_stack->len; i++) {
+			ptr = g_ptr_array_index (pool->priv->trash_stack, i);
+			g_free (ptr);
+		}
+
+		g_ptr_array_free (pool->priv->trash_stack, TRUE);
+	}
+
 	for (i = 0; i < G_N_ELEMENTS (pool->priv->pools); i ++) {
 		if (pool->priv->pools[i]) {
 			LL_FOREACH_SAFE (pool->priv->pools[i], cur, tmp) {
@@ -846,57 +906,6 @@ rspamd_mempool_delete (rspamd_mempool_t * pool)
 		}
 	}
 
-	if (pool->priv->variables) {
-		struct rspamd_mempool_variable *var;
-		kh_foreach_value_ptr (pool->priv->variables, var, {
-			if (var->dtor) {
-				var->dtor (var->data);
-			}
-		});
-
-		if (pool->priv->entry && pool->priv->entry->cur_vars <
-			kh_size (pool->priv->variables)) {
-			/*
-			 * Increase preallocated size in two cases:
-			 * 1) Our previous guess was zero
-			 * 2) Our new variables count is not more than twice larger than
-			 * previous count
-			 * 3) Our variables count is less than some hard limit
-			 */
-			static const guint max_preallocated_vars = 512;
-
-			guint cur_size = kh_size (pool->priv->variables);
-			guint old_guess = pool->priv->entry->cur_vars;
-			guint new_guess;
-
-			if (old_guess == 0) {
-				new_guess = MIN (cur_size, max_preallocated_vars);
-			}
-			else {
-				if (old_guess * 2 < cur_size) {
-					new_guess = MIN (cur_size, max_preallocated_vars);
-				}
-				else {
-					/* Too large step */
-					new_guess = MIN (old_guess * 2, max_preallocated_vars);
-				}
-			}
-
-			pool->priv->entry->cur_vars = new_guess;
-		}
-
-		kh_destroy (rspamd_mempool_vars_hash, pool->priv->variables);
-	}
-
-	if (pool->priv->trash_stack) {
-		for (i = 0; i < pool->priv->trash_stack->len; i++) {
-			ptr = g_ptr_array_index (pool->priv->trash_stack, i);
-			g_free (ptr);
-		}
-
-		g_ptr_array_free (pool->priv->trash_stack, TRUE);
-	}
-
 	g_atomic_int_inc (&mem_pool_stat->pools_freed);
 	POOL_MTX_UNLOCK ();
 	free (pool); /* allocated by posix_memalign */


More information about the Commits mailing list