conn.go 515 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package grace
  2. import (
  3. "errors"
  4. "net"
  5. "sync"
  6. )
  7. type graceConn struct {
  8. net.Conn
  9. server *Server
  10. m sync.Mutex
  11. closed bool
  12. }
  13. func (c *graceConn) Close() (err error) {
  14. defer func() {
  15. if r := recover(); r != nil {
  16. switch x := r.(type) {
  17. case string:
  18. err = errors.New(x)
  19. case error:
  20. err = x
  21. default:
  22. err = errors.New("Unknown panic")
  23. }
  24. }
  25. }()
  26. c.m.Lock()
  27. if c.closed {
  28. c.m.Unlock()
  29. return
  30. }
  31. c.server.wg.Done()
  32. c.closed = true
  33. c.m.Unlock()
  34. return c.Conn.Close()
  35. }