summaryrefslogtreecommitdiff
path: root/ctdb/common/ctdb_util.c
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@gmail.com>2014-05-06 18:26:41 +1000
committerAmitay Isaacs <amitay@samba.org>2014-07-23 07:18:11 +0200
commit42ba7a0a400c970dd534e92d2effa3ed385f8d6d (patch)
tree5983a6c4491e3c75cd5174060c7f1425c685087d /ctdb/common/ctdb_util.c
parent64ea6e30ef601d91ea16f6a9c5b7a6b9395c0152 (diff)
downloadsamba-42ba7a0a400c970dd534e92d2effa3ed385f8d6d.tar.gz
ctdb-util: Refactor record marshalling routines to avoid extra talloc
Signed-off-by: Amitay Isaacs <amitay@gmail.com> Reviewed-by: Volker Lendecke <vl@samba.org>
Diffstat (limited to 'ctdb/common/ctdb_util.c')
-rw-r--r--ctdb/common/ctdb_util.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c
index 6b741ce7d9f..c4ac583b99f 100644
--- a/ctdb/common/ctdb_util.c
+++ b/ctdb/common/ctdb_util.c
@@ -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;