Module Name:    src
Committed By:   joerg
Date:           Tue Apr 14 23:35:07 UTC 2020

Modified Files:
        src/lib/libpthread: pthread.c pthread_cond.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.167 -r1.168 src/lib/libpthread/pthread.c
cvs rdiff -u -r1.67 -r1.68 src/lib/libpthread/pthread_cond.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libpthread/pthread.c
diff -u src/lib/libpthread/pthread.c:1.167 src/lib/libpthread/pthread.c:1.168
--- src/lib/libpthread/pthread.c:1.167	Sun Feb 16 17:45:11 2020
+++ src/lib/libpthread/pthread.c	Tue Apr 14 23:35:07 2020
@@ -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__scrubthread(pthread
 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 @@ pthread__fork_callback(void)
 	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 @@ pthread_create(pthread_t *thread, const 
 		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 @@ pthread_create(pthread_t *thread, const 
 	else
 		return EINVAL;
 
+	pthread__started = 1;
+
 	/* Fetch misc. attributes from the attr structure. */
 	name = NULL;
 	if ((p = nattr.pta_private) != NULL)

Index: src/lib/libpthread/pthread_cond.c
diff -u src/lib/libpthread/pthread_cond.c:1.67 src/lib/libpthread/pthread_cond.c:1.68
--- src/lib/libpthread/pthread_cond.c:1.67	Wed Jan 29 15:07:46 2020
+++ src/lib/libpthread/pthread_cond.c	Tue Apr 14 23:35:07 2020
@@ -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 @@ __RCSID("$NetBSD: pthread_cond.c,v 1.67 
 
 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 @@ pthread_cond_timedwait(pthread_cond_t *c
 
 	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 @@ pthread_condattr_setpshared(pthread_cond
 	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;
-}

Reply via email to