[Mono-dev] Announce: Mono.Fuse 0.3.0

Jonathan Pryor jonpryor at vt.edu
Mon Sep 11 06:04:16 EDT 2006


Mono.Fuse is a C# binding for the FUSE library.

This release features a near complete change in the public FileSystem
API; a complete API change list is available at:

http://www.jprl.com/Blog/archive/development/mono/2006/Sep-11.html

Hopefully this will be the last major API change, though I would
appreciate any and all feedback on the current API.

The most "interesting" change is for OnReadDirectory().  It was
previously:

	protected virtual Errno
		OnReadDirectory(string path, out string[] paths, 
		OpenedFileInfo info);

It is now:

	protected virtual Errno
		OnReadDirectory(string path, OpenedPathInfo info, 
		out IEnumerable<FileSystemEntry> paths);

That is, `out string[]' is now `out IEnumerable<FileSystemEntry>'.  This
allows for two things:

1.  A performance boost: an array containing the names of all file
system entries in `path' doesn't need to be created all at once.  For
large directories (hundreds-thousands of files), this can really slow
things down.  The IEnumerable interface allows file system entries to be
retrieved piecemeal.

2.  C# iterators can be used to implement directory reading.  From
HelloFS.cs:

	private IEnumerable<FileSystemEntry> GetEntries ()
	{
	    yield return ".";
	    yield return "..";
	    yield return "hello";
	    yield return "data";
	    if (have_data_im)
	        yield return "data.im";
	}

	protected override Errno OnReadDirectory (string path,
	        OpenedPathInfo info, 
                out IEnumerable<FileSystemEntry> paths)
	{
	    paths = GetEntries ();
	    return 0;
	}

I think (2) is particularly cool.


Design Questions: 

OnReadDirectory() uses FileSystemEntry, which is:

	class FileSystemEntry 
	    public string Path {get;}
	    public Stat Stat;
	    public FileSystemEntry (string path);
	    public static implicit operator FileSystemEntry (string);
	}

This has a public field Stat, which is against normal design guidelines.
This was done because Stat is a 96-byte structure, so these shouldn't be
created on the stack that often, and a read/write Property would require
much more stack use.  Is this reasonable?

The Stat field is optional.  It is only used Stat.st_ino is non-zero (as
FUSE 2.5.3 currently only reads the st_ino & st_mode fields, though I
imagine this could be extended in the future).  Is this reasonable?  Or
should an alternative mechanism be used to determine when the Stat
instance should be used?

Is it a good idea to have the implicit conversion from string to
FileSystemEntry?


Download:

Mono.Fuse 0.3.0 is available for download at:

http://www.jprl.com/Projects/mono-fuse/mono-fuse-0.3.0.tar.gz

Thanks,
 - Jon





More information about the Mono-devel-list mailing list