This should simplify future changes.
* localtime.c (is_threaded): New static function.
(lock): Use it.
---
 localtime.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/localtime.c b/localtime.c
index a00cf743..1191f810 100644
--- a/localtime.c
+++ b/localtime.c
@@ -89,6 +89,24 @@ extern int __isthreaded;
 #  endif
 # endif
 
+/* True if the current process might be multi-threaded,
+   false if it is definitely single-threaded.
+   If false, it will be false the next time it is called
+   unless the caller creates a thread in the meantime.
+   If true, it might become false the next time it is called
+   if all other threads exit in the meantime.  */
+static bool
+is_threaded(void)
+{
+# if THREAD_PREFER_SINGLE && HAVE___ISTHREADED
+  return !!__isthreaded;
+# elif THREAD_PREFER_SINGLE && HAVE_SYS_SINGLE_THREADED_H
+  return !__libc_single_threaded;
+# else
+  return true;
+# endif
+}
+
 # if THREAD_RWLOCK
 static pthread_rwlock_t locallock = PTHREAD_RWLOCK_INITIALIZER;
 static int dolock(void) { return pthread_rwlock_rdlock(&locallock); }
@@ -103,13 +121,8 @@ static void dounlock(void) { 
pthread_mutex_unlock(&locallock); }
 static int
 lock(void)
 {
-# if THREAD_PREFER_SINGLE && HAVE___ISTHREADED
-  if (!__isthreaded)
+  if (!is_threaded())
     return -1;
-# elif THREAD_PREFER_SINGLE && HAVE_SYS_SINGLE_THREADED_H
-  if (__libc_single_threaded)
-    return -1;
-# endif
   return dolock();
 }
 static void
-- 
2.48.1

Reply via email to