<div dir="ltr"><div><div><div>This issue probably happens since the commit<br><a href="http://cgit.freedesktop.org/cairo/commit/?id=9341c254a">http://cgit.freedesktop.org/cairo/commit/?id=9341c254a</a><br><br><br></div>test code:<br><br>#include <stdio.h><br><br>#include <cairo.h><br><br>#define LOG(...) fprintf(stderr, __VA_ARGS__)<br><br>int main(void) {<br>    cairo_surface_t *surface;<br>    cairo_t *cr;<br>    int i;<br><br>    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1);<br>    cr = cairo_create(surface);<br><br>    for (i = 0; i < 500000; i++) {<br>        cairo_status_t ret = cairo_set_user_data(cr, (const void *)1, 0, 0);<br>        if (ret == CAIRO_STATUS_NO_MEMORY) {<br>            LOG("\ncairo_set_user_data() returned CAIRO_STATUS_NO_MEMORY.\n");<br>            break;<br>        }<br>        if ((i+1) % 1000 == 0) {<br>            LOG("\r  iteration %d passed.", i+1);<br>        }<br>    }<br>    LOG("\n");<br><br>    cairo_destroy(cr);<br>    cairo_surface_destroy(surface);<br>    return 0;<br>}<br><br></div>Log shows iteration gets slow, meaning that cairo_set_user_data()<br></div><div>takes longer time than it does in the former iteration.<br></div>"top" command shows increase of memory consumption.<br><div><div><div><div><div><br><br>--<br></div><div>Koji Egashira<br><br></div><div><div class="gmail_extra"><br><div class="gmail_quote">2015-04-17 20:59 GMT+09:00 江頭幸路 <span dir="ltr"><<a href="mailto:koji.egashira@access-company.com" target="_blank">koji.egashira@access-company.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Otherwise, calling cairo_set_user_data(cr, key, 0, 0) many times<br>causes a long user data array, almost all of whose slots are empty.<br>It leads to unnecessarily much memory consumption and long execution time of<br>cairo_set_user_data(cr, key, 0, 0) and cairo_get_user_data(cr, key) after it.<br>---<br> src/cairo-array.c |    3 +++<br> 1 file changed, 3 insertions(+)<br><br>diff --git a/src/cairo-array.c b/src/cairo-array.c<br>index 4f3c082..58c9a38 100644<br>--- a/src/cairo-array.c<br>+++ b/src/cairo-array.c<br>@@ -485,6 +485,9 @@ _cairo_user_data_array_set_data (cairo_user_data_array_t     *array,<br>     return CAIRO_STATUS_SUCCESS;<br>     }<br> <br>+    if (user_data == NULL)<br>+    return CAIRO_STATUS_SUCCESS;<br>+<br>     status = _cairo_array_append (array, &new_slot);<br>     if (unlikely (status))<br>     return status;<span class=""><font color="#888888"><br>-- <br>1.7.9.5<br><br></font></span></div>
</blockquote></div><br></div></div></div></div></div></div></div>

<br>
.