d3d11: Use WIN32 API directly for locking with RAII pattern
authorSeungha Yang <seungha@centricular.com>
Sun, 7 Aug 2022 14:24:04 +0000 (23:24 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Mon, 8 Aug 2022 20:13:51 +0000 (20:13 +0000)
Such abstraction is unnecessary for this library/plugin.
Use WIN32 API directly instead of GLib wrappers.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2848>

subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp
subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window_win32.cpp

index e17c222..49af140 100644 (file)
@@ -626,7 +626,7 @@ struct _GstD3D11ConverterPrivate
 
   GstVideoOrientationMethod video_direction;
 
-  GMutex prop_lock;
+  SRWLOCK prop_lock;
 
   /* properties */
   gint src_x;
@@ -762,7 +762,6 @@ gst_d3d11_converter_init (GstD3D11Converter * self)
 {
   self->priv = (GstD3D11ConverterPrivate *)
       gst_d3d11_converter_get_instance_private (self);
-  g_mutex_init (&self->priv->prop_lock);
 }
 
 static void
@@ -813,8 +812,6 @@ gst_d3d11_converter_finalize (GObject * object)
   g_free (priv->in_cll_str);
   g_free (priv->out_cll_str);
 
-  g_mutex_clear (&priv->prop_lock);
-
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -867,7 +864,7 @@ gst_d3d11_converter_set_property (GObject * object, guint prop_id,
   GstD3D11Converter *self = GST_D3D11_CONVERTER (object);
   GstD3D11ConverterPrivate *priv = self->priv;
 
-  g_mutex_lock (&priv->prop_lock);
+  GstD3D11SRWLockGuard (&priv->prop_lock);
   switch (prop_id) {
     case PROP_SRC_X:
       update_src_rect (self, &priv->src_x, value);
@@ -974,7 +971,6 @@ gst_d3d11_converter_set_property (GObject * object, guint prop_id,
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
-  g_mutex_unlock (&priv->prop_lock);
 }
 
 static void
@@ -984,7 +980,7 @@ gst_d3d11_converter_get_property (GObject * object, guint prop_id,
   GstD3D11Converter *self = GST_D3D11_CONVERTER (object);
   GstD3D11ConverterPrivate *priv = self->priv;
 
-  g_mutex_lock (&priv->prop_lock);
+  GstD3D11SRWLockGuard (&priv->prop_lock);
   switch (prop_id) {
     case PROP_SRC_X:
       g_value_set_int (value, priv->src_x);
@@ -1056,7 +1052,6 @@ gst_d3d11_converter_get_property (GObject * object, guint prop_id,
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
-  g_mutex_unlock (&priv->prop_lock);
 }
 
 static gboolean
@@ -3096,7 +3091,6 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
   UINT offsets = 0;
   UINT vertex_stride = sizeof (VertexData);
   ID3D11ShaderResourceView *clear_view[GST_VIDEO_MAX_PLANES] = { nullptr, };
-  gboolean ret = TRUE;
 
   priv = self->priv;
   cinfo = &priv->convert_info;
@@ -3107,11 +3101,9 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
   resource.As (&texture);
   texture->GetDesc (&desc);
 
-  g_mutex_lock (&priv->prop_lock);
   if (priv->update_dest_rect && !gst_d3d11_converter_update_dest_rect (self)) {
     GST_ERROR_OBJECT (self, "Failed to update dest rect");
-    ret = FALSE;
-    goto out;
+    return FALSE;
   }
 
   if (priv->update_src_rect ||
@@ -3125,8 +3117,7 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
 
     if (!gst_d3d11_converter_update_src_rect (self)) {
       GST_ERROR_OBJECT (self, "Cannot update src rect");
-      ret = FALSE;
-      goto out;
+      return FALSE;
     }
   }
 
@@ -3140,8 +3131,7 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
     if (!gst_d3d11_result (hr, self->device)) {
       GST_ERROR_OBJECT (self,
           "Couldn't map constant buffer, hr: 0x%x", (guint) hr);
-      ret = FALSE;
-      goto out;
+      return FALSE;
     }
 
     const_buffer = (PSConstBuffer *) map.pData;
@@ -3197,10 +3187,7 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
   context->PSSetShaderResources (0, 4, clear_view);
   context->OMSetRenderTargets (0, nullptr, nullptr);
 
-out:
-  g_mutex_unlock (&priv->prop_lock);
-
-  return ret;
+  return TRUE;
 }
 
 static gboolean
@@ -3652,7 +3639,7 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
     return FALSE;
   }
 
-  g_mutex_lock (&priv->prop_lock);
+  GstD3D11SRWLockGuard (&priv->prop_lock);
   gst_d3d11_converter_update_hdr10_meta (self);
 
   if (priv->blend && priv->blend_desc.RenderTarget[0].BlendEnable) {
@@ -3706,14 +3693,12 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
   if (use_processor) {
     if (!pov) {
       GST_ERROR_OBJECT (self, "POV is unavailable");
-      g_mutex_unlock (&priv->prop_lock);
       goto out;
     }
 
     if (!piv) {
       if (!gst_d3d11_converter_ensure_fallback_inbuf (self, in_buf, in_info)) {
         GST_ERROR_OBJECT (self, "Couldn't copy into fallback texture");
-        g_mutex_unlock (&priv->prop_lock);
         goto out;
       }
 
@@ -3723,7 +3708,6 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
       if (!gst_d3d11_converter_map_buffer (self,
               in_buf, in_info, (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) {
         GST_ERROR_OBJECT (self, "Couldn't map fallback buffer");
-        g_mutex_unlock (&priv->prop_lock);
         in_buf = nullptr;
         goto out;
       }
@@ -3733,7 +3717,6 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
           priv->video_device, priv->enumerator);
       if (!piv) {
         GST_ERROR_OBJECT (self, "Couldn't get POV from fallback buffer");
-        g_mutex_unlock (&priv->prop_lock);
         goto out;
       }
     }
@@ -3748,13 +3731,11 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
 
     if (priv->update_dest_rect && !gst_d3d11_converter_update_dest_rect (self)) {
       GST_ERROR_OBJECT (self, "Failed to update dest rect");
-      g_mutex_unlock (&priv->prop_lock);
       goto out;
     }
 
     if (priv->update_src_rect && !gst_d3d11_converter_update_src_rect (self)) {
       GST_ERROR_OBJECT (self, "Cannot update src rect");
-      g_mutex_unlock (&priv->prop_lock);
       goto out;
     }
 
@@ -3807,14 +3788,11 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
     GST_TRACE_OBJECT (self, "Converting using processor");
 
     hr = video_ctx->VideoProcessorBlt (proc, pov, 0, 1, &stream);
-    g_mutex_unlock (&priv->prop_lock);
 
-    ret = gst_d3d11_result (hr, self->device);;
+    ret = gst_d3d11_result (hr, self->device);
     goto out;
   }
 
-  g_mutex_unlock (&priv->prop_lock);
-
   if ((priv->supported_backend & GST_D3D11_CONVERTER_BACKEND_SHADER) == 0) {
     GST_ERROR_OBJECT (self, "Conversion is not supported");
     goto out;
index 41df918..b537f6d 100644 (file)
@@ -114,7 +114,7 @@ struct _GstD3D11DevicePrivate
   GArray *format_table;
 
   CRITICAL_SECTION extern_lock;
-  GMutex resource_lock;
+  SRWLOCK resource_lock;
 
   LARGE_INTEGER frequency;
 
@@ -411,7 +411,6 @@ gst_d3d11_device_init (GstD3D11Device * self)
       sizeof (GstD3D11Format), GST_D3D11_N_FORMATS);
 
   InitializeCriticalSection (&priv->extern_lock);
-  g_mutex_init (&priv->resource_lock);
 
   self->priv = priv;
 }
@@ -740,7 +739,6 @@ gst_d3d11_device_finalize (GObject * object)
 
   g_array_unref (priv->format_table);
   DeleteCriticalSection (&priv->extern_lock);
-  g_mutex_clear (&priv->resource_lock);
   g_free (priv->description);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -1253,7 +1251,7 @@ gst_d3d11_device_get_video_device_handle (GstD3D11Device * device)
   g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
 
   priv = device->priv;
-  g_mutex_lock (&priv->resource_lock);
+  GstD3D11SRWLockGuard lk (&priv->resource_lock);
   if (!priv->video_device) {
     HRESULT hr;
     ID3D11VideoDevice *video_device = NULL;
@@ -1262,7 +1260,6 @@ gst_d3d11_device_get_video_device_handle (GstD3D11Device * device)
     if (gst_d3d11_result (hr, device))
       priv->video_device = video_device;
   }
-  g_mutex_unlock (&priv->resource_lock);
 
   return priv->video_device;
 }
@@ -1287,7 +1284,7 @@ gst_d3d11_device_get_video_context_handle (GstD3D11Device * device)
   g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
 
   priv = device->priv;
-  g_mutex_lock (&priv->resource_lock);
+  GstD3D11SRWLockGuard lk (&priv->resource_lock);
   if (!priv->video_context) {
     HRESULT hr;
     ID3D11VideoContext *video_context = NULL;
@@ -1296,7 +1293,6 @@ gst_d3d11_device_get_video_context_handle (GstD3D11Device * device)
     if (gst_d3d11_result (hr, device))
       priv->video_context = video_context;
   }
-  g_mutex_unlock (&priv->resource_lock);
 
   return priv->video_context;
 }
index 62923e7..4604239 100644 (file)
@@ -85,7 +85,7 @@ struct _GstD3D11BaseConvert
   /* method previously selected and used for negotiation */
   GstVideoOrientationMethod active_method;
 
-  GMutex lock;
+  SRWLOCK lock;
 };
 
 /**
@@ -102,7 +102,6 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstD3D11BaseConvert, gst_d3d11_base_convert,
         "d3d11convert"));
 
 static void gst_d3d11_base_convert_dispose (GObject * object);
-static void gst_d3d11_base_convert_finalize (GObject * object);
 static GstCaps *gst_d3d11_base_convert_transform_caps (GstBaseTransform *
     trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
 static GstCaps *gst_d3d11_base_convert_fixate_caps (GstBaseTransform *
@@ -259,7 +258,6 @@ gst_d3d11_base_convert_class_init (GstD3D11BaseConvertClass * klass)
   GstCaps *caps;
 
   gobject_class->dispose = gst_d3d11_base_convert_dispose;
-  gobject_class->finalize = gst_d3d11_base_convert_finalize;
 
   caps = gst_d3d11_get_updated_template_caps (&sink_template_caps);
   gst_element_class_add_pad_template (element_class,
@@ -300,8 +298,6 @@ gst_d3d11_base_convert_init (GstD3D11BaseConvert * self)
   self->border_color = DEFAULT_BORDER_COLOR;
   self->gamma_mode = DEFAULT_GAMMA_MODE;
   self->primaries_mode = DEFAULT_PRIMARIES_MODE;
-
-  g_mutex_init (&self->lock);
 }
 
 static void
@@ -309,23 +305,11 @@ gst_d3d11_base_convert_dispose (GObject * object)
 {
   GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object);
 
-  g_mutex_lock (&self->lock);
   gst_clear_object (&self->converter);
-  g_mutex_unlock (&self->lock);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
-static void
-gst_d3d11_base_convert_finalize (GObject * object)
-{
-  GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object);
-
-  g_mutex_clear (&self->lock);
-
-  G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
 static GstCaps *
 gst_d3d11_base_convert_transform_caps (GstBaseTransform *
     trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter)
@@ -687,7 +671,7 @@ gst_d3d11_base_convert_fixate_size (GstBaseTransform * base,
    * assume that missing PAR on the sinkpad means 1/1 and
    * missing PAR on the srcpad means undefined
    */
-  g_mutex_lock (&self->lock);
+  GstD3D11SRWLockGuard lk (&self->lock);
   switch (self->selected_method) {
     case GST_VIDEO_ORIENTATION_90R:
     case GST_VIDEO_ORIENTATION_90L:
@@ -1140,7 +1124,6 @@ done:
     g_value_unset (&fpar);
   if (to_par == &tpar)
     g_value_unset (&tpar);
-  g_mutex_unlock (&self->lock);
 
   return othercaps;
 }
@@ -1465,7 +1448,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
   gint in_width, in_height, in_par_n, in_par_d;
   GstStructure *config;
 
-  g_mutex_lock (&self->lock);
+  GstD3D11SRWLockGuard lk (&self->lock);
   self->active_method = self->selected_method;
 
   if (self->active_method != GST_VIDEO_ORIENTATION_IDENTITY)
@@ -1473,7 +1456,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
 
   if (!need_flip && gst_caps_is_equal (incaps, outcaps)) {
     self->same_caps = TRUE;
-    g_mutex_unlock (&self->lock);
     return TRUE;
   } else {
     self->same_caps = FALSE;
@@ -1544,7 +1526,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
   /* if present, these must match */
   if (in_info->interlace_mode != out_info->interlace_mode) {
     GST_ERROR_OBJECT (self, "input and output formats do not match");
-    g_mutex_unlock (&self->lock);
     return FALSE;
   }
 
@@ -1553,7 +1534,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
       self->borders_h == 0 && !need_flip &&
       !gst_d3d11_base_convert_needs_color_convert (self, in_info, out_info)) {
     self->same_caps = TRUE;
-    g_mutex_unlock (&self->lock);
     return TRUE;
   }
 
@@ -1567,7 +1547,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
       config);
   if (!self->converter) {
     GST_ERROR_OBJECT (self, "Couldn't create converter");
-    g_mutex_unlock (&self->lock);
     return FALSE;
   }
 
