-
Bug
-
Resolution: Unresolved
-
Normal
-
None
-
rhel-7.9.z
-
Major
-
sst_desktop
-
ssg_desktop
-
5
-
False
-
-
DESKTOP Cycle #2 10.beta phase
-
If docs needed, set a value
-
-
x86_64
Description of problem:
Eclipse SWT Tree leaks native memory via gtk_tree_view_expand_row()
Version-Release number of selected component (if applicable):
We observe the leak with Eclipse 4.15, Eclipse 4.20 and Eclipse 4.21, as well as latest master from SWT. We assume the leak is seen with all Eclipse versions inbetween.
How reproducible:
To reproduce the leak, run the following SWT snippet:
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Tree Example");
shell.setLayout(new FillLayout());
Tree tree = new Tree(shell, SWT.NONE);
tree.setItemCount(2);
TreeItem item0 = tree.getItem(0);
item0.setText("item0");
TreeItem item1 = tree.getItem(1);
item1.setText("item1");
item1.setItemCount(6);
TreeItem[] children = item1.getItems();
for (int k = 0; k < children.length; ++k)
item1.setExpanded(true);
tree.setItemCount(1);
shell.open();
while (!shell.isDisposed())
display.dispose();
}
jemalloc reports a memory leak as follows:
[240 bytes leaked]
je_prof_backtrace (/home/sandreev/git/misc/jemalloc/src/prof.c:636 (discriminator 2))
je_malloc_default (/home/sandreev/git/misc/jemalloc/src/jemalloc.c:2289)
g_malloc (??:?)
g_slice_alloc (??:?)
_gtk_rbnode_new.isra.2 (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:61)
_gtk_rbtree_insert_after (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:456)
gtk_tree_view_build_tree (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:9570)
gtk_tree_view_real_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12865)
gtk_tree_view_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12920)
Java_org_eclipse_swt_internal_gtk_GTK_gtk_1tree_1view_1expand_1row (??:?)
?? (??:0)
The same leak can be reproduced with the following GTK+ snippet:
// gcc -g tree.c `pkg-config --cflags --libs gtk+-3.0` -o tree
#include <gtk/gtk.h>
enum
{
COL1 = 0,
NUM_COLS
} ;
int
main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *scrolled_window;
GtkWidget *view;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "delete_event", gtk_main_quit, NULL);
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
GtkCellRenderer *renderer;
view = gtk_tree_view_new ();
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "column 1", renderer, "text", COL1, NULL);
GtkTreeStore *treestore;
GtkTreeIter iter, child;
treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING);
gtk_tree_store_append(treestore, &iter, NULL);
gtk_tree_store_set(treestore, &iter, COL1, "item", -1);
gtk_tree_store_append(treestore, &iter, NULL);
gtk_tree_store_set(treestore, &iter, COL1, "item", -1);
GtkTreePath *path = NULL;
path = gtk_tree_model_get_path (GTK_TREE_MODEL(treestore), &iter);
int j;
for (j = 0; j < 6; ++j)
gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (treestore));
if (path)
{ gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE); gtk_tree_path_free(path); } gtk_container_add (GTK_CONTAINER (window), scrolled_window);
gtk_container_add (GTK_CONTAINER (scrolled_window), view);
gtk_widget_show_all (window);
GtkTreeIter iter1, child1;
if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(treestore), &iter1, NULL, 1))
g_object_unref(treestore);
gtk_main ();
return 0;
}
jemalloc reports a memory leak as follows:
[240 bytes leaked]
je_prof_backtrace (/home/sandreev/git/misc/jemalloc/src/prof.c:636 (discriminator 2))
je_malloc_default (/home/sandreev/git/misc/jemalloc/src/jemalloc.c:2289)
g_malloc (??:?)
g_slice_alloc (??:?)
_gtk_rbnode_new.isra.2 (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:61)
_gtk_rbtree_insert_after (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:456)
gtk_tree_view_build_tree (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:9570)
gtk_tree_view_real_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12865)
gtk_tree_view_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12920)
?? (??:0)
__libc_start_main (/usr/src/debug/glibc-2.17-c758a686/csu/../csu/libc-start.c:274)
?? (??:0)
Actual results:
Memory is leaked.
Expected results:
Memory is not leaked.
Additional info:
For more context (e.g. actual Eclipse user operations to run into the leak) see Eclipse bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=574065