changeset 21489:3309fe3ea47b

lib-storage: Don't duplicate service user's settings into mail_user The mail_storage_service_user.user_set isn't used afterwards, so it can be directly used to avoid wasting memory.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sat, 04 Feb 2017 13:51:13 +0200
parents e97bc5dcf420
children a2cca53d71d2
files src/lib-storage/mail-storage-service.c src/lib-storage/mail-user.c src/lib-storage/mail-user.h
diffstat 3 files changed, 34 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage-service.c	Sat Feb 04 13:38:17 2017 +0200
+++ b/src/lib-storage/mail-storage-service.c	Sat Feb 04 13:51:13 2017 +0200
@@ -647,8 +647,8 @@
 
 	/* NOTE: if more user initialization is added, add it also to
 	   mail_user_dup() */
-	mail_user = mail_user_alloc(user->input.username, user->user_info,
-				    user->user_set);
+	mail_user = mail_user_alloc_nodup_set(user->input.username,
+					      user->user_info, user->user_set);
 	mail_user->_service_user = user;
 	mail_user_set_home(mail_user, *home == '\0' ? NULL : home);
 	mail_user_set_vars(mail_user, ctx->service->name,
@@ -730,6 +730,7 @@
 			return -1;
 		}
 	}
+
 	*mail_user_r = mail_user;
 	return 0;
 }
--- a/src/lib-storage/mail-user.c	Sat Feb 04 13:38:17 2017 +0200
+++ b/src/lib-storage/mail-user.c	Sat Feb 04 13:51:13 2017 +0200
@@ -43,24 +43,23 @@
 {
 }
 
-struct mail_user *mail_user_alloc(const char *username,
-				  const struct setting_parser_info *set_info,
-				  const struct mail_user_settings *set)
+static struct mail_user *
+mail_user_alloc_int(const char *username,
+		    const struct setting_parser_info *set_info,
+		    const struct mail_user_settings *set, pool_t pool)
 {
 	struct mail_user *user;
 	const char *error;
-	pool_t pool;
 
 	i_assert(username != NULL);
 	i_assert(*username != '\0');
 
-	pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
 	user = p_new(pool, struct mail_user, 1);
 	user->pool = pool;
 	user->refcount = 1;
 	user->username = p_strdup(pool, username);
 	user->set_info = set_info;
-	user->unexpanded_set = settings_dup(set_info, set, pool);
+	user->unexpanded_set = set;
 	user->set = settings_dup_with_pointers(set_info, user->unexpanded_set, pool);
 	user->service = master_service_get_name(master_service);
 	user->default_normalizer = uni_utf8_to_decomposed_titlecase;
@@ -77,6 +76,28 @@
 	return user;
 }
 
+struct mail_user *
+mail_user_alloc_nodup_set(const char *username,
+			  const struct setting_parser_info *set_info,
+			  const struct mail_user_settings *set)
+{
+	pool_t pool;
+
+	pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
+	return mail_user_alloc_int(username, set_info, set, pool);
+}
+
+struct mail_user *mail_user_alloc(const char *username,
+				  const struct setting_parser_info *set_info,
+				  const struct mail_user_settings *set)
+{
+	pool_t pool;
+
+	pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
+	return mail_user_alloc_int(username, set_info,
+				   settings_dup(set_info, set, pool), pool);
+}
+
 static void
 mail_user_expand_plugins_envs(struct mail_user *user)
 {
--- a/src/lib-storage/mail-user.h	Sat Feb 04 13:38:17 2017 +0200
+++ b/src/lib-storage/mail-user.h	Sat Feb 04 13:51:13 2017 +0200
@@ -116,6 +116,10 @@
 struct mail_user *mail_user_alloc(const char *username,
 				  const struct setting_parser_info *set_info,
 				  const struct mail_user_settings *set);
+struct mail_user *
+mail_user_alloc_nodup_set(const char *username,
+			  const struct setting_parser_info *set_info,
+			  const struct mail_user_settings *set);
 /* Returns -1 if settings were invalid. */
 int mail_user_init(struct mail_user *user, const char **error_r);