run-group-quiter.go 879 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package go_lazy_quiter
  2. import (
  3. "context"
  4. "os"
  5. "os/signal"
  6. )
  7. type RunGroupQuiter struct {
  8. qchan chan os.Signal
  9. ctx context.Context
  10. cncl context.CancelFunc
  11. SignalNotifyFunc func(sig os.Signal)
  12. }
  13. func NewRunGroupQuiter(sig ...os.Signal) *RunGroupQuiter {
  14. r := &RunGroupQuiter{qchan: make(chan os.Signal, 0)}
  15. if sig == nil {
  16. sig = []os.Signal{
  17. os.Interrupt,
  18. os.Kill,
  19. }
  20. }
  21. signal.Notify(r.qchan, sig...)
  22. return r
  23. }
  24. func (q *RunGroupQuiter) Run() error {
  25. q.ctx, q.cncl = context.WithCancel(context.Background())
  26. select {
  27. case <-q.ctx.Done():
  28. {
  29. close(q.qchan)
  30. return nil
  31. }
  32. case sig := <-q.qchan:
  33. {
  34. if q.cncl != nil {
  35. q.cncl()
  36. }
  37. if q.SignalNotifyFunc != nil {
  38. q.SignalNotifyFunc(sig)
  39. }
  40. return nil
  41. }
  42. }
  43. }
  44. func (q *RunGroupQuiter) Stop(err error) {
  45. if q.cncl != nil {
  46. q.cncl()
  47. }
  48. }