diff --git a/beemer.go b/beemer.go index a8a69db..8f26990 100644 --- a/beemer.go +++ b/beemer.go @@ -12,7 +12,7 @@ import ( ) type Beemer struct { - fileMap map[string]*File + fileMap *sync.Map tempDir string beemCommand func(string, string) (string, []string) beemChan chan string @@ -61,19 +61,19 @@ func (b *Beemer) initWatchDir(watchDir string) { func (b *Beemer) getAndResetTimer(name string) *time.Timer { - file, ok := b.fileMap[name] + file, ok := b.fileMap.Load(name) if ok { - file.WaitTimer.Stop() - if file.BeemLock == true { + file.(*File).WaitTimer.Stop() + if file.(*File).BeemLock == true { return nil } } newTimer := time.NewTimer(b.inactiveDelay) - b.fileMap[name] = &File{ + b.fileMap.Store(name, &File{ newTimer, false, - } + }) return newTimer } @@ -97,9 +97,9 @@ func (b *Beemer) handleFileChange(event fsnotify.Event) { go b.handleFileInactive(t, event.Name) } } else if event.Op&fsnotify.Remove == fsnotify.Remove || event.Op&fsnotify.Rename == fsnotify.Rename { - if file, ok := b.fileMap[event.Name]; ok { - file.WaitTimer.Stop() - delete(b.fileMap, event.Name) + if file, ok := b.fileMap.Load(event.Name); ok { + file.(*File).WaitTimer.Stop() + b.fileMap.Delete(event.Name) } } } @@ -191,7 +191,8 @@ func (b *Beemer) beemTar() { func (b *Beemer) handleFileInactive(t *time.Timer, name string) { <-t.C - b.fileMap[name].BeemLock = true + file, _ := b.fileMap.Load(name) + file.(*File).BeemLock = true logrus.WithFields(logrus.Fields{ "name": name, diff --git a/cli.go b/cli.go index 25b0472..4cfdf4e 100644 --- a/cli.go +++ b/cli.go @@ -74,7 +74,7 @@ func main() { } beemer := Beemer{ - fileMap: make(map[string]*File, 0), + fileMap: &sync.Map{}, beemChan: make(chan string, transfers), tarChan: make(chan string, 100), beemCommand: parseCommand(cmdString), diff --git a/util.go b/util.go index a3a0f65..a498bc4 100644 --- a/util.go +++ b/util.go @@ -109,9 +109,10 @@ func isDir(name string) bool { func (b *Beemer) dispose() { b.watcher.Close() - for _, v := range b.fileMap { - v.WaitTimer.Stop() - } + b.fileMap.Range(func(key, value interface{}) bool { + value.(*File).WaitTimer.Stop() + return true + }) close(b.beemChan)