problem with KIO::NetAccess and KDirLister/KFileTreeView

Josef Weidendorfer Josef.Weidendorfer at gmx.de
Tue Oct 8 14:45:27 BST 2002


Hi,

I think I found the problem:

See documentation of KDirWatch::restartDirScan():

   /**
    * Restarts scanning for specified path.
    *
    * Resets ctime. It doesn't notify
    * the change (by emitted a signal), since the ctime value is reset.
    *
    * Call it when you are finished with big operations on that path,
    * @em and when @em you have refreshed that path.  Returns @p false
    * if specified path is not in list, @p true otherwise.
    */
   bool restartDirScan(const QString& path);

Pending events are deleted - on purpose - and since ages. This documentation 
is from dsweet on 2000/6/25. I never changed any semantics.

So KIO::DeleteJob is using KDirWatch the wrong way: The path contents should 
be refreshed. This never was right.

On the other side: This API is nonsense. If the path is to be refreshed before 
calling restartDirScan(), we always can miss an event happening after the 
refresh but before the restartDirScan() call.
Fix: Never delete pending events and let the refresh happen in response to 
signals from KDirWatch: To keep BC, I suggest adding a
  bool restartDirScan(const QString& path, bool clearPending);
and mark the old one as obsolete. If you look at the implementation of 
restartDirScan, this is quite easy.

Can the above race condition happen with KDirLister in general?
I.e. does it read in the directory content before setting a watch?

Josef


On Tuesday 08 October 2002 14:26, Klaas Freitag wrote:
> On Tue, 8 Oct 2002, David Faure wrote:

> > I guess this is done by KDirLister (which sort of "quits" the dir, and
> > then "re-enters" it). Some kdBacktrace() investigation by Klaas would
> > help ;)
>
> Hmmm. Investigation is the wrong word here, but I can attach a file showing
> the context of start- and stop scanning, renaming starts at line 627 to see
> in the logfile.  For me it seems as if the delete event arrives first and
> makes KDirWatch stop scanning (line 645) with stopDirScan. The following
> backtrace in the log is printed in the next line of kdirwatch. The restart
> follows immediately by restartEntryScanDir. For me, the log shows that the
> 'here is a new file' signal does not appear. Hmmm. I hope you see what
> happens :-)
>
> Klaas





More information about the kde-core-devel mailing list