Clean-up: simplify the implementation of dynamic buffer set_capacity
[lttng-tools.git] / src / common / dynamic-buffer.c
index ea26a51aca78297cea5b1a7b97840cdec97cf884..9ed16514fe64fa84dc735f15de862ca662a04fef 100644 (file)
@@ -55,7 +55,8 @@ int lttng_dynamic_buffer_append(struct lttng_dynamic_buffer *buffer,
                goto end;
        }
 
-       if ((buffer->capacity - buffer->size) < len) {
+       assert(buffer->capacity >= buffer->size);
+       if (buffer->capacity < (len + buffer->size)) {
                ret = lttng_dynamic_buffer_set_capacity(buffer,
                                buffer->capacity +
                                (len - (buffer->capacity - buffer->size)));
@@ -100,10 +101,22 @@ int lttng_dynamic_buffer_set_size(struct lttng_dynamic_buffer *buffer,
        }
 
        if (new_size > buffer->capacity) {
+               size_t original_size = buffer->size;
+               size_t original_capacity = buffer->capacity;
+
                ret = lttng_dynamic_buffer_set_capacity(buffer, new_size);
                if (ret) {
                        goto end;
                }
+
+               /*
+                * Zero-initialize the space that was left in the buffer at the
+                * before we increased its capacity (original capacity - original size).
+                * The newly acquired capacity (new capacity - original capacity)
+                * is zeroed by lttng_dynamic_buffer_set_capacity().
+                */
+               memset(buffer->data + original_size, 0,
+                               original_capacity - original_size);
        } else if (new_size > buffer->size) {
                memset(buffer->data + buffer->size, 0, new_size - buffer->size);
        } else {
@@ -123,48 +136,33 @@ end:
 }
 
 int lttng_dynamic_buffer_set_capacity(struct lttng_dynamic_buffer *buffer,
-               size_t new_capacity)
+               size_t demanded_capacity)
 {
        int ret = 0;
-       size_t rounded_capacity = round_to_power_of_2(new_capacity);
+       void *new_buf;
+       size_t new_capacity = round_to_power_of_2(demanded_capacity);
 
-       if (!buffer || new_capacity < buffer->size) {
+       if (!buffer || demanded_capacity < buffer->size) {
+               /*
+                * Shrinking a buffer's size by changing its capacity is
+                * unsupported.
+                */
                ret = -1;
                goto end;
        }
 
-       if (rounded_capacity == buffer->capacity) {
+       if (new_capacity == buffer->capacity) {
                goto end;
        }
 
-       if (!buffer->data) {
-               buffer->data = zmalloc(rounded_capacity);
-               if (!buffer->data) {
-                       ret = -1;
-                       goto end;
-               }
-       } else {
-               void *new_buf;
-
-               new_buf = realloc(buffer->data, rounded_capacity);
-               if (new_buf) {
-                       if (rounded_capacity > buffer->capacity) {
-                               memset(new_buf + buffer->capacity, 0,
-                                               rounded_capacity - buffer->capacity);
-                       }
-               } else {
-                       /* Realloc failed, try to acquire a new block. */
-                       new_buf = zmalloc(rounded_capacity);
-                       if (!new_buf) {
-                               ret = -1;
-                               goto end;
-                       }
-                       memcpy(new_buf, buffer->data, buffer->size);
-                       free(buffer->data);
-               }
-               buffer->data = new_buf;
+       /* Memory is initialized by the size increases. */
+       new_buf = realloc(buffer->data, new_capacity);
+       if (!new_buf) {
+               ret = -1;
+               goto end;
        }
-       buffer->capacity = rounded_capacity;
+       buffer->data = new_buf;
+       buffer->capacity = new_capacity;
 end:
        return ret;
 }
This page took 0.02451 seconds and 5 git commands to generate.