Commit 9d7a49f6 for quagga.net
commit 9d7a49f6090b6106ee9ecad4687167b2e60d98c3
Author: Paul Jakma <paul@jakma.org>
Date: Mon Feb 19 20:55:20 2018 +0000
lib: Fix assert in thread_add_unuse if thread_execute was used
* thread.c: (thread_call) thread_execute passes in a dummy thread, on its
stack, with a NULL thread master. Those shouldn't be added to the unuse
list or thread_add_unuse rightly asserts.
Fix this very dumb bug.
See https://bugzilla.quagga.net/show_bug.cgi?id=975
With thanks to Sergey Popov, admin@pinkbyte.ru, and Andreas Nilsson,
andrnils@resilans.se, for help with diagnosis and testing.
diff --git a/lib/thread.c b/lib/thread.c
index 55effaac..f7d1a5ff 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -1276,7 +1276,12 @@ struct thread *thread_current = NULL;
/* We check thread consumed time. If the system has getrusage, we'll
use that to get in-depth stats on the performance of the thread in addition
- to wall clock time stats from gettimeofday. */
+ to wall clock time stats from gettimeofday.
+
+ 'Dummy' threads (e.g. see funcname_thread_execute) must have
+ thread->master == NULL.
+ */
+
static void
thread_call (struct thread *thread)
{
@@ -1336,8 +1341,10 @@ thread_call (struct thread *thread)
realtime/1000, cputime/1000);
}
#endif /* CONSUMED_TIME_CHECK */
+
- thread_add_unuse (thread);
+ if (thread->master)
+ thread_add_unuse (thread);
}
/* Execute thread */