[Thunar-dev] Tree_Model and Bugs 2502, 2902, 3602 and 4051
benedikt.meurer at unix-ag.uni-siegen.de
Tue Jun 24 16:43:15 CEST 2008
> Working with Xfce/Thunar I soon noticed bug 2502 (freezes when hiding
> switched on). This bug seems to be related to bug 4051, 3602, and 2902.
> Since I'm pretty new to Thunar and have only limited experience in C, I
> would like to know whether my understanding of these bugs is correct. As
> far as I can see browsing through the source code and enabling all debug
> logs the following goes wrong.
> All misery starts in 'thunar/thunar_tree_model.c'. It's the model of the
> model-view combination for the GTK_Tree_View widget that shows the
> directory tree. When the user activates a node in the tree, the node
> opens and shows all subnodes within the node. However, each subnode
> wants to know whether it has at least one subnode itself, because of the
> nice little triangle it then needs to show. The TreeView widget asks
> thunar_tree_model whether a node has a subnode. At this moment
> thunar_tree_model queries the node and creates an iterator for every
> subnode it finds. However, every iterator contains a file/directory
> object that wants to be notified of any changes - not only _of_ the
> directory, but also _in_ the directory. This does cause some problems
> for a directory like /proc and /dev.
> Problems worsen because of caching within thunar_tree_model. I'm not
> sure about this (bit complicated due to the filter on top of the model
> and the ref_node mechanism that allows caching), but it seems that the
> file/directory objects are kept alive as long as the thunar_tree_model
> exists. This also implies that the directory/file objects want to be
> informed of all changes within each directory (if /proc is shown, a
> directory object exists for every subdir in /proc and every subdir wants
> to be informed about every change _within_ that subdir. This add up!!)
> Unfortunately, we're not there yet. Thunar uses FAM/GAMIN for monitoring
> the filesystem. FAM/GAMIN uses efficient kernel monitoring to monitor
> changes to normal mounts (ext2/ext3/reiserfs etc). However, FAM/Gamin
> falls back to polling on special mount points like /proc, /dev (and SD
> cards, Fuse mounts etc...) So now Thunar wants be informed about changes
> to /proc and subdirs and FAM/Gamin polls everything. This is pretty time
> consuming (many, many files, and even more notifications since many
> files in /proc change every millisecond). This causes the crashes
> mentioned in the bug reports.
> This explains the problems in bug 2502/3602 (crashes/freezes
> hiding/unhiding) because hiding/unhiding simply involves requerying all
> nodes. Especially hiding is tricky because all nodes are polled (is it
> suddenly a hidden file/dir??) It also explains bug 2902 (Thunar slows
> down browsing larger subdirs). As mentioned there by Jan Rathmann, this
> behaviour is specific for newer versions of GTK (maybe the new TreeView
> is more aggressive in obtaining information)?
> A solution would consists of two steps:
> 1) Prevent caching too many nodes within thunar_tree_model, preferably
> prevent creation of these nodes.
> 2) If possible, prevent poll notifications. This does imply that
> information might be outdated, but there is a speed/accuracy trade-off.
I'm aware of most of these issues. My preferred solution would be to
'svn remove thunar-tree-*.[ch]' all together, but there are a few people
that would complain. So feel free to send patches to address these issues.
Looking back... the best solution would probably be to completely
disable that "smart on-demand loading", always display triangles in
front of folders and trigger on the tree view "expanded" events explicitly.
More information about the Thunar-dev