• Federico Mena Quintero's avatar
    bgo#687196 - Fix model corruption during file removal · ea3a750f
    Federico Mena Quintero authored
    The main problem is that we were emitting the row-deleted signal for the model in the middle
    of the process that actually deletes the row from the model (remove the row from the array,
    update the model->file_lookup hash table, etc.).  In the model's caller, one of the row-deleted
    callbacks was requesting an iter, which caused the model to revalidate itself - but it did
    this while it was in an inconsistent state.  This led to an assertion failure later when the
    model resorted itself.
    
    The fix in remove_file() is like this:
    
    * The filteredness/visibility of the deleted node is not updated.  The
      node will simply be gone; we don't need to update those values at
      all.
    
    * We invalidate just the node that is being deleted.
    
    * The model->file_lookup hash table is not completely nuked; instead,
      we carefully adjust its indices.
    
    * The row-deleted signal is only emitted at the very end, when
      deletion is complete and the model is consistent.
    
    Many thanks to William Hua for doing the detective work on this bug!
    Signed-off-by: Federico Mena Quintero's avatarFederico Mena Quintero <federico@gnome.org>
    ea3a750f
Name
Last commit
Last update
build Loading commit data...
demos Loading commit data...
docs Loading commit data...
examples Loading commit data...
gdk Loading commit data...
gtk Loading commit data...
libgail-util Loading commit data...
m4macros Loading commit data...
modules Loading commit data...
perf Loading commit data...
po Loading commit data...
po-properties Loading commit data...
tests Loading commit data...
AUTHORS Loading commit data...
COPYING Loading commit data...
ChangeLog.gtk-async-file-chooser Loading commit data...
ChangeLog.gtk-printing Loading commit data...
ChangeLog.pre-1-0 Loading commit data...
ChangeLog.pre-1-2 Loading commit data...
ChangeLog.pre-2-0 Loading commit data...
ChangeLog.pre-2-10 Loading commit data...
ChangeLog.pre-2-12 Loading commit data...
ChangeLog.pre-2-14 Loading commit data...
ChangeLog.pre-2-16 Loading commit data...
ChangeLog.pre-2-2 Loading commit data...
ChangeLog.pre-2-4 Loading commit data...
ChangeLog.pre-2-6 Loading commit data...
ChangeLog.pre-2-8 Loading commit data...
HACKING Loading commit data...
INSTALL.in Loading commit data...
MAINTAINERS Loading commit data...
Makefile.am Loading commit data...
Makefile.decl Loading commit data...
NEWS Loading commit data...
NEWS.pre-1-0 Loading commit data...
README.commits Loading commit data...
README.in Loading commit data...
README.win32 Loading commit data...
acinclude.m4 Loading commit data...
autogen.sh Loading commit data...
config.h.win32.in Loading commit data...
configure.ac Loading commit data...
gail-3.0.pc.in Loading commit data...
gdk-3.0.pc.in Loading commit data...
git.mk Loading commit data...
gtk+-3.0.pc.in Loading commit data...
gtk+-unix-print-3.0.pc.in Loading commit data...
gtk+.doap Loading commit data...
gtk+.spec.in Loading commit data...
gtk-engine-check-abi.sh Loading commit data...
gtk-zip.sh.in Loading commit data...
makecopyright Loading commit data...
makefile.msc Loading commit data...
sanitize-la.sh Loading commit data...
sanity_check Loading commit data...