app: in GimpBacktrace Linux backend, don't leak backtrace when dropping threads

Should have been part of commit
a29d040db5.

(cherry picked from commit 01f9409902)
This commit is contained in:
Ell
2018-12-01 04:29:49 -05:00
parent 31acea2cf7
commit d86d017980

View File

@ -83,7 +83,6 @@ struct _GimpBacktrace
{ {
GimpBacktraceThread *threads; GimpBacktraceThread *threads;
gint n_threads; gint n_threads;
gint n_remaining_threads;
}; };
@ -113,6 +112,7 @@ static struct sigaction orig_action;
static pid_t blacklisted_threads[MAX_N_THREADS]; static pid_t blacklisted_threads[MAX_N_THREADS];
static gint n_blacklisted_threads; static gint n_blacklisted_threads;
static GimpBacktrace *handler_backtrace; static GimpBacktrace *handler_backtrace;
static gint handler_n_remaining_threads;
static gint handler_lock; static gint handler_lock;
#ifdef HAVE_LIBBACKTRACE #ifdef HAVE_LIBBACKTRACE
@ -282,7 +282,7 @@ gimp_backtrace_signal_handler (gint signum)
thread->n_frames = backtrace ((gpointer *) thread->frames, thread->n_frames = backtrace ((gpointer *) thread->frames,
MAX_N_FRAMES); MAX_N_FRAMES);
g_atomic_int_dec_and_test (&curr_backtrace->n_remaining_threads); g_atomic_int_dec_and_test (&handler_n_remaining_threads);
break; break;
} }
@ -414,11 +414,11 @@ gimp_backtrace_new (gboolean include_current_thread)
backtrace->threads = g_new (GimpBacktraceThread, n_threads); backtrace->threads = g_new (GimpBacktraceThread, n_threads);
backtrace->n_threads = n_threads; backtrace->n_threads = n_threads;
backtrace->n_remaining_threads = n_threads;
while (! g_atomic_int_compare_and_exchange (&handler_lock, 0, -1)); while (! g_atomic_int_compare_and_exchange (&handler_lock, 0, -1));
g_atomic_pointer_set (&handler_backtrace, backtrace); g_atomic_pointer_set (&handler_backtrace, backtrace);
g_atomic_int_set (&handler_n_remaining_threads, n_threads);
g_atomic_int_set (&handler_lock, 0); g_atomic_int_set (&handler_lock, 0);
@ -441,7 +441,7 @@ gimp_backtrace_new (gboolean include_current_thread)
start_time = g_get_monotonic_time (); start_time = g_get_monotonic_time ();
while (g_atomic_int_get (&backtrace->n_remaining_threads) > 0) while (g_atomic_int_get (&handler_n_remaining_threads) > 0)
{ {
gint64 time = g_get_monotonic_time (); gint64 time = g_get_monotonic_time ();
@ -458,7 +458,7 @@ gimp_backtrace_new (gboolean include_current_thread)
g_atomic_int_set (&handler_lock, 0); g_atomic_int_set (&handler_lock, 0);
#if 0 #if 0
if (backtrace->n_remaining_threads > 0) if (handler_n_remaining_threads > 0)
{ {
gint j = 0; gint j = 0;
@ -500,7 +500,7 @@ gimp_backtrace_new (gboolean include_current_thread)
void void
gimp_backtrace_free (GimpBacktrace *backtrace) gimp_backtrace_free (GimpBacktrace *backtrace)
{ {
if (! backtrace || backtrace->n_remaining_threads > 0) if (! backtrace)
return; return;
g_free (backtrace->threads); g_free (backtrace->threads);