diff --git a/service/usbip/server.go b/service/usbip/server.go index 7628bfb84..384a84918 100644 --- a/service/usbip/server.go +++ b/service/usbip/server.go @@ -36,6 +36,8 @@ type ServerService struct { sessions map[DataSession]struct{} sessionsClosed bool sessionsWG sync.WaitGroup + + pendingConnsWG sync.WaitGroup } func NewServerService(ctx context.Context, logger log.ContextLogger, tag string, options option.USBIPServerServiceOptions) (adapter.Service, error) { @@ -126,6 +128,7 @@ func (s *ServerService) Close() error { for _, session := range sessions { _ = session.Close() } + s.pendingConnsWG.Wait() s.sessionsWG.Wait() s.reconcileAccess.Lock() diff --git a/service/usbip/server_shared.go b/service/usbip/server_shared.go index 7e3e27ffd..64254ec08 100644 --- a/service/usbip/server_shared.go +++ b/service/usbip/server_shared.go @@ -34,11 +34,15 @@ func (s *ServerService) acceptLoop(ln net.Listener) { s.logger.Error("accept: ", err) return } + s.pendingConnsWG.Add(1) go s.dispatchConn(conn) } } func (s *ServerService) dispatchConn(conn net.Conn) { + defer s.pendingConnsWG.Done() + cancelClose := closeConnOnContextDone(s.ctx, conn) + defer cancelClose() var prefix [controlPrefaceSize]byte _, err := io.ReadFull(conn, prefix[:]) if err != nil {