@@ -1614,8 +1593,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
         self->border_color, nullptr);
   }
 
-  g_mutex_unlock (&self->lock);
-
   return TRUE;
 }
 
@@ -1923,11 +1900,10 @@ static void
 gst_d3d11_base_convert_set_border_color (GstD3D11BaseConvert * self,
     guint64 border_color)
 {
-  g_mutex_lock (&self->lock);
+  GstD3D11SRWLockGuard lk (&self->lock);
   self->border_color = border_color;
   if (self->converter)
     g_object_set (self->converter, "border-color", self->border_color, nullptr);
-  g_mutex_unlock (&self->lock);
 }
 
 static void
@@ -1939,7 +1915,7 @@ gst_d3d11_base_convert_set_orientation (GstD3D11BaseConvert * self,
     return;
   }
 
-  g_mutex_lock (&self->lock);
+  GstD3D11SRWLockGuard lk (&self->lock);
   if (from_tag)
     self->tag_method = method;
   else
@@ -1957,28 +1933,25 @@ gst_d3d11_base_convert_set_orientation (GstD3D11BaseConvert * self,
 
     gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self));
   }
-
-  g_mutex_unlock (&self->lock);
 }
 
 static void
 gst_d3d11_base_convert_set_gamma_mode (GstD3D11BaseConvert * self,
     GstVideoGammaMode mode)
 {
-  g_mutex_lock (&self->lock);
+  GstD3D11SRWLockGuard lk (&self->lock);
   if (self->gamma_mode != mode) {
     GST_DEBUG_OBJECT (self, "Gamma mode %d -> %d", self->gamma_mode, mode);
     self->gamma_mode = mode;
     gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self));
   }
