make lifecycle signal thread safe

This commit is contained in:
Abu Kashem 2021-09-30 15:24:38 -04:00
parent 38746752af
commit d3e2e9ede2
No known key found for this signature in database
GPG Key ID: 33A4FA7088DB68A9

View File

@ -16,6 +16,10 @@ limitations under the License.
package server package server
import (
"sync"
)
/* /*
We make an attempt here to identify the events that take place during We make an attempt here to identify the events that take place during
lifecycle of the apiserver. lifecycle of the apiserver.
@ -143,22 +147,21 @@ func newLifecycleSignals() lifecycleSignals {
func newNamedChannelWrapper(name string) lifecycleSignal { func newNamedChannelWrapper(name string) lifecycleSignal {
return &namedChannelWrapper{ return &namedChannelWrapper{
name: name, name: name,
once: sync.Once{},
ch: make(chan struct{}), ch: make(chan struct{}),
} }
} }
type namedChannelWrapper struct { type namedChannelWrapper struct {
name string name string
once sync.Once
ch chan struct{} ch chan struct{}
} }
func (e *namedChannelWrapper) Signal() { func (e *namedChannelWrapper) Signal() {
select { e.once.Do(func() {
case <-e.ch:
// already closed, don't close again.
default:
close(e.ch) close(e.ch)
} })
} }
func (e *namedChannelWrapper) Signaled() <-chan struct{} { func (e *namedChannelWrapper) Signaled() <-chan struct{} {