gstcheck: Ensure unused threadpool threads are stopped
authorDoug Nazar <nazard@nazar.ca>
Thu, 6 May 2021 17:03:15 +0000 (13:03 -0400)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 12 May 2021 03:08:30 +0000 (03:08 +0000)
Ensures that all unused threads are exited before the atexit()
handlers run.

This prevents a race with any thread that used the OpenSSL library
between it's thread cleanup routine and it's atexit() cleanup routine
which can cause a SIGSEGV.

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

libs/gst/check/gstcheck.c
libs/gst/check/libcheck/check.c
libs/gst/check/libcheck/check_run.c
libs/gst/check/libcheck/meson.build

index 123f86e..68b4cd3 100644 (file)
@@ -1090,6 +1090,7 @@ gst_check_run_suite (Suite * suite, const gchar * name, const gchar * fname)
   g_timer_destroy (timer);
   g_free (xmlfilename);
   srunner_free (sr);
+  g_thread_pool_stop_unused_threads ();
   return nf;
 }
 
index 28eca52..8ef3b62 100644 (file)
@@ -26,6 +26,8 @@
 #include <stdarg.h>
 #include <math.h>
 
+#include <glib.h>
+
 #include "internal-check.h"
 #include "check_error.h"
 #include "check_list.h"
@@ -386,6 +388,7 @@ _ck_assert_failed (const char *file, int line, const char *expr, ...)
   send_failure_info (to_send);
 #if defined(HAVE_FORK) && HAVE_FORK==1
   if (cur_fork_status () == CK_FORK) {
+    g_thread_pool_stop_unused_threads ();
     _exit (1);
   }
 #endif /* HAVE_FORK */
index f686ca0..a97379c 100644 (file)
@@ -29,6 +29,8 @@
 #include <signal.h>
 #include <setjmp.h>
 
+#include <glib.h>
+
 #include "internal-check.h"
 #include "check_error.h"
 #include "check_list.h"
@@ -466,6 +468,7 @@ tcase_run_tfun_fork (SRunner * sr, TCase * tc, TF * tfun, int i)
     clock_gettime (check_get_clockid (), &ts_end);
     tcase_run_checked_teardown (tc);
     send_duration_info (DIFF_IN_USEC (ts_start, ts_end));
+    g_thread_pool_stop_unused_threads ();
     exit (EXIT_SUCCESS);
   } else {
     group_pid = pid;
@@ -784,9 +787,11 @@ check_waitpid_and_exit (pid_t pid CK_ATTRIBUTE_UNUSED)
     }
     while (pid_w == -1);
     if (waserror (status, 0)) {
+      g_thread_pool_stop_unused_threads ();
       exit (EXIT_FAILURE);
     }
   }
+  g_thread_pool_stop_unused_threads ();
   exit (EXIT_SUCCESS);
 #else /* HAVE_FORK */
   eprintf ("This version does not support fork", __FILE__, __LINE__);
index 9641653..c6d496d 100644 (file)
@@ -83,7 +83,7 @@ endforeach
 libcheck = static_library('check',
   libcheck_files,
   include_directories : [configinc, internal_check_h_inc],
-  dependencies : [rt_lib, mathlib],
+  dependencies : [rt_lib, mathlib, glib_dep],
   c_args: gst_c_args + libcheck_visibility_args + no_warn_args +
          # Don't want libcompat to think we don't have these and substitute
          # replacements since we don't check for or define these. See libcompat.h