[Geany-devel] GIO file monitor - Re: Changed file saving implementation for systems with GIO

Eugene Arshinov earshinov at xxxxx
Sun Nov 14 11:25:54 UTC 2010


On Sun, 14 Nov 2010 22:02:31 +1100%
Lex Trotman <elextr at gmail.com> wrote:

> On 14 November 2010 21:37, Eugene Arshinov <earshinov at gmail.com>
> wrote:
> > On Sun, 14 Nov 2010 21:24:39 +1100%
> > Lex Trotman <elextr at gmail.com> wrote:
> >
> >> On 14 November 2010 20:31, Eugene Arshinov <earshinov at gmail.com>
> >> wrote:
> >> > Hi.
> >> >
> >> > I don't know whether it was this change which caused this, but
> >> > after I updated recently to r5395 and turned on the #define in
> >> > document.c which controls using GIO file monitor, each time I
> >> > save a document (I only use local filesystems) I get a dialog
> >> > telling me the file was changed. In debug output coming from
> >> > document.c:monitor_file_changed_cb() I see that CHANGE
> >> > notification is sent twice after a file is saved.  Maybe it's
> >> > g_file_replace_contents() which cause this,
> >>
> >> Possibly, g_file_replace_contents writes to the temp file and then
> >> renames the temp file to the old file, but why two??.
> >>
> >> The interesting thing is why doesn't any change to the file trigger
> >> the monitor no matter how its written??  Why does it only happen
> >> for GIO IO??
> >
> > I was not fully correct.  There were 2 CHANGE notifications and 1
> > "unknown" notification between them.  Here is the output I get after
> > opening, changing and saving a file:
> >
> > Geany-INFO: /tmp/temp.xml : XML (UTF-8)
> > Geany-INFO: /tmp/temp.xml : XML (UTF-8)
> > Geany-INFO: monitor_file_changed_cb: event: CHANGED; status: IGNORE
> > -> OK
> > Geany-INFO: monitor_file_changed_cb: event: UNKNOWN; status: OK ->
> > OK Geany-INFO: monitor_file_changed_cb: event: CHANGED; status: OK
> > -> OK
> >
> 
> Since what is called change here is actually last_change_hint, you
> could actually get it several times because its only "probably" the
> last change.

Yes, and it also means that the original implementation, which ignores
exactly one hint callback receives, is wrong.  The comments near
the #define actually tell that GIO based file monitoring is not
completely stable, but when I ran an older version of Geany (maybe rev.
5380) with the #define turned on, saving seemed to work fine.  Though
there is a high probability that I'm wrong because I used that version
only for testing new patches (i.e., rarely).  Anyway, seems that I need
to find a version where saving began to "fail".

> The unknown could be move/rename delete or just plain
> change (probably *not* last??).
> 
> > Note that with my patch the output is different from trunk, but
> > things should be clear.  I'll investigate the unknown notification
> > a bit later today, maybe it is caused by the rename.
> 
> I'm not sure how g_file_monitor would report an atomic rename of a
> temp file over the file we are monitoring??  The directory entry is
> changed and the old inode and data deleted if this was the last hard
> link.
> 
> You would have to test it or look at the source.
> 

Yes, there's a need for experiments.

> But I still don't understand why using g_file_set_contents or plain
> fwrite doesn't trigger the monitor??  I can't see anywhere in
> document.c where it muzzles the monitor whilst saving.
> 

Seems strange for me too.

Best regards,
Eugene.



More information about the Devel mailing list