mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 06:46:42 +08:00
server: make Close() wait for all resources to close
This commit is contained in:
12
client.go
12
client.go
@@ -222,7 +222,7 @@ type Client struct {
|
||||
checkStreamInitial bool
|
||||
tcpLastFrameTime int64
|
||||
keepaliveTimer *time.Timer
|
||||
finalErr error
|
||||
closeError error
|
||||
|
||||
// connCloser channels
|
||||
connCloserTerminate chan struct{}
|
||||
@@ -412,14 +412,14 @@ func (c *Client) StartPublishing(address string, tracks Tracks) error {
|
||||
func (c *Client) Close() error {
|
||||
c.ctxCancel()
|
||||
<-c.done
|
||||
return c.finalErr
|
||||
return c.closeError
|
||||
}
|
||||
|
||||
// Wait waits until all client resources are closed.
|
||||
// This can happen when a read error occurs or when Close() is called.
|
||||
func (c *Client) Wait() error {
|
||||
<-c.done
|
||||
return c.finalErr
|
||||
return c.closeError
|
||||
}
|
||||
|
||||
// Tracks returns all the tracks that the client is reading or publishing.
|
||||
@@ -444,7 +444,7 @@ func (c *Client) Tracks() Tracks {
|
||||
func (c *Client) run() {
|
||||
defer close(c.done)
|
||||
|
||||
c.finalErr = func() error {
|
||||
c.closeError = func() error {
|
||||
for {
|
||||
select {
|
||||
case req := <-c.options:
|
||||
@@ -1746,7 +1746,7 @@ func (c *Client) WritePacketRTP(trackID int, payload []byte) error {
|
||||
if !c.writeFrameAllowed {
|
||||
select {
|
||||
case <-c.done:
|
||||
return c.finalErr
|
||||
return c.closeError
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
@@ -1784,7 +1784,7 @@ func (c *Client) WritePacketRTCP(trackID int, payload []byte) error {
|
||||
if !c.writeFrameAllowed {
|
||||
select {
|
||||
case <-c.done:
|
||||
return c.finalErr
|
||||
return c.closeError
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
|
12
server.go
12
server.go
@@ -142,7 +142,7 @@ type Server struct {
|
||||
udpRTCPListener *serverUDPListener
|
||||
sessions map[string]*ServerSession
|
||||
conns map[*ServerConn]struct{}
|
||||
exitError error
|
||||
closeError error
|
||||
streams map[*ServerStream]struct{}
|
||||
|
||||
// in
|
||||
@@ -302,18 +302,18 @@ func (s *Server) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Close closes all the server resources.
|
||||
// It doesn't wait for the server resources to close (use Wait for that).
|
||||
// Close closes all the server resources and waits for the to close.
|
||||
func (s *Server) Close() error {
|
||||
s.ctxCancel()
|
||||
return nil
|
||||
s.wg.Wait()
|
||||
return s.closeError
|
||||
}
|
||||
|
||||
// Wait waits until all server resources are closed.
|
||||
// This can happen when a fatal error occurs or when Close() is called.
|
||||
func (s *Server) Wait() error {
|
||||
s.wg.Wait()
|
||||
return s.exitError
|
||||
return s.closeError
|
||||
}
|
||||
|
||||
func (s *Server) run() {
|
||||
@@ -355,7 +355,7 @@ func (s *Server) run() {
|
||||
}
|
||||
}()
|
||||
|
||||
s.exitError = func() error {
|
||||
s.closeError = func() error {
|
||||
for {
|
||||
select {
|
||||
case err := <-acceptErr:
|
||||
|
@@ -164,7 +164,6 @@ func TestServerPublishErrorAnnounce(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -252,7 +251,6 @@ func TestServerPublishSetupPath(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -349,7 +347,6 @@ func TestServerPublishErrorSetupDifferentPaths(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -433,7 +430,6 @@ func TestServerPublishErrorSetupTrackTwice(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -534,7 +530,6 @@ func TestServerPublishErrorRecordPartialTracks(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -675,7 +670,6 @@ func TestServerPublish(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -876,7 +870,6 @@ func TestServerPublishNonStandardFrameSize(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -978,7 +971,6 @@ func TestServerPublishErrorInvalidProtocol(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1081,7 +1073,6 @@ func TestServerPublishRTCPReport(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1242,7 +1233,6 @@ func TestServerPublishTimeout(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1372,7 +1362,6 @@ func TestServerPublishWithoutTeardown(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1489,7 +1478,6 @@ func TestServerPublishUDPChangeConn(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
sxID := ""
|
||||
|
@@ -110,7 +110,6 @@ func TestServerReadSetupPath(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -176,7 +175,6 @@ func TestServerReadSetupErrors(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -344,7 +342,6 @@ func TestServerRead(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", listenIP+":8554")
|
||||
@@ -604,7 +601,6 @@ func TestServerReadNonStandardFrameSize(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -705,7 +701,6 @@ func TestServerReadTCPResponseBeforeFrames(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -778,7 +773,6 @@ func TestServerReadPlayPlay(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -887,7 +881,6 @@ func TestServerReadPlayPausePlay(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1003,7 +996,6 @@ func TestServerReadPlayPausePause(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1116,7 +1108,6 @@ func TestServerReadTimeout(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1215,7 +1206,6 @@ func TestServerReadWithoutTeardown(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
nconn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1303,7 +1293,6 @@ func TestServerReadUDPChangeConn(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
sxID := ""
|
||||
@@ -1396,7 +1385,6 @@ func TestServerReadErrorUDPSamePorts(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
func() {
|
||||
@@ -1503,7 +1491,6 @@ func TestServerReadNonSetuppedPath(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1669,7 +1656,6 @@ func TestServerReadAdditionalInfos(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
buf, err := (&rtp.Packet{
|
||||
|
@@ -436,7 +436,6 @@ func TestServerHighLevelPublishRead(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
switch ca.publisherSoft {
|
||||
@@ -538,7 +537,6 @@ func TestServerClose(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
s.Close()
|
||||
s.Close()
|
||||
}
|
||||
@@ -583,7 +581,6 @@ func TestServerConnClose(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -599,7 +596,6 @@ func TestServerCSeq(t *testing.T) {
|
||||
}
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -634,7 +630,6 @@ func TestServerErrorCSeqMissing(t *testing.T) {
|
||||
}
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -667,7 +662,6 @@ func TestServerErrorInvalidMethod(t *testing.T) {
|
||||
}
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -717,7 +711,6 @@ func TestServerErrorTCPTwoConnOneSession(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn1, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -816,7 +809,6 @@ func TestServerErrorTCPOneConnTwoSessions(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -903,7 +895,6 @@ func TestServerGetSetParameter(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -976,7 +967,6 @@ func TestServerErrorInvalidSession(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1020,7 +1010,6 @@ func TestServerSessionClose(t *testing.T) {
|
||||
|
||||
err := s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1076,7 +1065,6 @@ func TestServerSessionAutoClose(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
@@ -1155,7 +1143,6 @@ func TestServerErrorInvalidPath(t *testing.T) {
|
||||
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Wait()
|
||||
defer s.Close()
|
||||
|
||||
conn, err := net.Dial("tcp", "localhost:8554")
|
||||
|
Reference in New Issue
Block a user