Source File
signal.go
Belonging Package
go.uber.org/fx
// Copyright (c) 2022 Uber Technologies, Inc.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to deal// in the Software without restriction, including without limitation the rights// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN// THE SOFTWARE.package fximport ()// ShutdownSignal represents a signal to be written to Wait or Done.// Should a user call the Shutdown method via the Shutdowner interface with// a provided ExitCode, that exit code will be populated in the ExitCode field.//// Should the application receive an operating system signal,// the Signal field will be populated with the received os.Signal.type ShutdownSignal struct {Signal os.SignalExitCode int}// String will render a ShutdownSignal type as a string suitable for printing.func ( ShutdownSignal) () string {return fmt.Sprintf("%v", .Signal)}func newSignalReceivers() signalReceivers {return signalReceivers{notify: signal.Notify,stopNotify: signal.Stop,signals: make(chan os.Signal, 1),b: &broadcaster{},}}// signalReceivers listens to OS signals and shutdown signals,// and relays them to registered listeners when started.type signalReceivers struct {// this mutex protects writes and reads of this struct to prevent// race conditions in a parallel execution patternm sync.Mutex// our os.Signal channel we relay fromsignals chan os.Signal// when written to, will instruct the signal relayer to shutdownshutdown chan struct{}// is written to when signal relay has finished shutting downfinished chan struct{}// this stub allows us to unit test signal relay functionalitynotify func(c chan<- os.Signal, sig ...os.Signal)stopNotify func(c chan<- os.Signal)// used to register and broadcast to signal listeners// created via Done and Waitb *broadcaster}func ( *signalReceivers) () {defer func() {.finished <- struct{}{}}()select {case <-.shutdown:returncase := <-.signals:.b.Broadcast(ShutdownSignal{Signal: ,})}}// running returns true if the the signal relay go-routine is running.// this method must be invoked under locked mutex to avoid race condition.func ( *signalReceivers) () bool {return .shutdown != nil && .finished != nil}func ( *signalReceivers) () {.m.Lock()defer .m.Unlock()// if the receiver has already been started; don't start it againif .running() {return}.finished = make(chan struct{}, 1).shutdown = make(chan struct{}, 1).notify(.signals, os.Interrupt, _sigINT, _sigTERM)go .relayer()}func ( *signalReceivers) ( context.Context) error {.m.Lock()defer .m.Unlock().stopNotify(.signals)// if the relayer is not running; return nil errorif !.running() {return nil}.shutdown <- struct{}{}select {case <-.Done():return .Err()case <-.finished:close(.shutdown)close(.finished).shutdown = nil.finished = nil.b.reset()return nil}}func ( *signalReceivers) () <-chan os.Signal {return .b.Done()}func ( *signalReceivers) () <-chan ShutdownSignal {return .b.Wait()}
![]() |
The pages are generated with Golds v0.8.2. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |