Skip to content

Commit 4f67c90

Browse files
committed
Replace custom atomicBool with sync/atomic.Bool
- Remove custom atomicBool implementation - Replace all atomicBool usages with standard library sync/atomic.Bool Signed-off-by: Xiaobo Liu <[email protected]>
1 parent 887f5c6 commit 4f67c90

8 files changed

+66
-94
lines changed

atomicbool.go

Lines changed: 0 additions & 32 deletions
This file was deleted.

datachannel_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fmt"
88
"io"
99
"sync"
10+
"sync/atomic"
1011
"testing"
1112
"time"
1213

@@ -450,23 +451,23 @@ func TestDataChannelParameters(t *testing.T) { //nolint:cyclop
450451
assert.Fail(t, "OnDataChannel must not be fired when negotiated == true")
451452
})
452453

453-
seenAnswerMessage := &atomicBool{}
454-
seenOfferMessage := &atomicBool{}
454+
seenAnswerMessage := &atomic.Bool{}
455+
seenOfferMessage := &atomic.Bool{}
455456

456457
answerDatachannel.OnMessage(func(msg DataChannelMessage) {
457458
if msg.IsString && string(msg.Data) == expectedMessage {
458-
seenAnswerMessage.set(true)
459+
seenAnswerMessage.Store(true)
459460
}
460461
})
461462

462463
offerDatachannel.OnMessage(func(msg DataChannelMessage) {
463464
if msg.IsString && string(msg.Data) == expectedMessage {
464-
seenOfferMessage.set(true)
465+
seenOfferMessage.Store(true)
465466
}
466467
})
467468

