Redeclared the inode struct.
parent
7922d064fa
commit
8c9b8c09e6
|
@ -4,36 +4,57 @@
|
||||||
package memfs
|
package memfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"github.com/jacobsa/fuse"
|
"github.com/jacobsa/fuse"
|
||||||
|
"github.com/jacobsa/fuse/fuseutil"
|
||||||
|
"github.com/jacobsa/gcloud/syncutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Common attributes for files and directories.
|
// Common attributes for files and directories.
|
||||||
//
|
//
|
||||||
// TODO(jacobsa): Add tests for interacting with a file/directory after it has
|
// TODO(jacobsa): Add tests for interacting with a file/directory after it has
|
||||||
// been unlinked, including creating a new file. Make sure we don't screw up
|
// been unlinked, including creating a new file. Make sure we don't screw up
|
||||||
// and reuse the inode while it is still in use.
|
// and reuse an inode ID while it is still in use.
|
||||||
type inode struct {
|
type inode struct {
|
||||||
// The *memFile or *memDir for this inode, or nil if the inode is available
|
/////////////////////////
|
||||||
// for reuse.
|
// Constant data
|
||||||
|
/////////////////////////
|
||||||
|
|
||||||
|
// Is this a directory? If not, it is a file.
|
||||||
|
bool dir
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// Mutable state
|
||||||
|
/////////////////////////
|
||||||
|
|
||||||
|
mu syncutil.InvariantMutex
|
||||||
|
|
||||||
|
// The current attributes of this inode.
|
||||||
//
|
//
|
||||||
// INVARIANT: impl is nil, or of type *memFile or *memDir
|
// INVARIANT: No non-permission mode bits are set besides os.ModeDir
|
||||||
impl interface{}
|
// INVARIANT: If dir, then os.ModeDir is set
|
||||||
|
// INVARIANT: If !dir, then os.ModeDir is not set
|
||||||
|
attributes fuse.InodeAttributes // GUARDED_BY(mu)
|
||||||
|
|
||||||
|
// For directories, entries describing the children of the directory.
|
||||||
|
//
|
||||||
|
// This array can never be shortened, nor can its elements be moved, because
|
||||||
|
// we use its indices for Dirent.Offset, which is exposed to the user who
|
||||||
|
// might be calling readdir in a loop while concurrently modifying the
|
||||||
|
// directory. Unused entries can, however, be reused.
|
||||||
|
//
|
||||||
|
// TODO(jacobsa): Add good tests exercising concurrent modifications while
|
||||||
|
// doing readdir, seekdir, etc. calls.
|
||||||
|
//
|
||||||
|
// INVARIANT: If dir is false, this is nil.
|
||||||
|
// INVARIANT: For each i, entries[i].Offset == i+1
|
||||||
|
entries []fuseutil.Dirent // GUARDED_BY(mu)
|
||||||
|
|
||||||
|
// For files, the current contents of the file.
|
||||||
|
//
|
||||||
|
// INVARIANT: If dir is true, this is nil.
|
||||||
|
contents []byte // GUARDED_BY(mu)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (inode *inode) checkInvariants() {
|
func newInode(dir bool) (inode *inode)
|
||||||
switch inode.impl.(type) {
|
|
||||||
case nil:
|
|
||||||
case *memFile:
|
|
||||||
case *memDir:
|
|
||||||
default:
|
|
||||||
panic(
|
|
||||||
fmt.Sprintf("Unexpected inode impl type: %v", reflect.TypeOf(inode.impl)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (inode *inode) Attributes() fuse.InodeAttributes {
|
func (inode *inode) checkInvariants()
|
||||||
return fuse.InodeAttributes{}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue