GNOME Bugzilla – Bug 575696
extreme slowness in GtkTreeView on row selection/insertion
Last modified: 2011-01-20 10:47:24 UTC
Please describe the problem: I am building a browser/editor to view/modify an ontology represented as a network of nodes and edges (about 150,000 nodes). The network is displayed as a set of trees, using the GtkTreeView (via gtkmm toolkit). A custom tree model is used to convert the network into a strict tree view. Certain operations (selection of a row, pasting new rows) can cause a very large number of calls to the tree model from GtkTreeView causing the application to pause unacceptably or sometimes hang in an endless loop. The problem is reproducible. By chance I discovered that setting the GTK_MODULES env variable to blank removed the problem completely. It was set to "gnomebreakpad:gail:atk-bridge". This strengthens a suspicion that the problem is related to libgail.so. When the program is interrupted during the looping, the backtrace from GDB always shows libgail.so in the trace. An example trace is included below. If the target row for a paste operation has children and is expanded, the looping occurs; if it is not expanded, no looping happens. The looping always involved calls to the tree model for nodes which are not displayed and each node is visited repeatedly (5 times and more). I have discounted the possibility of circular linking between the nodes and in any case the number on non-visible nodes being visited is unnecessary and does not happen in other operations. I have not investigated the problem in more depth and cannot tell if this should be reported under gail or GtkTreeView. Also I have not had time to create a small example but I can supply the whole application if required. Steps to reproduce: 1. 2. 3. Actual results: Expected results: Does this happen every time? yes Other information: (gdb) bt #0 std::_Rb_tree<memory_store::node_record*, std::pair<memory_store::node_record* const, memory_store::edge_record*>, std::_Select1st<std::pair<memory_store::node_record* const, memory_store::edge_record*> >, std::less<memory_store::node_record*>, std::allocator<std::pair<memory_store::node_record* const, memory_store::edge_record*> > >::_S_key (__x=0xa227428) at /usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_tree.h:475
+ Trace 213551
I agree with you that this is a gail problem. Moving.
*** This bug has been marked as a duplicate of bug 577098 ***