PERFORCE change 69098 for review
David Xu
davidxu at FreeBSD.org
Sat Jan 15 17:11:11 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=69098
Change 69098 by davidxu at davidxu_tiger on 2005/01/16 01:11:08
Finally get rid of signal wrapper.
Affected files ...
.. //depot/projects/davidxu_thread/src/lib/libthread/Makefile#10 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/Makefile.inc#6 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_attr.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_autoinit.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_clean.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_concurrency.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_condattr.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_equal.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_fork.c#9 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_getprio.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_getschedparam.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_init.c#9 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_kern.c#13 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_kill.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_main_np.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_multi_np.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutex_prioceiling.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutex_protocol.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutexattr.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_once.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_private.h#18 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_pspinlock.c#8 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_resume_np.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_rtld.c#5 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_rwlockattr.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_self.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sem.c#10 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_seterrno.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_setprio.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_setschedparam.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sig.c#6 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_single_np.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_spec.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_spinlock.c#8 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_stack.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_suspend_np.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_switch_np.c#3 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_symbols.c#4 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_syscalls.c#5 edit
.. //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_yield.c#4 edit
Differences ...
==== //depot/projects/davidxu_thread/src/lib/libthread/Makefile#10 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/Makefile.inc#6 (text+ko) ====
@@ -35,7 +35,6 @@
thr_printf.c \
thr_pspinlock.c \
thr_resume_np.c \
- thr_rtld.c \
thr_rwlock.c \
thr_rwlockattr.c \
thr_self.c \
@@ -44,7 +43,6 @@
thr_setprio.c \
thr_setschedparam.c \
thr_sig.c \
- thr_sigmask.c \
thr_single_np.c \
thr_spec.c \
thr_spinlock.c \
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_attr.c#3 (text+ko) ====
@@ -1,4 +1,68 @@
/*
+ * Copyright (c) 2003 Craig Rodrigues <rodrigc at attbi.com>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Craig Rodrigues.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CRAIG RODRIGUES AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/*
+ * Copyright (c) 1998 Daniel Eischen <eischen at vigrid.com>.
+ * Copyright (C) 2001 Jason Evans <jasone at freebsd.org>.
+ * Copyright (c) 2002,2003 Alexey Zelkin <phantom at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice(s), this list of conditions and the following disclaimer
+ * unmodified other than the allowable addition of one or more
+ * copyright notices.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice(s), this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
* Copyright (c) 1996 John Birrell <jb at cimlogic.com.au>.
* All rights reserved.
*
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_autoinit.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_clean.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_concurrency.c#4 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_condattr.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_equal.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_fork.c#9 (text+ko) ====
@@ -1,4 +1,33 @@
/*
+ * Copyright (c) 2005 David Xu <davidxu at freebsd.org>
+ * Copyright (c) 2003 Daniel Eischen <deischen at freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/lib/libpthread/thread/thr_atfork.c,v 1.1 2003/11/05 03:42:10 davidxu Exp $
+ */
+
+/*
* Copyright (c) 1995-1998 John Birrell <jb at cimlogic.com.au>
* All rights reserved.
*
@@ -38,7 +67,6 @@
#include <fcntl.h>
#include <pthread.h>
#include <spinlock.h>
-#include <sys/signalvar.h>
#include "libc_private.h"
#include "thr_private.h"
@@ -80,7 +108,6 @@
{
static long inprogress, waiters;
- sigset_t sigset, oldset;
struct pthread *curthread;
struct pthread_atfork *af;
pid_t ret;
@@ -93,12 +120,10 @@
curthread = _get_curthread();
/*
- * Masks all signals until we reach a safe point.
+ * Block all signals until we reach a safe point.
*/
- SIGFILLSET(sigset);
- __sys_sigprocmask(SIG_SETMASK, &sigset, &oldset);
+ _thr_signal_block(curthread);
- /* We allow new hook to be added when executing hooks. */
THR_UMTX_LOCK(curthread, &_thr_atfork_lock);
tmp = inprogress;
while (tmp) {
@@ -110,6 +135,8 @@
tmp = inprogress;
}
inprogress = 1;
+
+ /* Unlock mutex, allow new hook to be added during executing hooks. */
THR_UMTX_UNLOCK(curthread, &_thr_atfork_lock);
/* Run down atfork prepare handlers. */
@@ -135,8 +162,12 @@
/* Child process */
errsave = errno;
inprogress = 0;
-
curthread->cancelflags &= ~THR_CANCEL_NEEDED;
+ /*
+ * Thread list will be reinitialized, and later we call
+ * _libpthread_init(), it will add us back to list.
+ */
+ curthread->tlflags &= ~(TLFLAGS_IN_TDLIST | TLFLAGS_DETACHED);
thr_self(&curthread->tid);
@@ -149,11 +180,11 @@
_thr_spinlock_init();
_mutex_fork(curthread);
- /* reinit library. */
+ /* reinitalize library. */
_libpthread_init(curthread);
- /* Restore signal mask. */
- __sys_sigprocmask(SIG_SETMASK, &oldset, NULL);
+ /* Ready to continue, unblock signals. */
+ _thr_signal_unblock(curthread);
/* Run down atfork child handlers. */
TAILQ_FOREACH(af, &_thr_atfork_list, qe) {
@@ -167,8 +198,8 @@
if (unlock_malloc)
_spinunlock(__malloc_lock);
- /* Restore signal mask. */
- __sys_sigprocmask(SIG_SETMASK, &oldset, NULL);
+ /* Ready to continue, unblock signals. */
+ _thr_signal_unblock(curthread);
/* Run down atfork parent handlers. */
TAILQ_FOREACH(af, &_thr_atfork_list, qe) {
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_getprio.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_getschedparam.c#4 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_init.c#9 (text+ko) ====
@@ -270,10 +270,8 @@
PANIC("Can't allocate initial thread");
init_main_thread(curthread);
}
-
/*
- * Add the thread to the thread list and to the KSEG's thread
- * queue.
+ * Add the thread to the thread list queue.
*/
THR_LIST_ADD(curthread);
_thread_active_threads = 1;
@@ -338,9 +336,6 @@
thread->cancelflags = PTHREAD_CANCEL_ENABLE | PTHREAD_CANCEL_DEFERRED;
thread->name = strdup("initial thread");
- /* Initialize the thread for signals: */
- SIGEMPTYSET(thread->sigmask);
-
/* Default the priority of the initial thread: */
thread->base_priority = THR_DEFAULT_PRIORITY;
thread->active_priority = THR_DEFAULT_PRIORITY;
@@ -350,14 +345,10 @@
TAILQ_INIT(&thread->mutexq);
TAILQ_INIT(&thread->pri_mutexq);
- /* Initialize hooks in the thread structure: */
- thread->specific = NULL;
- thread->cleanup = NULL;
- thread->flags = 0;
- thread->sigbackout = NULL;
-
thread->state = PS_RUNNING;
thread->uniqueid = 0;
+
+ /* Others cleared to zero by thr_alloc() */
}
static void
@@ -366,7 +357,9 @@
size_t len;
int mib[2];
- umtx_init(&_thread_signal_lock);
+ umtx_init(&_mutex_static_lock);
+ umtx_init(&_cond_static_lock);
+ umtx_init(&_rwlock_static_lock);
umtx_init(&_keytable_lock);
umtx_init(&_thr_atfork_lock);
_thr_spinlock_init();
@@ -388,15 +381,14 @@
_pthread_attr_default.guardsize_attr = _thr_guard_default;
TAILQ_INIT(&_thr_atfork_list);
- }
-
#ifdef SYSTEM_SCOPE_ONLY
- _thread_scope_system = 1;
+ _thread_scope_system = 1;
#else
- if (getenv("LIBPTHREAD_SYSTEM_SCOPE") != NULL)
- _thread_scope_system = 1;
- else if (getenv("LIBPTHREAD_PROCESS_SCOPE") != NULL)
- _thread_scope_system = -1;
+ if (getenv("LIBPTHREAD_SYSTEM_SCOPE") != NULL)
+ _thread_scope_system = 1;
+ else if (getenv("LIBPTHREAD_PROCESS_SCOPE") != NULL)
+ _thread_scope_system = -1;
#endif
+ }
init_once = 1;
}
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_kern.c#13 (text+ko) ====
@@ -28,8 +28,8 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
+#include <sys/types.h>
+#include <sys/signalvar.h>
#include <pthread.h>
#include "thr_private.h"
@@ -50,27 +50,41 @@
if (((threaded == 0) ^ (__isthreaded == 0)) == 0)
return (0);
+ __isthreaded = threaded;
+#if 0
if (threaded != 0) {
-/* _thr_rtld_init(); */
- __isthreaded = 1;
+ _thr_rtld_init();
} else {
- __isthreaded = 0;
-/* _thr_rtld_fini(); */
+ _thr_rtld_fini();
}
+#endif
return (0);
}
void
-_thr_critical_enter(struct pthread *thread)
+_thr_signal_block(struct pthread *curthread)
{
- thread->critical_count++;
+ sigset_t set;
+
+ if (curthread->sigblock > 0) {
+ curthread->sigblock++;
+ return;
+ }
+ SIGFILLSET(set);
+ SIGDELSET(set, SIGBUS);
+ SIGDELSET(set, SIGILL);
+ SIGDELSET(set, SIGFPE);
+ SIGDELSET(set, SIGSEGV);
+ SIGDELSET(set, SIGTRAP);
+ __sys_sigprocmask(SIG_BLOCK, &set, &curthread->sigmask);
+ curthread->sigblock++;
}
void
-_thr_critical_leave(struct pthread *thread)
+_thr_signal_unblock(struct pthread *curthread)
{
- thread->critical_count--;
- THR_CRITICAL_CHECK(thread);
+ if (--curthread->sigblock == 0)
+ __sys_sigprocmask(SIG_SETMASK, &curthread->sigmask, NULL);
}
void
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_kill.c#3 (text+ko) ====
@@ -55,8 +55,7 @@
*/
else if ((ret = _thr_ref_add(curthread, pthread, /*include dead*/0))
== 0) {
- if ((sig > 0) &&
- (_thread_sigact[sig - 1].sa_handler != SIG_IGN))
+ if (sig > 0)
thr_kill(pthread->tid, sig);
_thr_ref_delete(curthread, pthread);
}
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_main_np.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_multi_np.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutex_prioceiling.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutex_protocol.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_mutexattr.c#3 (text+ko) ====
@@ -31,6 +31,41 @@
*
* $FreeBSD$
*/
+
+/*
+ * Copyright (c) 1997 John Birrell <jb at cimlogic.com.au>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by John Birrell.
+ * 4. Neither the name of the author nor the names of any co-contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
#include <string.h>
#include <stdlib.h>
#include <errno.h>
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_once.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_private.h#18 (text+ko) ====
@@ -74,7 +74,7 @@
/*
* Kernel fatal error handler macro.
*/
-#define PANIC(string) _thr_exit(__FILE__,__LINE__,string)
+#define PANIC(string) _thread_exit(__FILE__,__LINE__,string)
/* Output debug messages like this: */
#define stdout_debug(args...) _thread_printf(STDOUT_FILENO, ##args)
@@ -159,14 +159,6 @@
#define PTHREAD_MUTEXATTR_STATIC_INITIALIZER \
{ PTHREAD_MUTEX_DEFAULT, PTHREAD_PRIO_NONE, 0, MUTEX_FLAGS_PRIVATE }
-/*
- * Condition variable definitions.
- */
-enum pthread_cond_type {
- COND_TYPE_FAST,
- COND_TYPE_MAX
-};
-
struct pthread_cond {
/*
* Lock for accesses to this structure.
@@ -179,16 +171,14 @@
};
struct pthread_cond_attr {
- enum pthread_cond_type c_type;
- long c_flags;
+ long c_flags;
};
struct pthread_barrier {
- pthread_mutex_t b_lock;
- pthread_cond_t b_cond;
+ struct umtx b_lock;
+ long b_cycle;
int b_count;
int b_waiters;
- int b_cycle;
};
struct pthread_barrierattr {
@@ -324,18 +314,6 @@
pthread_mutex_t mutex;
};
-/*
- * Define a continuation routine that can be used to perform a
- * transfer of control:
- */
-typedef void (*thread_continuation_t) (void *);
-
-struct join_status {
- struct pthread *thread;
- void *ret;
- int error;
-};
-
struct pthread_specific_elem {
const void *data;
int seqno;
@@ -366,8 +344,8 @@
*/
struct umtx lock;
- /* Thread exits in kernel, written by kernel. */
- long isdead;
+ /* Thread is terminated in kernel, written by kernel. */
+ long terminated;
/* Kernel thread id. */
long tid;
@@ -378,11 +356,8 @@
/* How many low level locks the thread held. */
int locklevel;
- /*
- * Set to non-zero when this thread has entered a critical
- * region. We allow for recursive entries into critical regions.
- */
- int critical_count;
+ /* Signal blocked counter. */
+ int sigblock;
/* Queue entry for list of all threads. */
TAILQ_ENTRY(pthread) tle; /* link for all threads in process */
@@ -424,16 +399,8 @@
/* Thread temporary signal mask. */
sigset_t sigmask;
- /* Used for tracking delivery of signal handlers. */
- sigset_t sigpend;
- siginfo_t siginfo[_SIG_MAXSIG];
- volatile int check_pending;
-
- /* backout routine must be invoke before handling signal. */
- thread_continuation_t sigbackout;
-
/* Thread state: */
- enum pthread_state state;
+ long state;
/*
* Error variable used instead of errno. The function __error()
@@ -446,7 +413,6 @@
* join status keeps track of a join operation to another thread.
*/
struct pthread *joiner;
- struct join_status join_status;
/*
* The current thread can belong to a priority mutex queue.
@@ -547,24 +513,6 @@
#define THR_UMTX_OWNED(thrd, lck) \
(umtx_owner((struct umtx *)lck) == (thrd)->tid)
-/*
- * Critical regions can also be detected by looking at the threads
- * current lock level. Ensure these macros increment and decrement
- * the lock levels such that locks can not be held with a lock level
- * of 0.
- */
-#define THR_IN_CRITICAL(thrd) \
- (((thrd)->locklevel > 0) || \
- ((thrd)->critical_count > 0))
-
-#define THR_CRITICAL_CHECK(thrd) \
-do { \
- if (!THR_IN_CRITICAL(thrd)) { \
- if ((thrd)->check_pending != 0) \
- _thr_sig_check_pending(thrd); \
- } \
-} while (0)
-
#define THR_LOCK_ACQUIRE(thrd, lck) \
do { \
(thrd)->locklevel++; \
@@ -576,7 +524,6 @@
if ((thrd)->locklevel > 0) { \
umtx_unlock((struct umtx *)(lck), (thrd)->tid); \
(thrd)->locklevel--; \
- THR_CRITICAL_CHECK(thrd); \
} else { \
_thr_assert_lock_level(); \
} \
@@ -587,8 +534,15 @@
#define THR_THREAD_LOCK(curthrd, thr) THR_LOCK_ACQUIRE(curthrd, &(thr)->lock)
#define THR_THREAD_UNLOCK(curthrd, thr) THR_LOCK_RELEASE(curthrd, &(thr)->lock)
-#define THREAD_LIST_LOCK(curthrd) THR_LOCK_ACQUIRE((curthrd), &_thread_list_lock)
-#define THREAD_LIST_UNLOCK(curthrd) THR_LOCK_RELEASE((curthrd), &_thread_list_lock)
+#define THREAD_LIST_LOCK(curthrd) \
+do { \
+ THR_LOCK_ACQUIRE((curthrd), &_thr_list_lock); \
+} while (0)
+
+#define THREAD_LIST_UNLOCK(curthrd) \
+do { \
+ THR_LOCK_RELEASE((curthrd), &_thr_list_lock); \
+} while (0)
/*
* Macros to insert/remove threads to the all thread list and
@@ -625,13 +579,6 @@
#define GC_NEEDED() (atomic_load_acq_int(&_gc_count) >= 5)
-#define THR_CRITICAL_ENTER(thr) (thr)->critical_count++
-#define THR_CRITICAL_LEAVE(thr) do { \
- (thr)->critical_count--; \
- THR_CRITICAL_CHECK(thr); \
- } \
-} while (0)
-
#define THR_IN_SYNCQ(thrd) (((thrd)->sflags & THR_FLAGS_IN_SYNCQ) != 0)
extern int __isthreaded;
@@ -673,7 +620,7 @@
/* Default condition variable attributes: */
SCLASS struct pthread_cond_attr _pthread_condattr_default
- SCLASS_PRESET({COND_TYPE_FAST, 0});
+ SCLASS_PRESET({PTHREAD_PROCESS_PRIVATE});
/* Array of signal actions for this process: */
SCLASS struct sigaction _thread_sigact[_SIG_MAXSIG];
@@ -684,9 +631,11 @@
/* Garbage thread count. */
SCLASS int _gc_count SCLASS_PRESET(0);
+SCLASS struct umtx _mutex_static_lock;
+SCLASS struct umtx _cond_static_lock;
+SCLASS struct umtx _rwlock_static_lock;
SCLASS struct umtx _keytable_lock;
-SCLASS struct umtx _thread_list_lock;
-SCLASS struct umtx _thread_signal_lock;
+SCLASS struct umtx _thr_list_lock;
/* Undefine the storage class and preset specifiers: */
#undef SCLASS
@@ -696,8 +645,6 @@
* Function prototype definitions.
*/
__BEGIN_DECLS
-void _thr_list_init();
-void _thr_single_thread(struct pthread *);
int _thr_setthreaded(int);
int _mutex_cv_lock(pthread_mutex_t *);
int _mutex_cv_unlock(pthread_mutex_t *);
@@ -727,7 +674,7 @@
void _pthread_cleanup_push(void (*routine) (void *), void *routine_arg);
void _pthread_cleanup_pop(int execute);
struct pthread *_thr_alloc(struct pthread *);
-void _thr_exit(char *, int, char *) __dead2;
+void _thread_exit(char *, int, char *) __dead2;
void _thr_exit_cleanup(void);
int _thr_ref_add(struct pthread *, struct pthread *, int);
void _thr_ref_delete(struct pthread *, struct pthread *);
@@ -741,16 +688,14 @@
void _thread_cleanupspecific(void);
void _thread_dump_info(void);
void _thread_printf(int, const char *, ...);
-void _thr_sig_handler(int, siginfo_t *, ucontext_t *);
-void _thr_sig_check_pending(struct pthread *);
-void _thr_sig_rundown(struct pthread *);
void _thr_spinlock_init(void);
int _thr_cancel_enter(struct pthread *);
void _thr_cancel_leave(struct pthread *, int);
-void _thr_critical_enter(struct pthread *);
-void _thr_critical_leave(struct pthread *);
+void _thr_signal_block(struct pthread *);
+void _thr_signal_unblock(struct pthread *);
void _thr_signal_init(void);
void _thr_signal_deinit(void);
+void _thr_list_init();
void _thr_hash_add(struct pthread *);
void _thr_hash_remove(struct pthread *);
struct pthread *_thr_hash_find(struct pthread *);
@@ -855,8 +800,6 @@
int __sys_msync(void *, size_t, int);
#endif
-__END_DECLS
-
static inline int
_thr_isthreaded(void)
{
@@ -876,4 +819,6 @@
_libpthread_init(0);
}
+__END_DECLS
+
#endif /* !_THR_PRIVATE_H */
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_pspinlock.c#8 (text+ko) ====
@@ -31,7 +31,7 @@
#include <pthread.h>
#include "thr_private.h"
-#define SPIN_COUNT 10000
+#define SPIN_COUNT 100000
__weak_reference(_pthread_spin_init, pthread_spin_init);
__weak_reference(_pthread_spin_destroy, pthread_spin_destroy);
@@ -100,15 +100,18 @@
else {
count = SPIN_COUNT;
while ((ret = umtx_trylock(&lck->s_lock, self->tid)) != 0) {
+ while (*(volatile long *)&lck->s_lock.u_owner) {
#ifdef __i386__
- /* tell cpu we are spinning */
- __asm __volatile("pause");
+ /* tell cpu we are spinning */
+ __asm __volatile("pause");
#endif
- if (--count <= 0) {
- count = SPIN_COUNT;
- _pthread_yield();
+ if (--count <= 0) {
+ count = SPIN_COUNT;
+ _pthread_yield();
+ }
}
}
+ ret = 0;
}
return (ret);
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_resume_np.c#4 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_rtld.c#5 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_rwlockattr.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_self.c#4 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sem.c#10 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_seterrno.c#4 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_setprio.c#3 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_setschedparam.c#4 (text+ko) ====
==== //depot/projects/davidxu_thread/src/lib/libthread/thread/thr_sig.c#6 (text+ko) ====
@@ -1,6 +1,5 @@
/*
* Copyright (c) 1995-1998 John Birrell <jb at cimlogic.com.au>
- * Copyright (c) 2005 David Xu <davidxu at freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,8 +29,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libpthread/thread/thr_sig.c,v 1.82 2004/11/01 10:49:34 davidxu Exp $
+ * $FreeBSD$
*/
+
#include <sys/param.h>
#include <sys/types.h>
#include <sys/signalvar.h>
@@ -50,228 +50,195 @@
#define DBG_MSG(x...)
#endif
-typedef void (*ohandler)(int sig, int code,
- struct sigcontext *scp, char *addr, __sighandler_t *catcher);
-static void thr_cancel_handler(struct pthread *);
-
-void
-_thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp)
+static void
+sigcancel_handler(int sig, siginfo_t *info, ucontext_t *ucp)
{
- __siginfohandler_t *sigfunc;
- struct pthread *curthread;
- struct sigaction act;
- int sa_flags, err_save;
-
- err_save = errno;
-
- DBG_MSG(">>> _thr_sig_handler(%d)\n", sig);
-
- curthread = _get_curthread();
- if (curthread == NULL)
- PANIC("No current thread.\n");
- if (curthread->state == PS_DEAD) {
- errno = err_save;
- return;
- }
-
- /*
- * If thread is in critical region or if thread is on
- * the way of state transition, then latch signal into buffer.
- */
- if (THR_IN_CRITICAL(curthread)) {
- DBG_MSG(">>> _thr_sig_handler(%d) in critical\n", sig);
- curthread->siginfo[sig-1] = *info;
- curthread->check_pending = 1;
- SIGADDSET(curthread->sigpend, sig);
- errno = err_save;
- return;
- }
-
- /* Check the threads previous state: */
- curthread->critical_count++;
- if (curthread->sigbackout != NULL)
- curthread->sigbackout((void *)curthread);
- curthread->critical_count--;
-
- if (sig == SIGCANCEL)
- thr_cancel_handler(curthread);
-
- THR_ASSERT(!(curthread->sigbackout), "sigbackout was not cleared.");
-
- /* Reset signal handler if needed */
- THR_LOCK_ACQUIRE(curthread, &_thread_signal_lock);
- sigfunc = _thread_sigact[sig - 1].sa_sigaction;
- sa_flags = _thread_sigact[sig - 1].sa_flags;
- if (sa_flags & SA_RESETHAND) {
- act.sa_handler = SIG_DFL;
- act.sa_flags = SA_RESTART;
- SIGEMPTYSET(act.sa_mask);
- __sys_sigaction(sig, &act, NULL);
- __sys_sigaction(sig, NULL, &_thread_sigact[sig - 1]);
- }
- THR_LOCK_RELEASE(curthread, &_thread_signal_lock);
-
- /* Now invoke real handler */
- if (((__sighandler_t *)sigfunc != SIG_DFL) &&
- ((__sighandler_t *)sigfunc != SIG_IGN) &&
- (sigfunc != (__siginfohandler_t *)_thr_sig_handler)) {
- if ((sa_flags & SA_SIGINFO) != 0 || info == NULL)
- (*(sigfunc))(sig, info, ucp);
- else {
- ((ohandler)(*sigfunc))(
- sig, info->si_code, (struct sigcontext *)ucp,
- info->si_addr, (__sighandler_t *)sigfunc);
- }
- } else if (sig != SIGCANCEL && (__sighandler_t *)sigfunc == SIG_DFL) {
- thr_kill(curthread->tid, sig);
- }
-
- SIGDELSET(ucp->uc_sigmask, SIGCANCEL);
+ struct pthread *curthread = _get_curthread();
- DBG_MSG("<<< _thr_sig_handler(%d)\n", sig);
-
- errno = err_save;
-}
-
-/*
- * This is called by a thread when it has pending signals to deliver.
- * It should only be called from the context of the thread.
- */
-void
-_thr_sig_rundown(struct pthread *curthread)
-{
- int i, err_save;
- sigset_t sigmask, oldmask;
-
- err_save = errno;
-
- DBG_MSG(">>> thr_sig_rundown (%p)\n", curthread);
-
- SIGFILLSET(sigmask);
- /* repost signal to kernel */
- if (!SIGISEMPTY(curthread->sigpend)) {
- __sys_sigprocmask(SIG_SETMASK, &sigmask, &oldmask);
- for (i = 1; i <= _SIG_MAXSIG; ++i) {
- if (SIGISMEMBER(curthread->sigpend, i)) {
- SIGDELSET(curthread->sigpend, i);
- if (!_thr_isthreaded())
- kill(getpid(), i);
- else
- thr_kill(curthread->tid, i);
- }
- }
- __sys_sigprocmask(SIG_SETMASK, &oldmask, NULL);
- }
- DBG_MSG("<<< thr_sig_rundown (%p)\n", curthread);
- errno = err_save;
-}
-
-/*
- * This checks pending signals for the current thread.
- */
-void
-_thr_sig_check_pending(struct pthread *curthread)
-{
- int errsave;
-
- if (THR_IN_CRITICAL(curthread))
- return;
-
- errsave = errno;
- curthread->check_pending = 0;
- _thr_sig_rundown(curthread);
- errno = errsave;
-}
-
-static void
-thr_cancel_handler(struct pthread *curthread)
-{
if (curthread->cancelflags & THR_CANCEL_AT_POINT)
pthread_testcancel();
- _thr_suspend_check(curthread);
+ if (curthread->flags & THR_FLAGS_NEED_SUSPEND) {
+ __sys_sigprocmask(SIG_SETMASK, &ucp->uc_sigmask, NULL);
+ _thr_suspend_check(curthread);
+ }
}
-
void
_thr_suspend_check(struct pthread *curthread)
{
- sigset_t set;
long cycle;
/* Async suspend. */
+ _thr_signal_block(curthread);
THR_LOCK(curthread);
if ((curthread->flags & (THR_FLAGS_NEED_SUSPEND | THR_FLAGS_SUSPENDED))
== THR_FLAGS_NEED_SUSPEND) {
curthread->flags |= THR_FLAGS_SUSPENDED;
- SIGEMPTYSET(set);
- SIGADDSET(set, SIGCANCEL);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list