X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=tgt.go;h=a8525ed426aa2aa374959b18a8ca3a1e507f2753;hb=HEAD;hp=3fa14a0cb142b67d403a437dd87e7f42b727c100;hpb=6dce71355599d4caf8267f6f02520037480f7ba3;p=goredo.git diff --git a/tgt.go b/tgt.go index 3fa14a0..a8525ed 100644 --- a/tgt.go +++ b/tgt.go @@ -1,11 +1,30 @@ +// goredo -- djb's redo implementation on pure Go +// Copyright (C) 2020-2024 Sergey Matveev +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + 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) @@ -43,10 +62,11 @@ type Tgt struct { 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 } h, t := pathSplit(a) res := Tgt{ @@ -54,9 +74,9 @@ func NewTgt(tgt string) *Tgt { rel: mustRel(Cwd, a), dep: path.Join(h, RedoDir, t+DepSuffix), } - if TgtCache != nil { - TgtCache[a] = &res - } + TgtCacheM.Lock() + TgtCache[a] = &res + TgtCacheM.Unlock() return &res }