]> Sergey Matveev's repositories - btrtrc.git/commitdiff
webtorrent: Synchronize access to PeerConnection.Close
authorMatt Joiner <anacrolix@gmail.com>
Sun, 3 May 2020 08:45:12 +0000 (18:45 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 3 May 2020 08:45:12 +0000 (18:45 +1000)
webtorrent/tracker_client.go
webtorrent/transport.go

index 5e56ca23c5ab18a871d5d54c498f6e96bd4e6dca..39a7e347b00e715f49c4b2986bf4cffb758efddb 100644 (file)
@@ -50,7 +50,7 @@ func (me *TrackerClient) peerIdBinary() string {
 // outboundOffer represents an outstanding offer.
 type outboundOffer struct {
        originalOffer  webrtc.SessionDescription
-       peerConnection wrappedPeerConnection
+       peerConnection *wrappedPeerConnection
        dataChannel    *webrtc.DataChannel
        infoHash       [20]byte
 }
index c0d03bc7b6ef3c89c1e15e6bc7dbf2f4e402f436..055b22b898de1703ed5c01253608b066d3bb2ddf 100644 (file)
@@ -26,29 +26,32 @@ var (
 
 type wrappedPeerConnection struct {
        *webrtc.PeerConnection
+       closeMu sync.Mutex
        pproffd.CloseWrapper
 }
 
-func (me wrappedPeerConnection) Close() error {
+func (me *wrappedPeerConnection) Close() error {
+       me.closeMu.Lock()
+       defer me.closeMu.Unlock()
        return me.CloseWrapper.Close()
 }
 
-func newPeerConnection() (wrappedPeerConnection, error) {
+func newPeerConnection() (*wrappedPeerConnection, error) {
        newPeerConnectionMu.Lock()
        defer newPeerConnectionMu.Unlock()
        pc, err := api.NewPeerConnection(config)
        if err != nil {
-               return wrappedPeerConnection{}, err
+               return nil, err
        }
-       return wrappedPeerConnection{
-               pc,
-               pproffd.NewCloseWrapper(pc),
+       return &wrappedPeerConnection{
+               PeerConnection: pc,
+               CloseWrapper:   pproffd.NewCloseWrapper(pc),
        }, nil
 }
 
 // newOffer creates a transport and returns a WebRTC offer to be announced
 func newOffer() (
-       peerConnection wrappedPeerConnection,
+       peerConnection *wrappedPeerConnection,
        dataChannel *webrtc.DataChannel,
        offer webrtc.SessionDescription,
        err error,
@@ -76,7 +79,7 @@ func newOffer() (
 }
 
 func initAnsweringPeerConnection(
-       peerConnection wrappedPeerConnection,
+       peerConnection *wrappedPeerConnection,
        offer webrtc.SessionDescription,
 ) (answer webrtc.SessionDescription, err error) {
        err = peerConnection.SetRemoteDescription(offer)
@@ -97,7 +100,7 @@ func initAnsweringPeerConnection(
 // newAnsweringPeerConnection creates a transport from a WebRTC offer and and returns a WebRTC answer to be
 // announced.
 func newAnsweringPeerConnection(offer webrtc.SessionDescription) (
-       peerConn wrappedPeerConnection, answer webrtc.SessionDescription, err error,
+       peerConn *wrappedPeerConnection, answer webrtc.SessionDescription, err error,
 ) {
        peerConn, err = newPeerConnection()
        if err != nil {
@@ -132,7 +135,7 @@ func (me ioCloserFunc) Close() error {
 
 func setDataChannelOnOpen(
        dc *webrtc.DataChannel,
-       pc wrappedPeerConnection,
+       pc *wrappedPeerConnection,
        onOpen func(closer datachannel.ReadWriteCloser),
 ) {
        dc.OnOpen(func() {
@@ -145,7 +148,7 @@ func setDataChannelOnOpen(
        })
 }
 
-func hookDataChannelCloser(dcrwc datachannel.ReadWriteCloser, pc wrappedPeerConnection) datachannel.ReadWriteCloser {
+func hookDataChannelCloser(dcrwc datachannel.ReadWriteCloser, pc *wrappedPeerConnection) datachannel.ReadWriteCloser {
        return struct {
                datachannelReadWriter
                io.Closer