tests/webrtc: fix racy test with a prenegotiated data channel
authorMatthew Waters <matthew@centricular.com>
Thu, 7 Mar 2019 13:37:39 +0000 (00:37 +1100)
committerMatthew Waters <matthew@centricular.com>
Thu, 30 May 2019 11:33:09 +0000 (21:33 +1000)
If both data channels become ready simultaneously, then the two integer
read-add-update cycles can execute concurrently and only ever increment
once instead of the required twice.  Use an atomic add instead.

ext/webrtc/webrtcdatachannel.h
tests/check/elements/webrtcbin.c

index 7698441..8523fb5 100644 (file)
@@ -75,8 +75,9 @@ struct _GstWebRTCDataChannelClass
 };
 
 void    gst_webrtc_data_channel_start_negotiation   (GstWebRTCDataChannel       *channel);
-void    gst_webrtc_data_channel_set_sctp_transport  (GstWebRTCDataChannel       *channel,
-                                                     GstWebRTCSCTPTransport     *sctp);
+G_GNUC_INTERNAL
+void    gst_webrtc_data_channel_link_to_sctp (GstWebRTCDataChannel              *channel,
+                                              GstWebRTCSCTPTransport            *sctp_transport);
 
 G_END_DECLS
 
index 15636ae..540be51 100644 (file)
@@ -1899,8 +1899,9 @@ _on_ready_state_notify (GObject * channel, GParamSpec * pspec,
   g_object_get (channel, "ready-state", &ready_state, NULL);
 
   if (ready_state == GST_WEBRTC_DATA_CHANNEL_STATE_OPEN) {
-    if (++(*n_ready) >= 2)
+    if (g_atomic_int_add (n_ready, 1) >= 1) {
       test_webrtc_signal_state (t, STATE_CUSTOM);
+    }
   }
 }