@@ -110,7 +110,7 @@ type Conn struct {
110
110
closedRTCMutex sync.Mutex
111
111
closedICE chan struct {}
112
112
closedICEMutex sync.Mutex
113
- closeMutex sync.Mutex
113
+ closeMutex sync.RWMutex
114
114
closeError error
115
115
116
116
dcOpenChannel chan * webrtc.DataChannel
@@ -143,10 +143,15 @@ type Conn struct {
143
143
}
144
144
145
145
func (c * Conn ) logger () slog.Logger {
146
+ // The logger gets swapped
147
+ c .closeMutex .RLock ()
148
+ defer c .closeMutex .RUnlock ()
149
+
146
150
log , valid := c .loggerValue .Load ().(slog.Logger )
147
151
if ! valid {
148
152
return slog.Logger {}
149
153
}
154
+
150
155
return log
151
156
}
152
157
@@ -566,11 +571,14 @@ func (c *Conn) isClosed() bool {
566
571
func (c * Conn ) CloseWithError (err error ) error {
567
572
c .closeMutex .Lock ()
568
573
defer c .closeMutex .Unlock ()
574
+
569
575
if c .isClosed () {
570
576
return c .closeError
571
577
}
572
578
573
- c .logger ().Debug (context .Background (), "closing conn with error" , slog .Error (err ))
579
+ logger := c .logger ()
580
+
581
+ logger .Debug (context .Background (), "closing conn with error" , slog .Error (err ))
574
582
if err == nil {
575
583
c .closeError = ErrClosed
576
584
} else {
@@ -588,21 +596,23 @@ func (c *Conn) CloseWithError(err error) error {
588
596
// Waiting for pion/webrtc to report closed state on both of these
589
597
// ensures no goroutine leaks.
590
598
if c .rtc .ConnectionState () != webrtc .PeerConnectionStateNew {
591
- c . logger () .Debug (context .Background (), "waiting for rtc connection close..." )
599
+ logger .Debug (context .Background (), "waiting for rtc connection close..." )
592
600
<- c .closedRTC
593
601
}
594
602
if c .rtc .ICEConnectionState () != webrtc .ICEConnectionStateNew {
595
- c . logger () .Debug (context .Background (), "waiting for ice connection close..." )
603
+ logger .Debug (context .Background (), "waiting for ice connection close..." )
596
604
<- c .closedICE
597
605
}
598
606
599
607
// Waits for all DataChannels to exit before officially labeling as closed.
600
608
// All logging, goroutines, and async functionality is cleaned up after this.
601
609
c .dcClosedWaitGroup .Wait ()
602
610
603
- c .logger ().Debug (context .Background (), "closed" )
604
611
// Disable logging!
605
612
c .loggerValue .Store (slog.Logger {})
613
+ logger .Sync ()
614
+
615
+ logger .Debug (context .Background (), "closed" )
606
616
close (c .closed )
607
617
return err
608
618
}
0 commit comments