468469
go func() {
469-
for seenAnswerMessage.get() && seenOfferMessage.get() {
470+
for seenAnswerMessage.Load() && seenOfferMessage.Load() {
470471
if offerDatachannel.ReadyState() == DataChannelStateOpen {
471472
assert.NoError(t, offerDatachannel.SendText(expectedMessage))
472473
}

operations.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package webrtc
66
import (
77
"container/list"
88
"sync"
9+
"sync/atomic"
910
)
1011

1112
// Operation is a function.
@@ -17,13 +18,13 @@ type operations struct {
1718
busyCh chan struct{}
1819
ops *list.List
1920

20-
updateNegotiationNeededFlagOnEmptyChain *atomicBool
21+
updateNegotiationNeededFlagOnEmptyChain *atomic.Bool
2122
onNegotiationNeeded func()
2223
isClosed bool
2324
}
2425

2526
func newOperations(
26-
updateNegotiationNeededFlagOnEmptyChain *atomicBool,
27+
updateNegotiationNeededFlagOnEmptyChain *atomic.Bool,
2728
onNegotiationNeeded func(),
2829
) *operations {
2930
return &operations{
@@ -150,9 +151,9 @@ func (o *operations) start() {
150151
fn()
151152
fn = o.pop()
152153
}
153-
if !o.updateNegotiationNeededFlagOnEmptyChain.get() {
154+
if !o.updateNegotiationNeededFlagOnEmptyChain.Load() {
154155
return
155156
}
156-
o.updateNegotiationNeededFlagOnEmptyChain.set(false)
157+
o.updateNegotiationNeededFlagOnEmptyChain.Store(false)
157158
o.onNegotiationNeeded()
158159
}

operations_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ package webrtc
55

66
import (
77
"sync"
8+
"sync/atomic"
89
"testing"
910

1011
"github.com/stretchr/testify/assert"
1112
)
1213

1314
func TestOperations_Enqueue(t *testing.T) {
14-
updateNegotiationNeededFlagOnEmptyChain := &atomicBool{}
15+
updateNegotiationNeededFlagOnEmptyChain := &atomic.Bool{}
1516
onNegotiationNeededCalledCount := 0
1617
var onNegotiationNeededCalledCountMu sync.Mutex
1718
ops := newOperations(updateNegotiationNeededFlagOnEmptyChain, func() {
@@ -29,7 +30,7 @@ func TestOperations_Enqueue(t *testing.T) {
2930
ops.Enqueue(func() {
3031
results[j] = j * j
3132
if resultSetCopy > 50 {
32-
updateNegotiationNeededFlagOnEmptyChain.set(true)
33+
updateNegotiationNeededFlagOnEmptyChain.Store(true)
3334
}
3435
})
3536
}(i)
@@ -46,14 +47,14 @@ func TestOperations_Enqueue(t *testing.T) {
4647
}
4748

4849
func TestOperations_Done(*testing.T) {
49-
ops := newOperations(&atomicBool{}, func() {
50+
ops := newOperations(&atomic.Bool{}, func() {
5051
})
5152
defer ops.GracefulClose()
5253
ops.Done()
5354
}
5455

5556
func TestOperations_GracefulClose(t *testing.T) {
56-
ops := newOperations(&atomicBool{}, func() {
57+
ops := newOperations(&atomic.Bool{}, func() {
5758
})
5859

5960
counter := 0

peerconnection.go

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ type PeerConnection struct {
5555

5656
idpLoginURL *string
5757

58-
isClosed *atomicBool
58+
isClosed *atomic.Bool
5959
isGracefullyClosingOrClosed bool
6060
isCloseDone chan struct{}
6161
isGracefulCloseDone chan struct{}
62-
isNegotiationNeeded *atomicBool
63-
updateNegotiationNeededFlagOnEmptyChain *atomicBool
62+
isNegotiationNeeded *atomic.Bool
63+
updateNegotiationNeededFlagOnEmptyChain *atomic.Bool
6464

6565
lastOffer string
6666
lastAnswer string
@@ -124,11 +124,11 @@ func (api *API) NewPeerConnection(configuration Configuration) (*PeerConnection,
124124
Certificates: []Certificate{},
125125
ICECandidatePoolSize: 0,
126126
},
127-
isClosed: &atomicBool{},
127+
isClosed: &atomic.Bool{},
128128
isCloseDone: make(chan struct{}),
129129
isGracefulCloseDone: make(chan struct{}),
130-
isNegotiationNeeded: &atomicBool{},
131-
updateNegotiationNeededFlagOnEmptyChain: &atomicBool{},
130+
isNegotiationNeeded: &atomic.Bool{},
131+
updateNegotiationNeededFlagOnEmptyChain: &atomic.Bool{},
132132
lastOffer: "",
133133
lastAnswer: "",
134134
greaterMid: -1,
@@ -296,7 +296,7 @@ func (pc *PeerConnection) onNegotiationNeeded() {
296296
// 4.7.3.1 If the length of connection.[[Operations]] is not 0, then set
297297
// connection.[[UpdateNegotiationNeededFlagOnEmptyChain]] to true, and abort these steps.
298298
if !pc.ops.IsEmpty() {
299-
pc.updateNegotiationNeededFlagOnEmptyChain.set(true)
299+
pc.updateNegotiationNeededFlagOnEmptyChain.Store(true)
300300

301301
return
302302
}
@@ -306,15 +306,15 @@ func (pc *PeerConnection) onNegotiationNeeded() {
306306
// https://www.w3.org/TR/webrtc/#dfn-update-the-negotiation-needed-flag
307307
func (pc *PeerConnection) negotiationNeededOp() {
308308
// 4.7.3.2.1 If connection.[[IsClosed]] is true, abort these steps.
309-
if pc.isClosed.get() {
309+
if pc.isClosed.Load() {
310310
return
311311
}
312312

313313
// 4.7.3.2.2 If the length of connection.[[Operations]] is not 0,
314314
// then set connection.[[UpdateNegotiationNeededFlagOnEmptyChain]] to
315315
// true, and abort these steps.
316316
if !pc.ops.IsEmpty() {
317-
pc.updateNegotiationNeededFlagOnEmptyChain.set(true)
317+
pc.updateNegotiationNeededFlagOnEmptyChain.Store(true)
318318

319319
return
320320
}
@@ -328,18 +328,18 @@ func (pc *PeerConnection) negotiationNeededOp() {
328328
// clear the negotiation-needed flag by setting connection.[[NegotiationNeeded]]
329329
// to false, and abort these steps.
330330
if !pc.checkNegotiationNeeded() {
331-
pc.isNegotiationNeeded.set(false)
331+
pc.isNegotiationNeeded.Store(false)
332332

333333
return
334334
}
335335

336336
// 4.7.3.2.5 If connection.[[NegotiationNeeded]] is already true, abort these steps.
337-
if pc.isNegotiationNeeded.get() {
337+
if pc.isNegotiationNeeded.Load() {
338338
return
339339
}
340340

341341
// 4.7.3.2.6 Set connection.[[NegotiationNeeded]] to true.
342-
pc.isNegotiationNeeded.set(true)
342+
pc.isNegotiationNeeded.Store(true)
343343

344344
// 4.7.3.2.7 Fire an event named negotiationneeded at connection.
345345
if handler, ok := pc.onNegotiationNeededHandler.Load().(func()); ok && handler != nil {
@@ -513,7 +513,7 @@ func (pc *PeerConnection) onConnectionStateChange(cs PeerConnectionState) {
513513
// SetConfiguration updates the configuration of this PeerConnection object.
514514
func (pc *PeerConnection) SetConfiguration(configuration Configuration) error { //nolint:gocognit,cyclop
515515
// https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-setconfiguration (step #2)
516-
if pc.isClosed.get() {
516+
if pc.isClosed.Load() {
517517
return &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
518518
}
519519

@@ -623,7 +623,7 @@ func (pc *PeerConnection) CreateOffer(options *OfferOptions) (SessionDescription
623623
switch {
624624
case useIdentity:
625625
return SessionDescription{}, errIdentityProviderNotImplemented
626-
case pc.isClosed.get():
626+
case pc.isClosed.Load():
627627
return SessionDescription{}, &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
628628
}
629629

@@ -763,7 +763,7 @@ func (pc *PeerConnection) updateConnectionState(
763763
connectionState := PeerConnectionStateNew
764764
switch {
765765
// The RTCPeerConnection object's [[IsClosed]] slot is true.
766-
case pc.isClosed.get():
766+
case pc.isClosed.Load():
767767
connectionState = PeerConnectionStateClosed
768768

769769
// Any of the RTCIceTransports or RTCDtlsTransports are in a "failed" state.
@@ -844,7 +844,7 @@ func (pc *PeerConnection) CreateAnswer(*AnswerOptions) (SessionDescription, erro
844844
return SessionDescription{}, &rtcerr.InvalidStateError{Err: ErrNoRemoteDescription}
845845
case useIdentity:
846846
return SessionDescription{}, errIdentityProviderNotImplemented
847-
case pc.isClosed.get():
847+
case pc.isClosed.Load():
848848
return SessionDescription{}, &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
849849
case pc.signalingState.Get() != SignalingStateHaveRemoteOffer &&
850850
pc.signalingState.Get() != SignalingStateHaveLocalPranswer:
@@ -891,7 +891,7 @@ func (pc *PeerConnection) CreateAnswer(*AnswerOptions) (SessionDescription, erro
891891
//nolint:gocognit,cyclop
892892
func (pc *PeerConnection) setDescription(sd *SessionDescription, op stateChangeOp) error {
893893
switch {
894-
case pc.isClosed.get():
894+
case pc.isClosed.Load():
895895
return &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
896896
case NewSDPType(sd.Type.String()) == SDPTypeUnknown:
897897
return &rtcerr.TypeError{
@@ -995,7 +995,7 @@ func (pc *PeerConnection) setDescription(sd *SessionDescription, op stateChangeO
995995
if err == nil {
996996
pc.signalingState.Set(nextState)
997997
if pc.signalingState.Get() == SignalingStateStable {
998-
pc.isNegotiationNeeded.set(false)
998+
pc.isNegotiationNeeded.Store(false)
999999
pc.mu.Lock()
10001000
pc.onNegotiationNeeded()
10011001
pc.mu.Unlock()
@@ -1010,7 +1010,7 @@ func (pc *PeerConnection) setDescription(sd *SessionDescription, op stateChangeO
10101010
//
10111011
//nolint:cyclop
10121012
func (pc *PeerConnection) SetLocalDescription(desc SessionDescription) error {
1013-
if pc.isClosed.get() {
1013+
if pc.isClosed.Load() {
10141014
return &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
10151015
}
10161016

@@ -1081,7 +1081,7 @@ func (pc *PeerConnection) LocalDescription() *SessionDescription {
10811081
//
10821082
//nolint:gocognit,gocyclo,cyclop,maintidx
10831083
func (pc *PeerConnection) SetRemoteDescription(desc SessionDescription) error {
1084-
if pc.isClosed.get() {
1084+
if pc.isClosed.Load() {
10851085
return &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
10861086
}
10871087

@@ -1886,7 +1886,7 @@ func (pc *PeerConnection) undeclaredRTPMediaProcessor() { //nolint:cyclop
18861886
return
18871887
}
18881888

1889-
if pc.isClosed.get() {
1889+
if pc.isClosed.Load() {
18901890
if err = srtpReadStream.Close(); err != nil {
18911891
pc.log.Warnf("Failed to close RTP stream %v", err)
18921892
}
@@ -2076,7 +2076,7 @@ func (pc *PeerConnection) GetTransceivers() []*RTPTransceiver {
20762076
//
20772077
//nolint:cyclop
20782078
func (pc *PeerConnection) AddTrack(track TrackLocal) (*RTPSender, error) {
2079-
if pc.isClosed.get() {
2079+
if pc.isClosed.Load() {
20802080
return nil, &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
20812081
}
20822082

@@ -2118,7 +2118,7 @@ func (pc *PeerConnection) AddTrack(track TrackLocal) (*RTPSender, error) {
21182118

21192119
// RemoveTrack removes a Track from the PeerConnection.
21202120
func (pc *PeerConnection) RemoveTrack(sender *RTPSender) (err error) {
2121-
if pc.isClosed.get() {
2121+
if pc.isClosed.Load() {
21222122
return &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
21232123
}
21242124

@@ -2186,7 +2186,7 @@ func (pc *PeerConnection) AddTransceiverFromKind(
21862186
kind RTPCodecType,
21872187
init ...RTPTransceiverInit,
21882188
) (t *RTPTransceiver, err error) {
2189-
if pc.isClosed.get() {
2189+
if pc.isClosed.Load() {
21902190
return nil, &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
21912191
}
21922192

@@ -2231,7 +2231,7 @@ func (pc *PeerConnection) AddTransceiverFromTrack(
22312231
track TrackLocal,
22322232
init ...RTPTransceiverInit,
22332233
) (t *RTPTransceiver, err error) {
2234-
if pc.isClosed.get() {
2234+
if pc.isClosed.Load() {
22352235
return nil, &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
22362236
}
22372237

@@ -2259,7 +2259,7 @@ func (pc *PeerConnection) AddTransceiverFromTrack(
22592259
//nolint:cyclop
22602260
func (pc *PeerConnection) CreateDataChannel(label string, options *DataChannelInit) (*DataChannel, error) {
22612261
// https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api (Step #2)
2262-
if pc.isClosed.get() {
2262+
if pc.isClosed.Load() {
22632263
return nil, &rtcerr.InvalidStateError{Err: ErrConnectionClosed}
22642264
}
22652265

@@ -2380,7 +2380,7 @@ func (pc *PeerConnection) close(shouldGracefullyClose bool) error { //nolint:cyc
23802380
// some overlapping close cases when both normal and graceful close are used
23812381
// that should be idempotent, but be cautioned when writing new close behavior
23822382
// to preserve this property.
2383-
isAlreadyClosingOrClosed := pc.isClosed.swap(true)
2383+
isAlreadyClosingOrClosed := pc.isClosed.Swap(true)
23842384
isAlreadyGracefullyClosingOrClosed := pc.isGracefullyClosingOrClosed
23852385
if shouldGracefullyClose && !isAlreadyGracefullyClosingOrClosed {
23862386
pc.isGracefullyClosingOrClosed = true
@@ -2668,7 +2668,7 @@ func (pc *PeerConnection) startTransports(
26682668
}
26692669

26702670
pc.dtlsTransport.internalOnCloseHandler = func() {
2671-
if pc.isClosed.get() || pc.api.settingEngine.disableCloseByDTLS {
2671+
if pc.isClosed.Load() || pc.api.settingEngine.disableCloseByDTLS {
26722672
return
26732673
}
26742674

0 commit comments

Comments
 (0)