]> Cypherpunks.ru repositories - goredo.git/blobdiff - tgt.go
Prevent race
[goredo.git] / tgt.go
diff --git a/tgt.go b/tgt.go
index 8e454f2c94a884dc85a826e47ba570eaf705c362..1cba1e625043f4c82c06161f5ece9357ba98120e 100644 (file)
--- a/tgt.go
+++ b/tgt.go
@@ -3,9 +3,13 @@ package main
 import (
        "path"
        "path/filepath"
+       "sync"
 )
 
-var TgtCache = make(map[string]*Tgt)
+var (
+       TgtCache  = make(map[string]*Tgt)
+       TgtCacheM sync.RWMutex
+)
 
 func mustAbs(pth string) string {
        pth, err := filepath.Abs(pth)
@@ -27,45 +31,44 @@ func cwdMustRel(paths ...string) string {
        return mustRel(Cwd, path.Join(paths...))
 }
 
+func pathSplit(a string) (h, t string) {
+       h, t = path.Split(a)
+       if len(h) > 1 {
+               h = h[:len(h)-1]
+       }
+       return
+}
+
 type Tgt struct {
-       // a/h/t resemble zsh'es :a, :h, :t modifiers
        a   string // absolute path
-       h   string // head of the path, directory
-       t   string // tail of the path, only name
        rel string // relative to Cwd
        dep string // path to dependency file
 }
 
 func NewTgt(tgt string) *Tgt {
        a := mustAbs(tgt)
-       if TgtCache != nil {
-               if t := TgtCache[a]; t != nil {
-                       return t
-               }
+       TgtCacheM.RLock()
+       cached := TgtCache[a]
+       TgtCacheM.RUnlock()
+       if cached != nil {
+               return cached
        }
-       t := Tgt{a: a}
-       t.h, t.t = path.Split(t.a)
-       if len(t.h) > 1 {
-               t.h = t.h[:len(t.h)-1]
+       h, t := pathSplit(a)
+       res := Tgt{
+               a:   a,
+               rel: mustRel(Cwd, a),
+               dep: path.Join(h, RedoDir, t+DepSuffix),
        }
-       t.rel = mustRel(Cwd, t.a)
-       if TgtCache != nil {
-               TgtCache[a] = &t
-       }
-       return &t
+       TgtCacheM.Lock()
+       TgtCache[a] = &res
+       TgtCacheM.Unlock()
+       return &res
 }
 
 func (tgt *Tgt) String() string {
        return tgt.rel
 }
 
-func (tgt *Tgt) Dep() string {
-       if tgt.dep == "" {
-               tgt.dep = path.Join(tgt.h, RedoDir, tgt.t+DepSuffix)
-       }
-       return tgt.dep
-}
-
 func (tgt *Tgt) RelTo(cwd string) string {
        return mustRel(cwd, tgt.a)
 }