diff options
author | appilon <apilon@hashicorp.com> | 2019-02-27 16:43:31 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-27 16:43:31 -0500 |
commit | 844b5a68d8af4791755b8f0ad293cc99f5959183 (patch) | |
tree | 255c250a5c9d4801c74092d33b7337d8c14438ff /vendor/github.com/hashicorp/terraform/helper/shadow/value.go | |
parent | 303b299eeb6b06e939e35905e4b34cb410dd9dc3 (diff) | |
parent | 15c0b25d011f37e7c20aeca9eaf461f78285b8d9 (diff) | |
download | terraform-provider-statuscake-844b5a68d8af4791755b8f0ad293cc99f5959183.tar.gz terraform-provider-statuscake-844b5a68d8af4791755b8f0ad293cc99f5959183.tar.zst terraform-provider-statuscake-844b5a68d8af4791755b8f0ad293cc99f5959183.zip |
Merge pull request #27 from terraform-providers/go-modules-2019-02-22
[MODULES] Switch to Go Modules
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/helper/shadow/value.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/helper/shadow/value.go | 87 |
1 files changed, 0 insertions, 87 deletions
diff --git a/vendor/github.com/hashicorp/terraform/helper/shadow/value.go b/vendor/github.com/hashicorp/terraform/helper/shadow/value.go deleted file mode 100644 index 178b7e7..0000000 --- a/vendor/github.com/hashicorp/terraform/helper/shadow/value.go +++ /dev/null | |||
@@ -1,87 +0,0 @@ | |||
1 | package shadow | ||
2 | |||
3 | import ( | ||
4 | "errors" | ||
5 | "sync" | ||
6 | ) | ||
7 | |||
8 | // ErrClosed is returned by any closed values. | ||
9 | // | ||
10 | // A "closed value" is when the shadow has been notified that the real | ||
11 | // side is complete and any blocking values will _never_ be satisfied | ||
12 | // in the future. In this case, this error is returned. If a value is already | ||
13 | // available, that is still returned. | ||
14 | var ErrClosed = errors.New("shadow closed") | ||
15 | |||
16 | // Value is a struct that coordinates a value between two | ||
17 | // parallel routines. It is similar to atomic.Value except that when | ||
18 | // Value is called if it isn't set it will wait for it. | ||
19 | // | ||
20 | // The Value can be closed with Close, which will cause any future | ||
21 | // blocking operations to return immediately with ErrClosed. | ||
22 | type Value struct { | ||
23 | lock sync.Mutex | ||
24 | cond *sync.Cond | ||
25 | value interface{} | ||
26 | valueSet bool | ||
27 | } | ||
28 | |||
29 | func (v *Value) Lock() { | ||
30 | v.lock.Lock() | ||
31 | } | ||
32 | |||
33 | func (v *Value) Unlock() { | ||
34 | v.lock.Unlock() | ||
35 | } | ||
36 | |||
37 | // Close closes the value. This can never fail. For a definition of | ||
38 | // "close" see the struct docs. | ||
39 | func (w *Value) Close() error { | ||
40 | w.lock.Lock() | ||
41 | set := w.valueSet | ||
42 | w.lock.Unlock() | ||
43 | |||
44 | // If we haven't set the value, set it | ||
45 | if !set { | ||
46 | w.SetValue(ErrClosed) | ||
47 | } | ||
48 | |||
49 | // Done | ||
50 | return nil | ||
51 | } | ||
52 | |||
53 | // Value returns the value that was set. | ||
54 | func (w *Value) Value() interface{} { | ||
55 | w.lock.Lock() | ||
56 | defer w.lock.Unlock() | ||
57 | |||
58 | // If we already have a value just return | ||
59 | for !w.valueSet { | ||
60 | // No value, setup the condition variable if we have to | ||
61 | if w.cond == nil { | ||
62 | w.cond = sync.NewCond(&w.lock) | ||
63 | } | ||
64 | |||
65 | // Wait on it | ||
66 | w.cond.Wait() | ||
67 | } | ||
68 | |||
69 | // Return the value | ||
70 | return w.value | ||
71 | } | ||
72 | |||
73 | // SetValue sets the value. | ||
74 | func (w *Value) SetValue(v interface{}) { | ||
75 | w.lock.Lock() | ||
76 | defer w.lock.Unlock() | ||
77 | |||
78 | // Set the value | ||
79 | w.valueSet = true | ||
80 | w.value = v | ||
81 | |||
82 | // If we have a condition, clear it | ||
83 | if w.cond != nil { | ||
84 | w.cond.Broadcast() | ||
85 | w.cond = nil | ||
86 | } | ||
87 | } | ||