add script for checking thread locks in funcs that call MakeGitError
This commit is contained in:
parent
520a0425c7
commit
3087e610fb
1
Makefile
1
Makefile
|
@ -4,6 +4,7 @@ build-libgit2:
|
||||||
./script/build-libgit2-static.sh
|
./script/build-libgit2-static.sh
|
||||||
|
|
||||||
test: build-libgit2
|
test: build-libgit2
|
||||||
|
go run script/check-MakeGitError-thread-lock.go
|
||||||
./script/with-static.sh go test ./...
|
./script/with-static.sh go test ./...
|
||||||
|
|
||||||
install: build-libgit2
|
install: build-libgit2
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"go/ast"
|
||||||
|
"go/build"
|
||||||
|
"go/parser"
|
||||||
|
"go/printer"
|
||||||
|
"go/token"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
fset = token.NewFileSet()
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.SetFlags(0)
|
||||||
|
|
||||||
|
bpkg, err := build.ImportDir(".", 0)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
pkgs, err := parser.ParseDir(fset, bpkg.Dir, nil, 0)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pkg := range pkgs {
|
||||||
|
if err := checkPkg(pkg); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(pkgs) == 0 {
|
||||||
|
log.Fatal("No packages to check.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ignoreViolationsInFunc = map[string]bool{
|
||||||
|
"MakeGitError": true,
|
||||||
|
"MakeGitError2": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkPkg(pkg *ast.Package) error {
|
||||||
|
var violations []string
|
||||||
|
ast.Inspect(pkg, func(node ast.Node) bool {
|
||||||
|
switch node := node.(type) {
|
||||||
|
case *ast.FuncDecl:
|
||||||
|
var b bytes.Buffer
|
||||||
|
if err := printer.Fprint(&b, fset, node); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
src := b.String()
|
||||||
|
|
||||||
|
if strings.Contains(src, "MakeGitError") && !strings.Contains(src, "runtime.LockOSThread()") && !strings.Contains(src, "defer runtime.UnlockOSThread()") && !ignoreViolationsInFunc[node.Name.Name] {
|
||||||
|
pos := fset.Position(node.Pos())
|
||||||
|
violations = append(violations, fmt.Sprintf("%s at %s:%d", node.Name.Name, pos.Filename, pos.Line))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
if len(violations) > 0 {
|
||||||
|
return fmt.Errorf("%d non-thread-locked calls to MakeGitError found. To fix, add the following to each func below that calls MakeGitError, before the cgo call that might produce the error:\n\n\truntime.LockOSThread()\n\tdefer runtime.UnlockOSThread()\n\n%s", len(violations), strings.Join(violations, "\n"))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue