ctdb-util: Refactor record marshalling routines to avoid extra talloc
authorAmitay Isaacs <amitay@gmail.com>
Tue, 6 May 2014 08:26:41 +0000 (18:26 +1000)
committerAmitay Isaacs <amitay@samba.org>
Wed, 23 Jul 2014 05:18:11 +0000 (07:18 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Volker Lendecke <vl@samba.org>
ctdb/common/ctdb_util.c

index 6b741ce7d9f4e92621fe9ce2b866544d832bd5af..c4ac583b99f7f8bf4c8bb5d622836d1169090a91 100644 (file)
@@ -248,36 +248,29 @@ struct ctdb_marshall_buffer *ctdb_marshall_add(TALLOC_CTX *mem_ctx,
                                               TDB_DATA data)
 {
        struct ctdb_rec_data *r;
-       size_t m_size, r_size;
        struct ctdb_marshall_buffer *m2;
+       uint32_t length, offset;
 
-       r = ctdb_marshall_record(mem_ctx, reqid, key, header, data);
-       if (r == NULL) {
-               talloc_free(m);
-               return NULL;
-       }
+       length = ctdb_marshall_record_size(key, header, data);
 
        if (m == NULL) {
-               m = talloc_zero_size(mem_ctx, offsetof(struct ctdb_marshall_buffer, data));
-               if (m == NULL) {
-                       return NULL;
-               }
-               m->db_id = db_id;
+               offset = offsetof(struct ctdb_marshall_buffer, data);
+               m2 = talloc_zero_size(mem_ctx, offset + length);
+       } else {
+               offset = talloc_get_size(m);
+               m2 = talloc_realloc_size(mem_ctx, m, offset + length);
        }
-
-       m_size = talloc_get_size(m);
-       r_size = talloc_get_size(r);
-
-       m2 = talloc_realloc_size(mem_ctx, m,  m_size + r_size);
        if (m2 == NULL) {
-               talloc_free(m);
+               TALLOC_FREE(m);
                return NULL;
        }
 
-       memcpy(m_size + (uint8_t *)m2, r, r_size);
-
-       talloc_free(r);
+       if (m == NULL) {
+               m2->db_id = db_id;
+       }
 
+       r = (struct ctdb_rec_data *)((uint8_t *)m2 + offset);
+       ctdb_marshall_record_copy(r, reqid, key, header, data, length);
        m2->count++;
 
        return m2;