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  }