mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 14:56:36 +00:00
gstcheck: Ensure unused threadpool threads are stopped
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>
This commit is contained in:
parent
d7272b3247
commit
9efd519c81
4 changed files with 10 additions and 1 deletions
|
@ -1090,6 +1090,7 @@ gst_check_run_suite (Suite * suite, const gchar * name, const gchar * fname)
|
||||||
g_timer_destroy (timer);
|
g_timer_destroy (timer);
|
||||||
g_free (xmlfilename);
|
g_free (xmlfilename);
|
||||||
srunner_free (sr);
|
srunner_free (sr);
|
||||||
|
g_thread_pool_stop_unused_threads ();
|
||||||
return nf;
|
return nf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include "internal-check.h"
|
#include "internal-check.h"
|
||||||
#include "check_error.h"
|
#include "check_error.h"
|
||||||
#include "check_list.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);
|
send_failure_info (to_send);
|
||||||
#if defined(HAVE_FORK) && HAVE_FORK==1
|
#if defined(HAVE_FORK) && HAVE_FORK==1
|
||||||
if (cur_fork_status () == CK_FORK) {
|
if (cur_fork_status () == CK_FORK) {
|
||||||
|
g_thread_pool_stop_unused_threads ();
|
||||||
_exit (1);
|
_exit (1);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_FORK */
|
#endif /* HAVE_FORK */
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include "internal-check.h"
|
#include "internal-check.h"
|
||||||
#include "check_error.h"
|
#include "check_error.h"
|
||||||
#include "check_list.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);
|
clock_gettime (check_get_clockid (), &ts_end);
|
||||||
tcase_run_checked_teardown (tc);
|
tcase_run_checked_teardown (tc);
|
||||||
send_duration_info (DIFF_IN_USEC (ts_start, ts_end));
|
send_duration_info (DIFF_IN_USEC (ts_start, ts_end));
|
||||||
|
g_thread_pool_stop_unused_threads ();
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
group_pid = pid;
|
group_pid = pid;
|
||||||
|
@ -784,9 +787,11 @@ check_waitpid_and_exit (pid_t pid CK_ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
while (pid_w == -1);
|
while (pid_w == -1);
|
||||||
if (waserror (status, 0)) {
|
if (waserror (status, 0)) {
|
||||||
|
g_thread_pool_stop_unused_threads ();
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
g_thread_pool_stop_unused_threads ();
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
#else /* HAVE_FORK */
|
#else /* HAVE_FORK */
|
||||||
eprintf ("This version does not support fork", __FILE__, __LINE__);
|
eprintf ("This version does not support fork", __FILE__, __LINE__);
|
||||||
|
|
|
@ -83,7 +83,7 @@ endforeach
|
||||||
libcheck = static_library('check',
|
libcheck = static_library('check',
|
||||||
libcheck_files,
|
libcheck_files,
|
||||||
include_directories : [configinc, internal_check_h_inc],
|
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 +
|
c_args: gst_c_args + libcheck_visibility_args + no_warn_args +
|
||||||
# Don't want libcompat to think we don't have these and substitute
|
# 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
|
# replacements since we don't check for or define these. See libcompat.h
|
||||||
|
|
Loading…
Reference in a new issue