[cairo] [PATCH] Avoid appending an empty slot to an user data array when user_data is NULL.

江頭幸路 koji.egashira at access-company.com
Fri Apr 17 05:12:52 PDT 2015


This issue probably happens since the commit
http://cgit.freedesktop.org/cairo/commit/?id=9341c254a


test code:

#include <stdio.h>

#include <cairo.h>

#define LOG(...) fprintf(stderr, __VA_ARGS__)

int main(void) {
    cairo_surface_t *surface;
    cairo_t *cr;
    int i;

    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1);
    cr = cairo_create(surface);

    for (i = 0; i < 500000; i++) {
        cairo_status_t ret = cairo_set_user_data(cr, (const void *)1, 0, 0);
        if (ret == CAIRO_STATUS_NO_MEMORY) {
            LOG("\ncairo_set_user_data() returned
CAIRO_STATUS_NO_MEMORY.\n");
            break;
        }
        if ((i+1) % 1000 == 0) {
            LOG("\r  iteration %d passed.", i+1);
        }
    }
    LOG("\n");

    cairo_destroy(cr);
    cairo_surface_destroy(surface);
    return 0;
}

Log shows iteration gets slow, meaning that cairo_set_user_data()
takes longer time than it does in the former iteration.
"top" command shows increase of memory consumption.


--
Koji Egashira


2015-04-17 20:59 GMT+09:00 江頭幸路 <koji.egashira at access-company.com>:

> Otherwise, calling cairo_set_user_data(cr, key, 0, 0) many times
> causes a long user data array, almost all of whose slots are empty.
> It leads to unnecessarily much memory consumption and long execution time
> of
> cairo_set_user_data(cr, key, 0, 0) and cairo_get_user_data(cr, key) after
> it.
> ---
>  src/cairo-array.c |    3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/src/cairo-array.c b/src/cairo-array.c
> index 4f3c082..58c9a38 100644
> --- a/src/cairo-array.c
> +++ b/src/cairo-array.c
> @@ -485,6 +485,9 @@ _cairo_user_data_array_set_data
> (cairo_user_data_array_t     *array,
>      return CAIRO_STATUS_SUCCESS;
>      }
>
> +    if (user_data == NULL)
> +    return CAIRO_STATUS_SUCCESS;
> +
>      status = _cairo_array_append (array, &new_slot);
>      if (unlikely (status))
>      return status;
> --
> 1.7.9.5
>
>

-- 
.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cairographics.org/archives/cairo/attachments/20150417/8f3cfd29/attachment.html>


More information about the cairo mailing list