----- Original Message ----- > Hi > > ----- Original Message ----- > > > > On 05/06/2014 09:49 AM, David Mansfield wrote: > > > > > > On 05/06/2014 06:04 AM, Marc-André Lureau wrote: > > >> Hi > > >> > > >> ----- Original Message ----- > > >>> On 05/05/2014 04:10 PM, Marc-André Lureau wrote: > > >>>> Hi > > >>>> > > >>>> ----- Original Message ----- > > >>>>> Any way to easily trace memory leaks in remote-viewer? A naive > > >>>>> attempt > > >>>>> at "valgrind remote-viewer spice://blah" didn't turn up anything in > > >>>>> particular. > > >>>> Have you tried with massif? It usually gives pretty good hints. > > >>> Here is "ms_print" output. I've never used massif before, is this > > >>> helpful? > > >> This massif profile doesn't show a large memory usage or any obvious > > >> leak. > > >> > > >> Are you looking at virtual or resident (RSS) memory usage? (remember > > >> that > > >> only RSS really "count") > > > Yes, RSS goes over 2GB easily with 8 hours of usage. > > > > > > I have changed spice-widget.c as follows: > > > > > > @@ -2205,14 +2210,15 @@ > > > (GdkPixbufDestroyNotify)g_free, NULL); > > > d->mouse_hotspot.x = hot_x; > > > d->mouse_hotspot.y = hot_y; > > > - cursor = > > > gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)), > > > - d->mouse_pixbuf, hot_x, > > > hot_y); > > > + cursor = > > > gdk_cursor_new_for_display(gtk_widget_get_display(GTK_WIDGET(display)), > > > GDK_FLEUR); > > > > > > + //cursor = > > > gdk_cursor_new_from_pixbuf(gtk_widget_get_display(GTK_WIDGET(display)), > > > + // d->mouse_pixbuf, hot_x, > > > hot_y); > > > } else > > > g_warn_if_reached(); > > > > > > > > > And, while it's true I only get a hand cursor no matter what, there is > > > no leak. I can wiggle the mouse to my heart's content and the RSS > > > stays flat (after initially increasing to fill the local tile cache). > > > There is 100% no doubt in my mind that there is a leak here. Although > > > the code looks correct to me. > > > > > > I also tried changing gdk_cursor_unref to g_object_unref but it made > > > no difference. > > > > I'm certainly not familiar with gtk3/gdk internals, but it seems like > > gdk/gdkcursor.c (in function gdk_cursor_new_from_pixbuf, line 385 in > > F20) allocates a "cairo surface" for each cursor that is created from > > pixbuf that is leaked. > > > > Any gdk gurus on the list to check this? > > I come to the same conclusion as you, it seems cairo will add a ref to the > surface in > > _gdk_x11_display_get_cursor_for_surface > create_cursor_image > cairo_set_source_surface (cr, source_surface, 0, 0); > > So a cairo_surface_destroy() seems to be missing there. Could you try with > that? > > Funny that we don't see that leak in your massif profile. Actually, it is there, in last snapshot for ex, 30Mb of cursor data in memory (!): ->12.38% (18,381,168B) 0x35164A285E: ??? (in /usr/lib64/libcairo.so.2.11301.0) | ->12.38% (18,381,168B) 0x35164A33E5: ??? (in /usr/lib64/libcairo.so.2.11301.0) | | ->12.38% (18,381,168B) 0x35164A347A: ??? (in /usr/lib64/libcairo.so.2.11301.0) | | | ->12.38% (18,381,168B) 0x351647083B: cairo_surface_create_similar_image (in /usr/lib64/libcairo.so.2.11301.0) | | | ->12.38% (18,381,168B) 0x351783E5BF: gdk_window_create_similar_image_surface (in /usr/lib64/libgdk-3.so.0.1000.8) | | | | ->12.38% (18,381,168B) 0x3517821404: gdk_cairo_surface_create_from_pixbuf (in /usr/lib64/libgdk-3.so.0.1000.8) | | | | ->12.38% (18,377,280B) 0x3517822185: gdk_cursor_new_from_pixbuf (in /usr/lib64/libgdk-3.so.0.1000.8) | | | | | ->12.38% (18,377,280B) 0x374B80E1A1: cursor_set (spice-widget.c:2213) | | | | | ->12.38% (18,377,280B) 0x37490464A0: g_cclosure_user_marshal_VOID__INT_INT_INT_INT_POINTER (spice-marshal.c:204) | | | | | ->12.38% (18,377,280B) 0x3BD7E10296: g_closure_invoke (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x3BD7E2235B: ??? (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x3BD7E2A0F0: g_signal_emit_valist (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x3BD7E2A3AD: g_signal_emit (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x3749021C8A: do_emit_main_context (channel-cursor.c:233) | | | | | ->12.38% (18,377,280B) 0x3749020B9F: emit_main_context (gio-coroutine.c:199) | | | | | ->12.38% (18,377,280B) 0x3BD72492A4: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x3BD7249626: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x3BD7249A38: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3800.2) | | | | | ->12.38% (18,377,280B) 0x35171AA693: gtk_main (in /usr/lib64/libgtk-3.so.0.1000.8) | | | | | ->12.38% (18,377,280B) 0x40EF49: main (in /usr/bin/remote-viewer) | | | | | | | | | ->00.00% (3,888B) in 1+ places, all below ms_print's threshold (01.00%) | | | | | | | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) | | | | | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) | | | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) | ->07.49% (11,118,848B) 0x3BE1E58649: ??? (in /usr/lib64/libpixman-1.so.0.30.0) | ->07.49% (11,118,848B) 0x3BE1E23A28: ??? (in /usr/lib64/libpixman-1.so.0.30.0) | | ->07.33% (10,892,544B) 0x35164A2A8F: ??? (in /usr/lib64/libcairo.so.2.11301.0) | | | ->07.33% (10,892,544B) 0x35164A33E5: ??? (in /usr/lib64/libcairo.so.2.11301.0) | | | | ->07.33% (10,892,544B) 0x35164A347A: ??? (in /usr/lib64/libcairo.so.2.11301.0) | | | | | ->07.33% (10,892,544B) 0x351647083B: cairo_surface_create_similar_image (in /usr/lib64/libcairo.so.2.11301.0) | | | | | ->07.33% (10,892,544B) 0x351783E5BF: gdk_window_create_similar_image_surface (in /usr/lib64/libgdk-3.so.0.1000.8) | | | | | | ->07.33% (10,892,544B) 0x3517821404: gdk_cairo_surface_create_from_pixbuf (in /usr/lib64/libgdk-3.so.0.1000.8) | | | | | | ->07.33% (10,890,240B) 0x3517822185: gdk_cursor_new_from_pixbuf (in /usr/lib64/libgdk-3.so.0.1000.8) | | | | | | | ->07.33% (10,890,240B) 0x374B80E1A1: cursor_set (spice-widget.c:2213) | | | | | | | ->07.33% (10,890,240B) 0x37490464A0: g_cclosure_user_marshal_VOID__INT_INT_INT_INT_POINTER (spice-marshal.c:204) | | | | | | | ->07.33% (10,890,240B) 0x3BD7E10296: g_closure_invoke (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x3BD7E2235B: ??? (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x3BD7E2A0F0: g_signal_emit_valist (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x3BD7E2A3AD: g_signal_emit (in /usr/lib64/libgobject-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x3749021C8A: do_emit_main_context (channel-cursor.c:233) | | | | | | | ->07.33% (10,890,240B) 0x3749020B9F: emit_main_context (gio-coroutine.c:199) | | | | | | | ->07.33% (10,890,240B) 0x3BD72492A4: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x3BD7249626: ??? (in /usr/lib64/libglib-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x3BD7249A38: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3800.2) | | | | | | | ->07.33% (10,890,240B) 0x35171AA693: gtk_main (in /usr/lib64/libgtk-3.so.0.1000.8) | | | | | | | ->07.33% (10,890,240B) 0x40EF49: main (in /usr/bin/remote-viewer) | | | | | | | | | | | | | ->00.00% (2,304B) in 1+ places, all below ms_print's threshold (01.00%) > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel