]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of alloca...
authorTimo Sirainen <tss@iki.fi>
Tue, 14 Jul 2009 01:11:05 +0000 (21:11 -0400)
committerTimo Sirainen <tss@iki.fi>
Tue, 14 Jul 2009 01:11:05 +0000 (21:11 -0400)
--HG--
branch : HEAD

12 files changed:
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

index 62606bebf85a22846ef25124558ea9833daeee19..f8e713bebc0b4e89d46835656d77ce832255099b 100644 (file)
@@ -12,7 +12,7 @@ void mail_index_map_init_extbufs(struct mail_index_map *map,
 {
 #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))
index 3079befceb7638bed2e51bdcb5f760f52d278a28..76c031d2184b39f1f8e36d2f6c0a76e692355f14 100644 (file)
@@ -300,7 +300,7 @@ mail_index_modseq_update_old_rec(struct mail_index_modseq_sync *ctx,
 {
        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 @@ mail_index_modseq_update_old_rec(struct mail_index_modseq_sync *ctx,
                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 @@ mail_index_modseq_update_old_rec(struct mail_index_modseq_sync *ctx,
                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:
index d1df5fcfb6876413b12f33b5fd374ac3cbc52a63..e2a2dc78513d6b39034d60a0caefc30b5d34a37a 100644 (file)
@@ -171,7 +171,7 @@ mail_transaction_log_append_ext_intros(struct mail_index_export_context *ctx)
        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 @@ mail_transaction_log_append_ext_intros(struct mail_index_export_context *ctx)
        }
 
        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 @@ mail_transaction_log_append_ext_intros(struct mail_index_export_context *ctx)
                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) {
index b3930f5147b522fdd9e6c61e4166deb5df13850b..407735e11f5cca12506465b096a8815f1e7ddd20 100644 (file)
@@ -1390,9 +1390,9 @@ mail_transaction_log_file_mmap(struct mail_transaction_log_file *file)
                }
        }
 
-       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;
 }
index 46c1fc5b8c35ddfa200bc6bded533bca99af4b47..373cecff0a82518408cbbb53c7bd581cabfa699e 100644 (file)
@@ -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 @@ struct mail_transaction_log_file {
        uoff_t last_size;
 
        struct mail_transaction_log_header hdr;
+       buffer_t mmap_buffer;
        buffer_t *buffer;
        uoff_t buffer_offset;
        void *mmap_base;
index f3468faf66b80a73f677c08d6fe4b50596fbb72e..59c5dda7aa0fd80ea08d4ce0829159ed5db5c4a6 100644 (file)
@@ -400,7 +400,7 @@ log_view_is_record_valid(struct mail_transaction_log_file *file,
 {
        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 @@ log_view_is_record_valid(struct mail_transaction_log_file *file,
                }
                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 @@ log_view_is_record_valid(struct mail_transaction_log_file *file,
                        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 @@ log_view_is_record_valid(struct mail_transaction_log_file *file,
                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;
index b72e210c0f255c58f64f12e63d1d57940a170990..1074b2eaac9a1dcd25a31054a8662b810b434f04 100644 (file)
@@ -36,14 +36,14 @@ static inline int otp_check_tail(const char *data)
 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 @@ int otp_read_hex(const char *data, const char **endptr, unsigned char *hash)
        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 @@ int otp_read_words(const char *data, const char **endptr, unsigned char *hash)
        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 @@ int otp_read_words(const char *data, const char **endptr, unsigned char *hash)
 
        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;
index 2d65ec2805da08a78580e40d6bcb58324dd03867..4804084b30a094d834d8b07d0e5a0f6fafcc22eb 100644 (file)
@@ -104,21 +104,16 @@ static bool index_mail_get_fixed_field(struct index_mail *mail,
                                       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;
 }
 
index 8c39083fbd853641e5f9919c5d41a50ea2264c4c..3b65cac4f74f488e0f0f5b1ae0ccb2ab189cafb4 100644 (file)
@@ -51,7 +51,7 @@ struct maildir_save_context {
        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 @@ maildir_save_transaction_init(struct maildir_transaction_context *t)
        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 @@ maildir_get_updated_filename(struct maildir_save_context *ctx,
        }
 
        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,
index 8c25da625fdd0eeeee3034fba649bf07e5a84082..bcb30149a4c9f0dd1d506dde79863f838c64016d 100644 (file)
@@ -79,30 +79,26 @@ buffer_t *buffer_create_static_hard(pool_t pool, size_t size)
        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 @@ void buffer_free(buffer_t **_buf)
        *_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)
index b9e181501cd8b5442399f376638ba9102994370f..b6452192d129803019fc74dd6ab6434db2cd14a1 100644 (file)
@@ -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 @@ struct buffer {
 /* 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);
index 312a0a5032921856024f387a3757604a9637fa2a..216fbcaf1c7f0131b5f63778713270e685072eec 100644 (file)
@@ -17,7 +17,9 @@ string_t *str_new_const(pool_t pool, const char *str, size_t len)
        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;
 }