...
1package client
2
3import (
4 "fmt"
5 "time"
6
7 "golang.conradwood.net/go-easyops/utils"
8)
9
10type TimeoutLock interface {
11 Unlock()
12 Lock()
13 LockWithTimeout(time.Duration) bool // true if lock was acquired
14}
15
16type timeoutlock struct {
17 ch chan bool
18 name string
19 lockedat string
20}
21
22func NewTimeoutLock(name string) TimeoutLock {
23 tl := &timeoutlock{
24 name: name,
25 ch: make(chan bool, 1),
26 }
27 return tl
28}
29
30func (tl *timeoutlock) Lock() {
31 tl.ch <- true
32 tl.lockedat = utils.GetStack("lock %s", tl.name)
33}
34func (tl *timeoutlock) LockWithTimeout(t time.Duration) bool {
35 select {
36 case tl.ch <- true:
37 tl.lockedat = utils.GetStack("lock %s", tl.name)
38 return true
39 case <-time.After(t):
40 utils.PrintStack("[go-easyops] lock \"%s\" timeout", tl.name)
41 fmt.Printf("lock \"%s\" was locked at: %s\n", tl.name, tl.lockedat)
42 return false
43 }
44
45}
46func (tl *timeoutlock) Unlock() {
47 select {
48 case <-tl.ch:
49 //
50 default:
51 // nothing to unlock
52 fmt.Printf("[go-easyops] timeoutlock \"%s\" unlocked but was not locked previously\n", tl.name)
53 utils.PrintStack("[go-easyops]")
54 }
55}
View as plain text