Fix KDirLister forgetting to watch a directory after listing it from the cache.
Many many thanks to Frank Reininghaus for the unittest that finally made this issue reproduceable, based on feedback from users in the bug report. The issue: whether to watch a directory with KDirWatch is refcounted. Each lister showing the dir counts as one, the cache itself can add one, and does so initially. If a dir is modified while it's only in the cache, we mark it as dirty, stop watching, and we'll simply update the directory when showing it to the user again later. At that point we need to start watching it again. The old code would do decr+incr, I "optimized" this in 7b9cafaa (oct 2010) to fix the bug that (with an initial refcount of 1), decr would lead to 0 temporarily. However if the item wasn't watched anymore (initial refcount of 0), the decr would do nothing (if (c<0) c=0), and the incr would start the watching. With 7b9cafaa this all went away (I thought decr+incr==noop), so no watching. The proper solution is obviously incr+decr_if_not_done_before_already (when the cache stops watching the dir because a change happened). BUG: 211472 FIXED-IN: 4.9.4
parent
097509bb
Please register or sign in to comment