bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

thread: fix pth port


From: Bruno Haible
Subject: thread: fix pth port
Date: Thu, 05 Jan 2017 11:10:02 +0100
User-agent: KMail/4.8.5 (Linux/3.8.0-44-generic; KDE/4.8.5; x86_64; ; )

When a gnulib testdir is configured with
  --enable-threads=pth --with-libpth-prefix=...
the test test-thread_create crashes. The reason is that most Pth functions
crash (and pth_self() returns the value NULL) if pth_init() has not been
called.

This patch fixes the gnulib 'thread' module accordingly.


2017-01-05  Bruno Haible  <address@hidden>

        thread: Fix pth port.
        * lib/glthread/thread.h (pth_init): Declare weak.
        (glthread_create, glthread_sigmask, glthread_join, gl_thread_self,
        gl_thread_exit): Make sure Pth is initialized before invoking any Pth
        function.

diff --git a/lib/glthread/thread.h b/lib/glthread/thread.h
index 03e8f57..72bdd9b 100644
--- a/lib/glthread/thread.h
+++ b/lib/glthread/thread.h
@@ -219,6 +219,7 @@ extern "C" {
 
 /* Use weak references to the GNU Pth threads library.  */
 
+#  pragma weak pth_init
 #  pragma weak pth_spawn
 #  pragma weak pth_sigmask
 #  pragma weak pth_join
@@ -237,17 +238,17 @@ extern "C" {
 
 typedef pth_t gl_thread_t;
 # define glthread_create(THREADP, FUNC, ARG) \
-    (pth_in_use () ? ((*(THREADP) = pth_spawn (NULL, FUNC, ARG)) ? 0 : errno) 
: 0)
+    (pth_in_use () ? (pth_init (), ((*(THREADP) = pth_spawn (NULL, FUNC, ARG)) 
? 0 : errno)) : 0)
 # define glthread_sigmask(HOW, SET, OSET) \
-    (pth_in_use () && !pth_sigmask (HOW, SET, OSET) ? errno : 0)
+    (pth_in_use () ? (pth_init (), (pth_sigmask (HOW, SET, OSET) ? 0 : errno)) 
: 0)
 # define glthread_join(THREAD, RETVALP) \
-    (pth_in_use () && !pth_join (THREAD, RETVALP) ? errno : 0)
+    (pth_in_use () ? (pth_init (), (pth_join (THREAD, RETVALP) ? 0 : errno)) : 
0)
 # define gl_thread_self() \
-    (pth_in_use () ? (void *) pth_self () : NULL)
+    (pth_in_use () ? (pth_init (), (void *) pth_self ()) : NULL)
 # define gl_thread_self_pointer() \
     gl_thread_self ()
 # define gl_thread_exit(RETVAL) \
-    (pth_in_use () ? pth_exit (RETVAL) : 0)
+    (pth_in_use () ? (pth_init (), pth_exit (RETVAL)) : 0)
 # define glthread_atfork(PREPARE_FUNC, PARENT_FUNC, CHILD_FUNC) 0
 
 # ifdef __cplusplus




reply via email to

[Prev in Thread] Current Thread [Next in Thread]