-  g_mutex_unlock (&self->lock);
 }
 
 static void
 gst_d3d11_base_convert_set_primaries_mode (GstD3D11BaseConvert * self,
     GstVideoPrimariesMode mode)
 {
-  g_mutex_lock (&self->lock);
+  GstD3D11SRWLockGuard lk (&self->lock);
   if (self->primaries_mode != mode) {
     gboolean prev_enabled = TRUE;
     gboolean new_enabled = TRUE;
@@ -1997,7 +1970,6 @@ gst_d3d11_base_convert_set_primaries_mode (GstD3D11BaseConvert * self,
     if (prev_enabled != new_enabled)
       gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self));
   }
-  g_mutex_unlock (&self->lock);
 }
 
 /**
index eb74d19..2458dc4 100644 (file)
@@ -159,7 +159,7 @@ struct _GstD3D11Decoder
   GstVideoCodecState *output_state;
 
   /* Protect internal pool */
-  GMutex internal_pool_lock;
+  SRWLOCK internal_pool_lock;
 
   GstBufferPool *internal_pool;
   /* Internal pool params */
@@ -221,7 +221,6 @@ gst_d3d11_decoder_class_init (GstD3D11DecoderClass * klass)
 static void
 gst_d3d11_decoder_init (GstD3D11Decoder * self)
 {
-  g_mutex_init (&self->internal_pool_lock);
 }
 
 static void
@@ -292,12 +291,11 @@ gst_d3d11_decoder_get_property (GObject * object, guint prop_id,
 static void
 gst_d3d11_decoder_clear_resource (GstD3D11Decoder * self)
 {
-  g_mutex_lock (&self->internal_pool_lock);
+  GstD3D11SRWLockGuard lk (&self->internal_pool_lock);
   if (self->internal_pool) {
     gst_buffer_pool_set_active (self->internal_pool, FALSE);
     gst_clear_object (&self->internal_pool);
   }
-  g_mutex_unlock (&self->internal_pool_lock);
 
   GST_D3D11_CLEAR_COM (self->decoder_handle);
   GST_D3D11_CLEAR_COM (self->staging);
@@ -339,16 +337,14 @@ gst_d3d11_decoder_dispose (GObject * obj)
 static void
 gst_d3d11_decoder_finalize (GObject * obj)
 {
+#if HAVE_WINMM
   GstD3D11Decoder *self = GST_D3D11_DECODER (obj);
 
-#if HAVE_WINMM
   /* Restore clock precision */
   if (self->timer_resolution)
     timeEndPeriod (self->timer_resolution);
 #endif
 
-  g_mutex_clear (&self->internal_pool_lock);
-
   G_OBJECT_CLASS (parent_class)->finalize (obj);
 }
 
@@ -447,12 +443,11 @@ gst_d3d11_decoder_prepare_output_view_pool (GstD3D11Decoder * self)
   GstVideoInfo *info = &self->info;
   guint pool_size;
 
-  g_mutex_lock (&self->internal_pool_lock);
+  GstD3D11SRWLockGuard lk (&self->internal_pool_lock);
   if (self->internal_pool) {
     gst_buffer_pool_set_active (self->internal_pool, FALSE);
     gst_clear_object (&self->internal_pool);
   }
-  g_mutex_unlock (&self->internal_pool_lock);
 
   if (!self->use_array_of_texture) {
     alloc_flags = GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY;
@@ -516,9 +511,7 @@ gst_d3d11_decoder_prepare_output_view_pool (GstD3D11Decoder * self)
     goto error;
   }
 
-  g_mutex_lock (&self->internal_pool_lock);
   self->internal_pool = pool;
-  g_mutex_unlock (&self->internal_pool_lock);
 
   return TRUE;
 
@@ -1860,10 +1853,9 @@ gst_d3d11_decoder_set_flushing (GstD3D11Decoder * decoder,
 {
   g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE);
 
-  g_mutex_lock (&decoder->internal_pool_lock);
+  GstD3D11SRWLockGuard lk (&decoder->internal_pool_lock);
   if (decoder->internal_pool)
     gst_buffer_pool_set_flushing (decoder->internal_pool, flushing);
-  g_mutex_unlock (&decoder->internal_pool_lock);
 
   return TRUE;
 }
index 2cbd11a..5843778 100644 (file)
@@ -60,8 +60,8 @@ struct _GstD3D11WindowWin32
 {
   GstD3D11Window parent;
 
-  GMutex lock;
-  GCond cond;
+  SRWLOCK lock;
+  CONDITION_VARIABLE cond;
 
   GMainContext *main_context;
   GMainLoop *loop;
@@ -101,7 +101,6 @@ G_DEFINE_TYPE (GstD3D11WindowWin32, gst_d3d11_window_win32,
 
 static void gst_d3d11_window_win32_constructed (GObject * object);
 static void gst_d3d11_window_win32_dispose (GObject * object);
-static void gst_d3d11_window_win32_finalize (GObject * object);
 
 static void gst_d3d11_window_win32_show (GstD3D11Window * window);
 static void gst_d3d11_window_win32_update_swap_chain (GstD3D11Window * window);
@@ -140,7 +139,6 @@ gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass)
 
   gobject_class->constructed = gst_d3d11_window_win32_constructed;
   gobject_class->dispose = gst_d3d11_window_win32_dispose;
-  gobject_class->finalize = gst_d3d11_window_win32_finalize;
 
   window_class->show = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_show);
   window_class->update_swap_chain =
@@ -163,9 +161,6 @@ gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass)
 static void
 gst_d3d11_window_win32_init (GstD3D11WindowWin32 * self)
 {
-  g_mutex_init (&self->lock);
-  g_cond_init (&self->cond);
-
   self->main_context = g_main_context_new ();
 }
 
@@ -180,13 +175,13 @@ gst_d3d11_window_win32_constructed (GObject * object)
     goto done;
   }
 
