master
go 71 lines 1.1 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package filelock
4
5 import (
6 "path/filepath"
7
8 "github.com/gofrs/flock"
9 )
10
11 func New(dir string) *Locker {
12 return &Locker{
13 suffix: ".collector.lock",
14 dir: dir,
15 locks: make(map[string]*flock.Flock),
16 }
17 }
18
19 type Locker struct {
20 suffix string
21 dir string
22 locks map[string]*flock.Flock
23 }
24
25 func (l *Locker) Lock(name string) (bool, error) {
26 filename := l.filename(name)
27
28 if _, ok := l.locks[filename]; ok {
29 return true, nil
30 }
31
32 locker := flock.New(filename)
33
34 ok, err := locker.TryLock()
35 if ok {
36 l.locks[filename] = locker
37 } else {
38 _ = locker.Close()
39 }
40
41 return ok, err
42 }
43
44 func (l *Locker) Unlock(name string) {
45 filename := l.filename(name)
46
47 locker, ok := l.locks[filename]
48 if !ok {
49 return
50 }
51
52 delete(l.locks, filename)
53
54 _ = locker.Close()
55 }
56
57 func (l *Locker) UnlockAll() {
58 for key, locker := range l.locks {
59 delete(l.locks, key)
60 _ = locker.Close()
61 }
62 }
63
64 func (l *Locker) isLocked(name string) bool {
65 _, ok := l.locks[l.filename(name)]
66 return ok
67 }
68
69 func (l *Locker) filename(name string) string {
70 return filepath.Join(l.dir, name+l.suffix)
71 }