run-group-quiter.go 734 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. }
  12. func NewRunGroupQuiter(sig ...os.Signal) *RunGroupQuiter {
  13. r := &RunGroupQuiter{qchan: make(chan os.Signal, 0)}
  14. if sig == nil {
  15. sig = []os.Signal{
  16. os.Interrupt,
  17. os.Kill,
  18. }
  19. }
  20. signal.Notify(r.qchan, sig...)
  21. return r
  22. }
  23. func (q *RunGroupQuiter) Run() error {
  24. q.ctx, q.cncl = context.WithCancel(context.Background())
  25. select {
  26. case <-q.ctx.Done():
  27. {
  28. close(q.qchan)
  29. return nil
  30. }
  31. case <-q.qchan:
  32. {
  33. if q.cncl != nil {
  34. q.cncl()
  35. }
  36. return nil
  37. }
  38. }
  39. }
  40. func (q *RunGroupQuiter) Stop(err error) {
  41. if q.cncl != nil {
  42. q.cncl()
  43. }
  44. }