On 05/06/2014 11:12 AM, Marc-André Lureau wrote:
----- 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.
I patched gtk3 with the attached and the problem seems fixed. Note: I
added the cairo_surface_destroy in gdkcursor.c because:
1) symmetry - it's allocated there
2) looking at a few of the different backends, they don't appear to have
a cairo_surface_destroy either.
At the very least, I'm pretty sure the leak is gone, and the cursors
still work ;-)
Are you a gtk3 committer by any chance? Should I open a bugzilla at
redhat? Freedesktop? Gnome?
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
diff -ur gtk+-3.10.8/gdk/gdkcursor.c gtk+-3.10.8.new/gdk/gdkcursor.c
--- gtk+-3.10.8/gdk/gdkcursor.c 2014-04-05 11:52:54.000000000 -0400
+++ gtk+-3.10.8.new/gdk/gdkcursor.c 2014-05-06 14:11:50.427982326 -0400
@@ -356,6 +356,7 @@
const char *option;
char *end;
gint64 value;
+ GdkCursor *cursor;
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
@@ -384,7 +385,11 @@
surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 1, NULL);
- return GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_surface (display, surface, x, y);
+ cursor = GDK_DISPLAY_GET_CLASS (display)->get_cursor_for_surface (display, surface, x, y);
+
+ cairo_surface_destroy (surface);
+
+ return cursor;
}
/**
Only in gtk+-3.10.8.new/gdk: gdkcursor.c~
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel