Skip gst_deinit() if gstreamer was not initialized properly
authorTim-Philipp Müller <tim@centricular.com>
Sun, 24 Dec 2017 15:21:38 +0000 (16:21 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Sun, 24 Dec 2017 15:21:38 +0000 (16:21 +0100)
Can happen if an error occurs during option parsing, for example.

https://bugzilla.gnome.org/show_bug.cgi?id=781914

gst/gst.c
tests/check/Makefile.am
tests/check/gst/.gitignore
tests/check/gst/gstdeinit.c [new file with mode: 0644]
tests/check/meson.build

index fc4f253..b383f41 100644 (file)
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -1077,6 +1077,9 @@ gst_deinit (void)
   GstBinClass *bin_class;
   GstClock *clock;
 
+  if (!gst_initialized)
+    return;
+
   GST_INFO ("deinitializing GStreamer");
 
   if (gst_deinitialized) {
@@ -1084,7 +1087,7 @@ gst_deinit (void)
     return;
   }
   g_thread_pool_set_max_unused_threads (0);
-  bin_class = GST_BIN_CLASS (g_type_class_peek (gst_bin_get_type ()));
+  bin_class = (GstBinClass *) g_type_class_peek (gst_bin_get_type ());
   if (bin_class && bin_class->pool != NULL) {
     g_thread_pool_free (bin_class->pool, FALSE, TRUE);
     bin_class->pool = NULL;
index ece2521..9d78cc7 100644 (file)
@@ -121,6 +121,7 @@ check_PROGRAMS =                            \
        gst/gstcapsfeatures                     \
        $(CXX_CHECKS)                           \
        gst/gstdatetime                         \
+       gst/gstdeinit                           \
        gst/gstdevice                           \
        gst/gstinfo                             \
        gst/gstiterator                         \
index f3a5f85..4c86058 100644 (file)
@@ -14,8 +14,10 @@ gstclock
 gstcontroller
 gstcontext
 gstcpp
+gstcustombufferpool
 gstdata
 gstdatetime
+gstdeinit
 gstdevice
 gstelement
 gstelementfactory
diff --git a/tests/check/gst/gstdeinit.c b/tests/check/gst/gstdeinit.c
new file mode 100644 (file)
index 0000000..b551e85
--- /dev/null
@@ -0,0 +1,37 @@
+/* GStreamer
+ * Copyright (C) 2017 Tim-Philipp Müller <tim centricular com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+int
+main (int argc, char **argv)
+{
+  char *arr[] = { (char *) "gstdeinit", (char *) "--gst-debug" };
+  char **a = arr;
+  int n = 2;
+
+  /* This will fail because --gst-debug requires a parameter */
+  gst_init_check (&n, &a, NULL);
+
+  gst_deinit ();
+  return 0;
+}
index aadc5e9..f2d9861 100644 (file)
@@ -17,6 +17,7 @@ core_tests = [
   [ 'gst/gstcaps.c' ],
   [ 'gst/gstcapsfeatures.c' ],
   [ 'gst/gstdatetime.c' ],
+  [ 'gst/gstdeinit.c' ],
   [ 'gst/gstdevice.c' ],
   [ 'gst/gstelement.c', not have_registry ],
   [ 'gst/gstelementfactory.c', not have_registry ],