-  g_mutex_lock (&self->lock);
+  AcquireSRWLockExclusive (&self->lock);
   self->loop = g_main_loop_new (self->main_context, FALSE);
   self->thread = g_thread_new ("GstD3D11WindowWin32",
       (GThreadFunc) gst_d3d11_window_win32_thread_func, self);
   while (!g_main_loop_is_running (self->loop))
-    g_cond_wait (&self->cond, &self->lock);
-  g_mutex_unlock (&self->lock);
+    SleepConditionVariableSRW (&self->cond, &self->lock, INFINITE, 0);
+  ReleaseSRWLockExclusive (&self->lock);
 
 done:
   G_OBJECT_CLASS (parent_class)->constructed (object);
@@ -299,17 +294,6 @@ gst_d3d11_window_win32_set_title (GstD3D11Window * window, const gchar * title)
   }
 }
 
-static void
-gst_d3d11_window_win32_finalize (GObject * object)
-{
-  GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (object);
-
-  g_mutex_clear (&self->lock);
-  g_cond_clear (&self->cond);
-
-  G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
 static gboolean
 running_cb (gpointer user_data)
 {
@@ -317,9 +301,9 @@ running_cb (gpointer user_data)
 
   GST_TRACE_OBJECT (self, "Main loop running now");
 
-  g_mutex_lock (&self->lock);
-  g_cond_signal (&self->cond);
-  g_mutex_unlock (&self->lock);
+  AcquireSRWLockExclusive (&self->lock);
+  WakeConditionVariable (&self->cond);
+  ReleaseSRWLockExclusive (&self->lock);
 
   return G_SOURCE_REMOVE;
 }
@@ -834,7 +818,7 @@ sub_class_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
       MoveWindow (self->internal_hwnd, 0, 0, LOWORD (lParam), HIWORD (lParam),
           FALSE);
     } else if (uMsg == WM_CLOSE || uMsg == WM_DESTROY) {
-      g_mutex_lock (&self->lock);
+      GstD3D11SRWLockGuard lk (&self->lock);
       GST_WARNING_OBJECT (self, "external window is closing");
       gst_d3d11_window_win32_release_external_handle (self->external_hwnd);
       self->external_hwnd = NULL;
@@ -846,7 +830,6 @@ sub_class_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
       self->internal_hwnd_thread = NULL;
 
       self->overlay_state = GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_CLOSED;
-      g_mutex_unlock (&self->lock);
     } else {
       gst_d3d11_window_win32_handle_window_proc (self, hWnd, uMsg, wParam,
           lParam);