GoPLS Viewer

Home|gopls/godoc/vfs/gatefs/gatefs.go
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.
4
5// Package gatefs provides an implementation of the FileSystem
6// interface that wraps another FileSystem and limits its concurrency.
7package gatefs // import "golang.org/x/tools/godoc/vfs/gatefs"
8
9import (
10    "fmt"
11    "os"
12
13    "golang.org/x/tools/godoc/vfs"
14)
15
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.
19func New(fs vfs.FileSystemgateCh chan boolvfs.FileSystem {
20    if cap(gateCh) == 0 {
21        return fs
22    }
23    return gatefs{fsgate(gateCh)}
24}
25
26type gate chan bool
27
28func (g gateenter() { g <- true }
29func (g gateleave() { <-g }
30
31type gatefs struct {
32    fs vfs.FileSystem
33    gate
34}
35
36func (fs gatefsString() string {
37    return fmt.Sprintf("gated(%s, %d)"fs.fs.String(), cap(fs.gate))
38}
39
40func (fs gatefsRootType(path stringvfs.RootType {
41    return fs.fs.RootType(path)
42}
43
44func (fs gatefsOpen(p string) (vfs.ReadSeekClosererror) {
45    fs.enter()
46    defer fs.leave()
47    rscerr := fs.fs.Open(p)
48    if err != nil {
49        return nilerr
50    }
51    return gatef{rscfs.gate}, nil
52}
53
54func (fs gatefsLstat(p string) (os.FileInfoerror) {
55    fs.enter()
56    defer fs.leave()
57    return fs.fs.Lstat(p)
58}
59
60func (fs gatefsStat(p string) (os.FileInfoerror) {
61    fs.enter()
62    defer fs.leave()
63    return fs.fs.Stat(p)
64}
65
66func (fs gatefsReadDir(p string) ([]os.FileInfoerror) {
67    fs.enter()
68    defer fs.leave()
69    return fs.fs.ReadDir(p)
70}
71
72type gatef struct {
73    rsc vfs.ReadSeekCloser
74    gate
75}
76
77func (f gatefRead(p []byte) (n interr error) {
78    f.enter()
79    defer f.leave()
80    return f.rsc.Read(p)
81}
82
83func (f gatefSeek(offset int64whence int) (ret int64err error) {
84    f.enter()
85    defer f.leave()
86    return f.rsc.Seek(offsetwhence)
87}
88
89func (f gatefClose() error {
90    f.enter()
91    defer f.leave()
92    return f.rsc.Close()
93}
94
MembersX
gatef.Read.f
os
gate.enter
gatefs.RootType.fs
gatefs.Open.err
gatefs.Lstat.p
gatefs.ReadDir.fs
gatefs.ReadDir.p
gate.leave.g
gatefs.Open.fs
gatefs.Open.p
gatefs.Stat.p
gatef.Seek
gatef.Seek.offset
gatef.Seek.whence
fmt
gate.enter.g
gatefs.RootType
gatefs.Lstat
gatefs.Stat
New.gateCh
gatefs.String
gatefs.Open.rsc
gatefs.Stat.fs
gatef
gatef.Read.p
New
gate
gate.leave
gatefs.String.fs
gatef.Read.n
gatef.Seek.ret
gatef.Close
New.fs
gatefs
gatefs.RootType.path
gatefs.Lstat.fs
gatefs.ReadDir
gatef.Seek.err
gatef.Close.f
vfs
gatefs.Open
gatef.Seek.f
gatefs.fs
gatef.rsc
gatef.Read
gatef.Read.err
Members
X