[Mono-list] Fwd: [Mono-osx] FileSystemWatcher

Andreas Färber andreas.faerber at web.de
Fri Jan 19 06:02:12 EST 2007


Hello Miguel,

>> Earlier I was told not to monitor an SMB share because it were
>> implemented using a polling approach for remote shares so instead I
>> connected a Windows drive to an OS X SMB share, monitoring the local
>> changes there. However the same results occurred last time I checked
>> running the DOS app locally on OS X, so without any SMB in  
>> between, so
>> that the latter probably isn't the source of the problem... Also, the
>> same issue occurs when my Mono application performs the changes
>> itself, so I doubt it's an issue with the DOS application performing
>> the changes.
>>
>
> Mono has a special driver for OSX to handle this (it uses kqueue).
>
> The source code is in mono/mono/metadata/filewatcher.c

Unfortunately there was no code such as #ifdef MACOSX in there ;-) so  
thanks for this hint.

FileSystemWatcher.cs gives me no hint on why get_MangledFilter might  
have crashed (it's all managed code) but then again I haven't seen  
this crash for a while now.

I don't know kqueue so ... KeventWatcher.cs is not fundamentally  
wrong and there appears to be no way of enabling debug output. There  
are however a number of undocumented magic numbers specified as flags  
in StartMonitoringDirectory:

ev.filter = -4 sets the filter to EVFILT_VNODE.

Then, ev.flags and ev.fflags appear to use decimal flags while in my  
header files they are declared as hexadecimals! Especially 20 as  
opposed to 0x20 (EV_CLEAR and NOTE_RENAME). Might the incorrect clear  
flag ("clear event state after reporting") explain why sometimes  
after some seconds delay I got a notification and afterwards none?

The polling thread (Monitor) sleeps for 500 ms so still wouldn't  
explain the long initial delay of >5 s unless kqueue were so slow...

Also, error handling is missing in some places... For example, if no  
file descriptor can be obtained it is silently ignored just as for  
exceptions in foreach.
More severely, kevent() returns as errors EV_EOF=0x8000 and  
EV_ERROR=0x4000 yet the code only checks if kevent() > 0 but in that  
case always stops monitoring (closing the file), restarts it (opening  
a new file descriptor) and processes the event - reads like a dirty  
hack... but then again I have no experience with kqueue so I can't  
tell. Geoff, is this a workaround that would be obsoleted by changing  
the flags?

And finally: Is it possible to compile only System.dll from SVN and  
copy it into an existing Mono.framework 1.2 instead of compiling a  
separate runtime?

Andreas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20070119/b5754fc7/attachment.html 


More information about the Mono-list mailing list