changeset 9623:3da42dafa798 HEAD

buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
author Timo Sirainen <tss@iki.fi>
date Mon, 13 Jul 2009 21:11:05 -0400
parents cae78e734cdb
children 2558ba736207
files src/lib-index/mail-index-map.c src/lib-index/mail-index-modseq.c src/lib-index/mail-index-transaction-export.c src/lib-index/mail-transaction-log-file.c src/lib-index/mail-transaction-log-private.h src/lib-index/mail-transaction-log-view.c src/lib-otp/otp-parse.c src/lib-storage/index/index-mail.c src/lib-storage/index/maildir/maildir-save.c src/lib/buffer.c src/lib/buffer.h src/lib/str.c
diffstat 12 files changed, 67 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-map.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-index/mail-index-map.c	Mon Jul 13 21:11:05 2009 -0400
@@ -12,7 +12,7 @@
 {
 #define EXTENSION_NAME_APPROX_LEN 20
 #define EXT_GLOBAL_ALLOC_SIZE \
-	((sizeof(map->extensions) + BUFFER_APPROX_SIZE) * 2)
+	((sizeof(map->extensions) + sizeof(buffer_t)) * 2)
 #define EXT_PER_ALLOC_SIZE \
 	(EXTENSION_NAME_APPROX_LEN + \
 	 sizeof(struct mail_index_ext) + sizeof(uint32_t))
--- a/src/lib-index/mail-index-modseq.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-index/mail-index-modseq.c	Mon Jul 13 21:11:05 2009 -0400
@@ -300,7 +300,7 @@
 {
 	ARRAY_TYPE(seq_range) uids = ARRAY_INIT;
 	const struct seq_range *rec;
-	buffer_t *uid_buf;
+	buffer_t uid_buf;
 	unsigned int i, count;
 	uint32_t seq1, seq2;
 
@@ -319,9 +319,8 @@
 		return;
 	}
 	case MAIL_TRANSACTION_FLAG_UPDATE: {
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-						   tdata, thdr->size);
-		array_create_from_buffer(&uids, uid_buf,
+		buffer_create_const_data(&uid_buf, tdata, thdr->size);
+		array_create_from_buffer(&uids, &uid_buf,
 			sizeof(struct mail_transaction_flag_update));
 		break;
 	}
@@ -333,16 +332,15 @@
 		if ((seqset_offset % 4) != 0)
 			seqset_offset += 4 - (seqset_offset % 4);
 
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-					CONST_PTR_OFFSET(tdata, seqset_offset),
-					thdr->size - seqset_offset);
-		array_create_from_buffer(&uids, uid_buf, sizeof(uint32_t)*2);
+		buffer_create_const_data(&uid_buf,
+					 CONST_PTR_OFFSET(tdata, seqset_offset),
+					 thdr->size - seqset_offset);
+		array_create_from_buffer(&uids, &uid_buf, sizeof(uint32_t)*2);
 		break;
 	}
 	case MAIL_TRANSACTION_KEYWORD_RESET:
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-						   tdata, thdr->size);
-		array_create_from_buffer(&uids, uid_buf,
+		buffer_create_const_data(&uid_buf, tdata, thdr->size);
+		array_create_from_buffer(&uids, &uid_buf,
 			sizeof(struct mail_transaction_keyword_reset));
 		break;
 	default:
--- a/src/lib-index/mail-index-transaction-export.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-index/mail-index-transaction-export.c	Mon Jul 13 21:11:05 2009 -0400
@@ -171,7 +171,7 @@
 	uint32_t ext_id, reset_id;
 	const struct mail_transaction_ext_reset *reset;
 	const uint32_t *reset_ids;
-	buffer_t *reset_buf;
+	buffer_t reset_buf;
 
 	if (!array_is_created(&t->ext_resizes)) {
 		resize = NULL;
@@ -208,9 +208,8 @@
 	}
 
 	memset(&ext_reset, 0, sizeof(ext_reset));
-	reset_buf = buffer_create_data(pool_datastack_create(),
-				       &ext_reset, sizeof(ext_reset));
-	buffer_set_used_size(reset_buf, sizeof(ext_reset));
+	buffer_create_data(&reset_buf, &ext_reset, sizeof(ext_reset));
+	buffer_set_used_size(&reset_buf, sizeof(ext_reset));
 
 	for (ext_id = 0; ext_id < ext_count; ext_id++) {
 		if (ext_id < reset_count)
@@ -233,7 +232,7 @@
 		if (ext_reset.new_reset_id != 0) {
 			i_assert(ext_id < reset_id_count &&
 				 ext_reset.new_reset_id == reset_ids[ext_id]);
-			log_append_buffer(ctx, reset_buf,
+			log_append_buffer(ctx, &reset_buf,
 					  MAIL_TRANSACTION_EXT_RESET);
 		}
 		if (ext_id < hdrs_count && hdrs[ext_id].alloc_size > 0) {
--- a/src/lib-index/mail-transaction-log-file.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-index/mail-transaction-log-file.c	Mon Jul 13 21:11:05 2009 -0400
@@ -1390,9 +1390,9 @@
 		}
 	}
 
-	file->buffer = buffer_create_const_data(default_pool,
-						file->mmap_base,
-						file->mmap_size);
+	buffer_create_const_data(&file->mmap_buffer,
+				 file->mmap_base, file->mmap_size);
+	file->buffer = &file->mmap_buffer;
 	file->buffer_offset = 0;
 	return 0;
 }
--- a/src/lib-index/mail-transaction-log-private.h	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-index/mail-transaction-log-private.h	Mon Jul 13 21:11:05 2009 -0400
@@ -1,6 +1,7 @@
 #ifndef MAIL_TRANSACTION_LOG_VIEW_H
 #define MAIL_TRANSACTION_LOG_VIEW_H
 
+#include "buffer.h"
 #include "file-dotlock.h"
 #include "mail-transaction-log.h"
 
@@ -44,6 +45,7 @@
 	uoff_t last_size;
 
 	struct mail_transaction_log_header hdr;
+	buffer_t mmap_buffer;
 	buffer_t *buffer;
 	uoff_t buffer_offset;
 	void *mmap_base;
--- a/src/lib-index/mail-transaction-log-view.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-index/mail-transaction-log-view.c	Mon Jul 13 21:11:05 2009 -0400
@@ -400,7 +400,7 @@
 {
 	enum mail_transaction_type rec_type;
 	ARRAY_TYPE(seq_range) uids = ARRAY_INIT;
-	buffer_t *uid_buf = NULL;
+	buffer_t uid_buf;
 	uint32_t rec_size;
 	bool ret = TRUE;
 
@@ -437,15 +437,13 @@
 		}
 		break;
 	case MAIL_TRANSACTION_EXPUNGE:
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-						   data, rec_size);
-		array_create_from_buffer(&uids, uid_buf,
+		buffer_create_const_data(&uid_buf, data, rec_size);
+		array_create_from_buffer(&uids, &uid_buf,
 			sizeof(struct mail_transaction_expunge));
 		break;
 	case MAIL_TRANSACTION_FLAG_UPDATE:
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-						   data, rec_size);
-		array_create_from_buffer(&uids, uid_buf,
+		buffer_create_const_data(&uid_buf, data, rec_size);
+		array_create_from_buffer(&uids, &uid_buf,
 			sizeof(struct mail_transaction_flag_update));
 		break;
 	case MAIL_TRANSACTION_KEYWORD_UPDATE: {
@@ -463,16 +461,16 @@
 			break;
 		}
 
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-					CONST_PTR_OFFSET(data, seqset_offset),
-					rec_size - seqset_offset);
-		array_create_from_buffer(&uids, uid_buf, sizeof(uint32_t)*2);
+		buffer_create_const_data(&uid_buf,
+					 CONST_PTR_OFFSET(data, seqset_offset),
+					 rec_size - seqset_offset);
+		array_create_from_buffer(&uids, &uid_buf,
+					 sizeof(uint32_t)*2);
 		break;
 	}
 	case MAIL_TRANSACTION_KEYWORD_RESET:
