Source-Changes-HG archive

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

[src/trunk]: src/lib/libpthread Drop most of the logic associated with pthrea...



details:   https://anonhg.NetBSD.org/src/rev/448dbab9143e
branches:  trunk
changeset: 971138:448dbab9143e
user:      joerg <joerg%NetBSD.org@localhost>
date:      Tue Apr 14 23:35:07 2020 +0000

description:
Drop most of the logic associated with pthread__started.

The pthread_cond logic is a questionable optimisation at best and the
post-fork logic is plainly broken.

diffstat:

 lib/libpthread/pthread.c      |  47 +++--------------------------------------
 lib/libpthread/pthread_cond.c |  48 +-----------------------------------------
 2 files changed, 6 insertions(+), 89 deletions(-)

diffs (169 lines):

diff -r 7cd8d32c20d0 -r 448dbab9143e lib/libpthread/pthread.c
--- a/lib/libpthread/pthread.c  Tue Apr 14 22:42:18 2020 +0000
+++ b/lib/libpthread/pthread.c  Tue Apr 14 23:35:07 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pthread.c,v 1.167 2020/02/16 17:45:11 kamil Exp $      */
+/*     $NetBSD: pthread.c,v 1.168 2020/04/14 23:35:07 joerg Exp $      */
 
 /*-
  * Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008, 2020
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread.c,v 1.167 2020/02/16 17:45:11 kamil Exp $");
+__RCSID("$NetBSD: pthread.c,v 1.168 2020/04/14 23:35:07 joerg Exp $");
 
 #define        __EXPOSE_STACK  1
 
@@ -84,8 +84,6 @@
 static void    pthread__initmain(pthread_t *);
 static void    pthread__fork_callback(void);
 static void    pthread__reap(pthread_t);
-static void    pthread__child_callback(void);
-static void    pthread__start(void);
 
 void   pthread__init(void);
 
@@ -274,36 +272,6 @@
        self->pt_lid = _lwp_self();
 }
 
-static void
-pthread__child_callback(void)
-{
-
-       /*
-        * Clean up data structures that a forked child process might
-        * trip over. Note that if threads have been created (causing
-        * this handler to be registered) the standards say that the
-        * child will trigger undefined behavior if it makes any
-        * pthread_* calls (or any other calls that aren't
-        * async-signal-safe), so we don't really have to clean up
-        * much. Anything that permits some pthread_* calls to work is
-        * merely being polite.
-        */
-       pthread__started = 0;
-}
-
-static void
-pthread__start(void)
-{
-
-       /*
-        * Per-process timers are cleared by fork(); despite the
-        * various restrictions on fork() and threads, it's legal to
-        * fork() before creating any threads.
-        */
-       pthread_atfork(NULL, NULL, pthread__child_callback);
-}
-
-
 /* General-purpose thread data structure sanitization. */
 /* ARGSUSED */
 static void
@@ -424,15 +392,6 @@
                return __libc_thr_create_stub(thread, attr, startfunc, arg);
        }
 
-       /*
-        * It's okay to check this without a lock because there can
-        * only be one thread before it becomes true.
-        */
-       if (pthread__started == 0) {
-               pthread__start();
-               pthread__started = 1;
-       }
-
        if (attr == NULL)
                nattr = pthread_default_attr;
        else if (attr->pta_magic == PT_ATTR_MAGIC)
@@ -440,6 +399,8 @@
        else
                return EINVAL;
 
+       pthread__started = 1;
+
        /* Fetch misc. attributes from the attr structure. */
        name = NULL;
        if ((p = nattr.pta_private) != NULL)
diff -r 7cd8d32c20d0 -r 448dbab9143e lib/libpthread/pthread_cond.c
--- a/lib/libpthread/pthread_cond.c     Tue Apr 14 22:42:18 2020 +0000
+++ b/lib/libpthread/pthread_cond.c     Tue Apr 14 23:35:07 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pthread_cond.c,v 1.67 2020/01/29 15:07:46 kamil Exp $  */
+/*     $NetBSD: pthread_cond.c,v 1.68 2020/04/14 23:35:07 joerg Exp $  */
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_cond.c,v 1.67 2020/01/29 15:07:46 kamil Exp $");
+__RCSID("$NetBSD: pthread_cond.c,v 1.68 2020/04/14 23:35:07 joerg Exp $");
 
 #include <stdlib.h>
 #include <errno.h>
@@ -59,11 +59,6 @@
 
 int    _sys___nanosleep50(const struct timespec *, struct timespec *);
 
-extern int pthread__started;
-
-static int pthread_cond_wait_nothread(pthread_t, pthread_mutex_t *,
-    pthread_cond_t *, const struct timespec *);
-
 int    _pthread_cond_has_waiters_np(pthread_cond_t *);
 
 __weak_alias(pthread_cond_has_waiters_np,_pthread_cond_has_waiters_np)
@@ -149,10 +144,6 @@
 
        self = pthread__self();
 
-       /* Just hang out for a while if threads aren't running yet. */
-       if (__predict_false(pthread__started == 0)) {
-               return pthread_cond_wait_nothread(self, mutex, cond, abstime);
-       }
        if (__predict_false(self->pt_cancel)) {
                pthread__cancelled();
        }
@@ -431,38 +422,3 @@
        return EINVAL;
 }
 #endif
-
-/* Utility routine to hang out for a while if threads haven't started yet. */
-static int
-pthread_cond_wait_nothread(pthread_t self, pthread_mutex_t *mutex,
-    pthread_cond_t *cond, const struct timespec *abstime)
-{
-       struct timespec now, diff;
-       int retval;
-
-       if (abstime == NULL) {
-               diff.tv_sec = 99999999;
-               diff.tv_nsec = 0;
-       } else {
-               clockid_t clck = pthread_cond_getclock(cond);
-               clock_gettime(clck, &now);
-               if  (timespeccmp(abstime, &now, <))
-                       timespecclear(&diff);
-               else
-                       timespecsub(abstime, &now, &diff);
-       }
-
-       do {
-               pthread__testcancel(self);
-               pthread_mutex_unlock(mutex);
-               retval = _sys___nanosleep50(&diff, NULL);
-               pthread_mutex_lock(mutex);
-       } while (abstime == NULL && retval == 0);
-       pthread__testcancel(self);
-
-       if (retval == 0)
-               return ETIMEDOUT;
-       else
-               /* spurious wakeup */
-               return 0;
-}



Home | Main Index | Thread Index | Old Index