diff options
Diffstat (limited to 'vendor/google.golang.org/grpc/internal/grpcsync/event.go')
-rw-r--r-- | vendor/google.golang.org/grpc/internal/grpcsync/event.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/vendor/google.golang.org/grpc/internal/grpcsync/event.go b/vendor/google.golang.org/grpc/internal/grpcsync/event.go new file mode 100644 index 0000000..fbe697c --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/grpcsync/event.go | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * | ||
3 | * Copyright 2018 gRPC authors. | ||
4 | * | ||
5 | * Licensed under the Apache License, Version 2.0 (the "License"); | ||
6 | * you may not use this file except in compliance with the License. | ||
7 | * You may obtain a copy of the License at | ||
8 | * | ||
9 | * http://www.apache.org/licenses/LICENSE-2.0 | ||
10 | * | ||
11 | * Unless required by applicable law or agreed to in writing, software | ||
12 | * distributed under the License is distributed on an "AS IS" BASIS, | ||
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
14 | * See the License for the specific language governing permissions and | ||
15 | * limitations under the License. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | // Package grpcsync implements additional synchronization primitives built upon | ||
20 | // the sync package. | ||
21 | package grpcsync | ||
22 | |||
23 | import ( | ||
24 | "sync" | ||
25 | "sync/atomic" | ||
26 | ) | ||
27 | |||
28 | // Event represents a one-time event that may occur in the future. | ||
29 | type Event struct { | ||
30 | fired int32 | ||
31 | c chan struct{} | ||
32 | o sync.Once | ||
33 | } | ||
34 | |||
35 | // Fire causes e to complete. It is safe to call multiple times, and | ||
36 | // concurrently. It returns true iff this call to Fire caused the signaling | ||
37 | // channel returned by Done to close. | ||
38 | func (e *Event) Fire() bool { | ||
39 | ret := false | ||
40 | e.o.Do(func() { | ||
41 | atomic.StoreInt32(&e.fired, 1) | ||
42 | close(e.c) | ||
43 | ret = true | ||
44 | }) | ||
45 | return ret | ||
46 | } | ||
47 | |||
48 | // Done returns a channel that will be closed when Fire is called. | ||
49 | func (e *Event) Done() <-chan struct{} { | ||
50 | return e.c | ||
51 | } | ||
52 | |||
53 | // HasFired returns true if Fire has been called. | ||
54 | func (e *Event) HasFired() bool { | ||
55 | return atomic.LoadInt32(&e.fired) == 1 | ||
56 | } | ||
57 | |||
58 | // NewEvent returns a new, ready-to-use Event. | ||
59 | func NewEvent() *Event { | ||
60 | return &Event{c: make(chan struct{})} | ||
61 | } | ||