-		uid_buf = buffer_create_const_data(pool_datastack_create(),
-						   data, rec_size);
-		array_create_from_buffer(&uids, uid_buf,
+		buffer_create_const_data(&uid_buf, data, rec_size);
+		array_create_from_buffer(&uids, &uid_buf,
 			sizeof(struct mail_transaction_keyword_reset));
 		break;
 	default:
@@ -483,7 +481,7 @@
 		const struct seq_range *rec, *prev = NULL;
 		unsigned int i, count = array_count(&uids);
 
-		if ((uid_buf->used % uids.arr.element_size) != 0) {
+		if ((uid_buf.used % uids.arr.element_size) != 0) {
 			mail_transaction_log_file_set_corrupted(file,
 				"Invalid record size (type=0x%x)", rec_type);
 			ret = FALSE;
--- a/src/lib-otp/otp-parse.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-otp/otp-parse.c	Mon Jul 13 21:11:05 2009 -0400
@@ -36,14 +36,14 @@
 int otp_read_hex(const char *data, const char **endptr, unsigned char *hash)
 {
 	string_t *str;
-	buffer_t *buf;
+	buffer_t buf;
 	unsigned int i = 0;
 
 	if (data == NULL)
 		return -1;
 
 	str = t_str_new(18);
-	buf = buffer_create_data(unsafe_data_stack_pool, hash, OTP_HASH_SIZE);
+	buffer_create_data(&buf, hash, OTP_HASH_SIZE);
 
 	while (*data) {
 		char c = *data;
@@ -68,12 +68,12 @@
 	if (i < OTP_HASH_SIZE * 2)
 		return -1;
 
-	return hex_to_binary(str_c(str), buf);
+	return hex_to_binary(str_c(str), &buf);
 }
 
 #define add_word() do { \
 	tmp = otp_lookup_word(str_c(word)); \
-	buffer_append(buf, &tmp, sizeof(tmp)); \
+	buffer_append(&buf, &tmp, sizeof(tmp)); \
 	count++; \
 } while (0)
 
@@ -83,7 +83,7 @@
 	unsigned int len = 0, count = 0;
 	unsigned int parity = 0, bits[OTP_WORDS_NUMBER], tmp;
 	string_t *word;
-	buffer_t *buf;
+	buffer_t buf;
 
 	if (data == NULL)
 		return -1;
@@ -92,7 +92,7 @@
 
 	data = otp_skip_lws(data);
 
-	buf = buffer_create_data(pool_datastack_create(), bits, sizeof(bits));
+	buffer_create_data(&buf, bits, sizeof(bits));
 
 	for (; *data && (count < OTP_WORDS_NUMBER); data++) {
 		char c = *data;
--- a/src/lib-storage/index/index-mail.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-storage/index/index-mail.c	Mon Jul 13 21:11:05 2009 -0400
@@ -104,21 +104,16 @@
 				       void *data, size_t data_size)
 {
 	unsigned int field_idx = mail->ibox->cache_fields[field].idx;
+	buffer_t buf;
 	int ret;
 
-	T_BEGIN {
-		buffer_t *buf;
-
-		buf = buffer_create_data(pool_datastack_create(),
-					 data, data_size);
-
-		if (index_mail_cache_lookup_field(mail, buf, field_idx) <= 0)
-			ret = FALSE;
-		else {
-			i_assert(buf->used == data_size);
-			ret = TRUE;
-		}
-	} T_END;
+	buffer_create_data(&buf, data, data_size);
+	if (index_mail_cache_lookup_field(mail, &buf, field_idx) <= 0)
+		ret = FALSE;
+	else {
+		i_assert(buf.used == data_size);
+		ret = TRUE;
+	}
 	return ret;
 }
 
--- a/src/lib-storage/index/maildir/maildir-save.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-save.c	Mon Jul 13 21:11:05 2009 -0400
@@ -51,7 +51,7 @@
 	struct maildir_filename *files, **files_tail, *file_last;
 	unsigned int files_count;
 
-	buffer_t *keywords_buffer;
+	buffer_t keywords_buffer;
 	ARRAY_TYPE(keyword_indexes) keywords_array;
 
 	struct istream *input;
@@ -124,8 +124,8 @@
 	ctx->newdir = p_strconcat(pool, mbox->ibox.box.path, "/new", NULL);
 	ctx->curdir = p_strconcat(pool, mbox->ibox.box.path, "/cur", NULL);
 
-	ctx->keywords_buffer = buffer_create_const_data(pool, NULL, 0);
-	array_create_from_buffer(&ctx->keywords_array, ctx->keywords_buffer,
+	buffer_create_const_data(&ctx->keywords_buffer, NULL, 0);
+	array_create_from_buffer(&ctx->keywords_array, &ctx->keywords_buffer,
 				 sizeof(unsigned int));
 	ctx->last_save_finished = TRUE;
 	return ctx;
@@ -236,7 +236,7 @@
 	}
 
 	i_assert(ctx->keywords_sync_ctx != NULL || mf->keywords_count == 0);
-	buffer_update_const_data(ctx->keywords_buffer, mf + 1,
+	buffer_create_const_data(&ctx->keywords_buffer, mf + 1,
 				 mf->keywords_count * sizeof(unsigned int));
 	*fname_r = maildir_filename_set_flags(ctx->keywords_sync_ctx, basename,
 					      mf->flags & MAIL_FLAGS_MASK,
--- a/src/lib/buffer.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib/buffer.c	Mon Jul 13 21:11:05 2009 -0400
@@ -79,30 +79,26 @@
 	return (buffer_t *)buf;
 }
 
-buffer_t *buffer_create_data(pool_t pool, void *data, size_t size)
+void buffer_create_data(buffer_t *buffer, void *data, size_t size)
 {
 	struct real_buffer *buf;
 
-	buf = p_new(pool, struct real_buffer, 1);
-	buf->pool = pool;
+	i_assert(sizeof(*buffer) >= sizeof(struct real_buffer));
+
+	buf = (struct real_buffer *)buffer;
+	memset(buf, 0, sizeof(*buf));
 	buf->alloc = size;
 	buf->r_buffer = buf->w_buffer = data;
-	return (buffer_t *)buf;
 }
 
-buffer_t *buffer_create_const_data(pool_t pool, const void *data, size_t size)
+void buffer_create_const_data(buffer_t *buffer, const void *data, size_t size)
 {
 	struct real_buffer *buf;
 
-	buf = p_new(pool, struct real_buffer, 1);
-	buf->pool = pool;
-	buffer_update_const_data((buffer_t *)buf, data, size);
-	return (buffer_t *)buf;
-}
+	i_assert(sizeof(*buffer) >= sizeof(struct real_buffer));
 
-void buffer_update_const_data(buffer_t *_buf, const void *data, size_t size)
-{
-	struct real_buffer *buf = (struct real_buffer *)_buf;
+	buf = (struct real_buffer *)buffer;
+	memset(buf, 0, sizeof(*buf));
 
 	buf->used = buf->alloc = size;
 	buf->r_buffer = data;
@@ -127,7 +123,8 @@
 	*_buf = NULL;
 	if (buf->alloced)
 		p_free(buf->pool, buf->w_buffer);
-	p_free(buf->pool, buf);
+	if (buf->pool != NULL)
+		p_free(buf->pool, buf);
 }
 
 void *buffer_free_without_data(buffer_t **_buf)
--- a/src/lib/buffer.h	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib/buffer.h	Mon Jul 13 21:11:05 2009 -0400
@@ -1,13 +1,10 @@
 #ifndef BUFFER_H
 #define BUFFER_H
 
-/* May be used in calculations of how much memory buffer_t will allocate
-   for itself, but this isn't necessary precise. */
-#define BUFFER_APPROX_SIZE (7 * sizeof(void *))
-
 struct buffer {
 	const void *data;
 	const size_t used;
+	void *priv[5];
 };
 
 /* WARNING: Be careful with functions that return pointers to data.
@@ -18,10 +15,9 @@
 /* Create a static sized buffer. Writes past this size will kill the program. */
 buffer_t *buffer_create_static_hard(pool_t pool, size_t size);
 /* Create a modifiable buffer from given data. */
-buffer_t *buffer_create_data(pool_t pool, void *data, size_t size);
+void buffer_create_data(buffer_t *buffer, void *data, size_t size);
 /* Create a non-modifiable buffer from given data. */
-buffer_t *buffer_create_const_data(pool_t pool, const void *data, size_t size);
-void buffer_update_const_data(buffer_t *buffer, const void *data, size_t size);
+void buffer_create_const_data(buffer_t *buffer, const void *data, size_t size);
 /* Creates a dynamically growing buffer. Whenever write would exceed the
    current size it's grown. */
 buffer_t *buffer_create_dynamic(pool_t pool, size_t init_size);
--- a/src/lib/str.c	Mon Jul 13 19:54:28 2009 -0400
+++ b/src/lib/str.c	Mon Jul 13 21:11:05 2009 -0400
@@ -17,7 +17,9 @@
 	string_t *ret;
 
 	i_assert(str[len] == '\0');
-	ret = buffer_create_const_data(pool, str, len + 1);
+
+	ret = p_new(pool, buffer_t, 1);
+	buffer_create_const_data(ret, str, len + 1);
 	str_truncate(ret, len);
 	return ret;
 }