github.com/cloudfoundry-attic/ltc@v0.0.0-20151123212628-098adc7919fc/exit_handler/exit_handler.go (about) 1 package exit_handler 2 3 import ( 4 "os" 5 "sync" 6 7 "github.com/cloudfoundry-incubator/ltc/exit_handler/exit_codes" 8 ) 9 10 func New(signalChan chan os.Signal, systemExit func(code int)) ExitHandler { 11 return &exitHandler{ 12 signalChan: signalChan, 13 systemExit: systemExit, 14 onExitFuncs: make([]func(), 0), 15 exitCode: exit_codes.Signal, 16 } 17 } 18 19 type ExitHandler interface { 20 Run() 21 OnExit(exitFunc func()) 22 Exit(code int) 23 } 24 25 type exitHandler struct { 26 onExitFuncs []func() 27 signalChan chan os.Signal 28 systemExit func(int) 29 exitCode int 30 sync.RWMutex 31 } 32 33 func (e *exitHandler) Run() { 34 for { 35 select { 36 case <-e.signalChan: 37 e.Exit(e.exitCode) 38 } 39 } 40 } 41 42 func (e *exitHandler) OnExit(exitFunc func()) { 43 defer e.Unlock() 44 e.Lock() 45 e.onExitFuncs = append(e.onExitFuncs, exitFunc) 46 } 47 48 func (e *exitHandler) Exit(code int) { 49 defer e.RUnlock() 50 e.RLock() 51 for _, exitFunc := range e.onExitFuncs { 52 exitFunc() 53 } 54 e.systemExit(code) 55 }