// Copyright 2015 Google Inc. All Rights Reserved. // Author: jacobsa@google.com (Aaron Jacobs) package memfs import ( "github.com/jacobsa/fuse" "github.com/jacobsa/fuse/fuseutil" "github.com/jacobsa/gcloud/syncutil" "github.com/jacobsa/gcsfuse/timeutil" "golang.org/x/net/context" ) type memFS struct { fuseutil.NotImplementedFileSystem ///////////////////////// // Dependencies ///////////////////////// clock timeutil.Clock ///////////////////////// // Mutable state ///////////////////////// mu syncutil.InvariantMutex // The collection of all inodes that have ever been created, indexed by inode // ID. Some inodes are not in use if they have been unlinked, and no inode // with ID less than fuse.RootInodeID is ever used. // // INVARIANT: len(inodes) > fuse.RootInodeID // INVARIANT: For all i < fuse.RootInodeID, inodes[i].impl == nil // INVARIANT: inodes[fuse.RootInodeID].impl is of type *memDir inodes []inode // GUARDED_BY(mu) // A list of inode IDs within inodes available for reuse, not including the // reserved IDs less than fuse.RootInodeID. // // INVARIANT: This is all and only indices i of inodes such that i > // fuse.RootInodeID and inodes[i].impl == nil freeInodes []fuse.InodeID // GUARDED_BY(mu) } // Create a file system that stores data and metadata in memory. func NewMemFS( clock timeutil.Clock) (fs fuse.FileSystem) { fs = &memFS{ clock: clock, } fs.(*memFS).mu = syncutil.NewInvariantMutex(fs.(*memFS).checkInvariants) return } func (fs *memFS) checkInvariants() { panic("TODO") } func (fs *memFS) Init( ctx context.Context, req *fuse.InitRequest) (resp *fuse.InitResponse, err error) { resp = &fuse.InitResponse{} return }