From f9b6768588bf0ff245bb48b250a857a94a5c84ba Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Tue, 22 Sep 2020 08:41:04 +0200 Subject: [PATCH] fix crash during startup on 32bit platforms (#86) --- client.go | 6 +++--- main.go | 62 ++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/client.go b/client.go index b71ae958..fb501d33 100644 --- a/client.go +++ b/client.go @@ -138,15 +138,15 @@ func newClient(p *program, nconn net.Conn) *client { func (c *client) close() { delete(c.p.clients, c) - atomic.AddInt64(&c.p.countClient, -1) + atomic.AddInt64(c.p.countClient, -1) switch c.state { case clientStatePlay: - atomic.AddInt64(&c.p.countReader, -1) + atomic.AddInt64(c.p.countReader, -1) c.p.readersMap.remove(c) case clientStateRecord: - atomic.AddInt64(&c.p.countPublisher, -1) + atomic.AddInt64(c.p.countPublisher, -1) if c.streamProtocol == gortsplib.StreamProtocolUDP { for _, track := range c.streamTracks { diff --git a/main.go b/main.go index 6abf901b..917ace69 100644 --- a/main.go +++ b/main.go @@ -31,9 +31,11 @@ type program struct { clients map[*client]struct{} udpPublishersMap *udpPublishersMap readersMap *readersMap - countClient int64 - countPublisher int64 - countReader int64 + // use pointers to avoid a crash on 32bit platforms + // https://github.com/golang/go/issues/9959 + countClient *int64 + countPublisher *int64 + countReader *int64 metricsGather chan metricsGatherReq clientNew chan net.Conn @@ -80,18 +82,30 @@ func newProgram(args []string, stdin io.Reader) (*program, error) { clients: make(map[*client]struct{}), udpPublishersMap: newUdpPublisherMap(), readersMap: newReadersMap(), - metricsGather: make(chan metricsGatherReq), - clientNew: make(chan net.Conn), - clientClose: make(chan *client), - clientDescribe: make(chan clientDescribeReq), - clientAnnounce: make(chan clientAnnounceReq), - clientSetupPlay: make(chan clientSetupPlayReq), - clientPlay: make(chan *client), - clientRecord: make(chan *client), - sourceReady: make(chan *source), - sourceNotReady: make(chan *source), - terminate: make(chan struct{}), - done: make(chan struct{}), + countClient: func() *int64 { + v := int64(0) + return &v + }(), + countPublisher: func() *int64 { + v := int64(0) + return &v + }(), + countReader: func() *int64 { + v := int64(0) + return &v + }(), + metricsGather: make(chan metricsGatherReq), + clientNew: make(chan net.Conn), + clientClose: make(chan *client), + clientDescribe: make(chan clientDescribeReq), + clientAnnounce: make(chan clientAnnounceReq), + clientSetupPlay: make(chan clientSetupPlayReq), + clientPlay: make(chan *client), + clientRecord: make(chan *client), + sourceReady: make(chan *source), + sourceNotReady: make(chan *source), + terminate: make(chan struct{}), + done: make(chan struct{}), } p.log("rtsp-simple-server %s", Version) @@ -140,9 +154,9 @@ func newProgram(args []string, stdin io.Reader) (*program, error) { } func (p *program) log(format string, args ...interface{}) { - countClient := atomic.LoadInt64(&p.countClient) - countPublisher := atomic.LoadInt64(&p.countPublisher) - countReader := atomic.LoadInt64(&p.countReader) + countClient := atomic.LoadInt64(p.countClient) + countPublisher := atomic.LoadInt64(p.countPublisher) + countReader := atomic.LoadInt64(p.countReader) log.Printf(fmt.Sprintf("[%d/%d/%d] "+format, append([]interface{}{countClient, countPublisher, countReader}, args...)...)) @@ -184,15 +198,15 @@ outer: case req := <-p.metricsGather: req.res <- &metricsData{ - countClient: p.countClient, - countPublisher: p.countPublisher, - countReader: p.countReader, + countClient: atomic.LoadInt64(p.countClient), + countPublisher: atomic.LoadInt64(p.countPublisher), + countReader: atomic.LoadInt64(p.countReader), } case conn := <-p.clientNew: c := newClient(p, conn) p.clients[c] = struct{}{} - atomic.AddInt64(&p.countClient, 1) + atomic.AddInt64(p.countClient, 1) c.log("connected") case client := <-p.clientClose: @@ -246,12 +260,12 @@ outer: req.res <- nil case client := <-p.clientPlay: - atomic.AddInt64(&p.countReader, 1) + atomic.AddInt64(p.countReader, 1) client.state = clientStatePlay p.readersMap.add(client) case client := <-p.clientRecord: - atomic.AddInt64(&p.countPublisher, 1) + atomic.AddInt64(p.countPublisher, 1) client.state = clientStateRecord if client.streamProtocol == gortsplib.StreamProtocolUDP {