1 // Copyright 2013 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Package gatefs provides an implementation of the FileSystem
6 // interface that wraps another FileSystem and limits its concurrency.
7 package gatefs // import "golang.org/x/tools/godoc/vfs/gatefs"
13 "golang.org/x/tools/godoc/vfs"
16 // New returns a new FileSystem that delegates to fs.
17 // If gateCh is non-nil and buffered, it's used as a gate
18 // to limit concurrency on calls to fs.
19 func New(fs vfs.FileSystem, gateCh chan bool) vfs.FileSystem {
23 return gatefs{fs, gate(gateCh)}
28 func (g gate) enter() { g <- true }
29 func (g gate) leave() { <-g }
36 func (fs gatefs) String() string {
37 return fmt.Sprintf("gated(%s, %d)", fs.fs.String(), cap(fs.gate))
40 func (fs gatefs) RootType(path string) vfs.RootType {
41 return fs.fs.RootType(path)
44 func (fs gatefs) Open(p string) (vfs.ReadSeekCloser, error) {
47 rsc, err := fs.fs.Open(p)
51 return gatef{rsc, fs.gate}, nil
54 func (fs gatefs) Lstat(p string) (os.FileInfo, error) {
60 func (fs gatefs) Stat(p string) (os.FileInfo, error) {
66 func (fs gatefs) ReadDir(p string) ([]os.FileInfo, error) {
69 return fs.fs.ReadDir(p)
73 rsc vfs.ReadSeekCloser
77 func (f gatef) Read(p []byte) (n int, err error) {
83 func (f gatef) Seek(offset int64, whence int) (ret int64, err error) {
86 return f.rsc.Seek(offset, whence)
89 func (f gatef) Close() error {