PERFORCE change 76312 for review
Peter Wemm
peter at FreeBSD.org
Sat Apr 30 19:40:07 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=76312
Change 76312 by peter at peter_daintree on 2005/05/01 02:40:00
IFC @76311
Affected files ...
.. //depot/projects/hammer/lib/libthr/Makefile#10 integrate
.. //depot/projects/hammer/lib/libthr/arch/i386/i386/pthread_md.c#4 integrate
.. //depot/projects/hammer/lib/libthr/arch/i386/include/pthread_md.h#3 integrate
.. //depot/projects/hammer/lib/libthr/support/Makefile.inc#1 branch
.. //depot/projects/hammer/lib/libthr/thread/thr_create.c#16 integrate
Differences ...
==== //depot/projects/hammer/lib/libthr/Makefile#10 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/lib/libthr/Makefile,v 1.11 2005/04/12 03:00:28 davidxu Exp $
+# $FreeBSD: src/lib/libthr/Makefile,v 1.12 2005/04/23 02:48:58 davidxu Exp $
#
# All library objects contain FreeBSD revision strings by default; they may be
# excluded as a space-saving measure. To produce a library that does
@@ -30,6 +30,7 @@
PRECIOUSLIB=
.include "${.CURDIR}/arch/${MACHINE_ARCH}/Makefile.inc"
+.include "${.CURDIR}/support/Makefile.inc"
.include "${.CURDIR}/sys/Makefile.inc"
.include "${.CURDIR}/thread/Makefile.inc"
==== //depot/projects/hammer/lib/libthr/arch/i386/i386/pthread_md.c#4 (text+ko) ====
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libthr/arch/i386/i386/pthread_md.c,v 1.3 2005/04/23 02:14:38 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/arch/i386/i386/pthread_md.c,v 1.5 2005/04/23 03:34:43 davidxu Exp $
*/
#include <sys/types.h>
@@ -35,18 +35,11 @@
#include "pthread_md.h"
-int _thr_using_setbase;
-
struct tcb *
_tcb_ctor(struct pthread *thread, int initial)
{
-#ifndef COMPAT_32BIT
- union descriptor ldt;
- void *base;
-#endif
struct tcb *tcb;
void *oldtls;
- int error;
if (initial)
__asm __volatile("movl %%gs:0, %0" : "=r" (oldtls));
@@ -54,51 +47,15 @@
oldtls = NULL;
tcb = _rtld_allocate_tls(oldtls, sizeof(struct tcb), 16);
- if (tcb) {
+ if (tcb)
tcb->tcb_thread = thread;
-#ifndef COMPAT_32BIT
- tcb->tcb_ldt = -1;
- switch (_thr_using_setbase) {
- case 1: /* use i386_set_gsbase() in _kcb_set */
- break;
- case 0: /* Untested, try the get/set_gsbase routines once */
- error = i386_get_gsbase(&base);
- if (error == 0) {
- _thr_using_setbase = 1;
- break;
- }
- /* fall through */
- case 2: /* Use the user_ldt code, we must have an old kernel */
- _thr_using_setbase = 2;
- ldt.sd.sd_hibase = (unsigned int)tcb >> 24;
- ldt.sd.sd_lobase = (unsigned int)tcb & 0xFFFFFF;
- ldt.sd.sd_hilimit = (sizeof(struct tcb) >> 16) & 0xF;
- ldt.sd.sd_lolimit = sizeof(struct tcb) & 0xFFFF;
- ldt.sd.sd_type = SDT_MEMRWA;
- ldt.sd.sd_dpl = SEL_UPL;
- ldt.sd.sd_p = 1;
- ldt.sd.sd_xx = 0;
- ldt.sd.sd_def32 = 1;
- ldt.sd.sd_gran = 0; /* no more than 1M */
- tcb->tcb_ldt = i386_set_ldt(LDT_AUTO_ALLOC, &ldt, 1);
- if (tcb->tcb_ldt < 0) {
- _rtld_free_tls(tcb, sizeof(struct tcb), 16);
- tcb = NULL;
- }
- break;
- }
-#endif
- }
return (tcb);
}
void
_tcb_dtor(struct tcb *tcb)
{
-#ifndef COMPAT_32BIT
- if (tcb->tcb_ldt >= 0)
- i386_set_ldt(tcb->tcb_ldt, NULL, 1);
-#endif
+
_rtld_free_tls(tcb, sizeof(struct tcb), 16);
}
==== //depot/projects/hammer/lib/libthr/arch/i386/include/pthread_md.h#3 (text+ko) ====
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libthr/arch/i386/include/pthread_md.h,v 1.2 2005/04/14 00:44:07 peter Exp $
+ * $FreeBSD: src/lib/libthr/arch/i386/include/pthread_md.h,v 1.4 2005/04/27 01:29:03 davidxu Exp $
*/
/*
@@ -49,7 +49,6 @@
struct tcb *tcb_self; /* required by rtld */
void *tcb_dtv; /* required by rtld */
struct pthread *tcb_thread;
- int tcb_ldt;
};
/*
@@ -87,19 +86,7 @@
static __inline void
_tcb_set(struct tcb *tcb)
{
-#ifndef COMPAT_32BIT
- int val;
-
- if (_thr_using_setbase == 1) {
- i386_set_gsbase(tcb);
- } else {
- val = (tcb->tcb_ldt << 3) | 7;
- __asm __volatile("movl %0, %%gs" : : "r" (val));
- }
-#else
- _amd64_set_gsbase(tcb);
-#endif
-
+ i386_set_gsbase(tcb);
}
/* Get the current kcb. */
==== //depot/projects/hammer/lib/libthr/thread/thr_create.c#16 (text+ko) ====
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/lib/libthr/thread/thr_create.c,v 1.21 2005/04/12 03:00:28 davidxu Exp $
+ * $FreeBSD: src/lib/libthr/thread/thr_create.c,v 1.22 2005/04/23 02:48:59 davidxu Exp $
*/
#include <errno.h>
@@ -53,9 +53,8 @@
_pthread_create(pthread_t * thread, const pthread_attr_t * attr,
void *(*start_routine) (void *), void *arg)
{
- ucontext_t uc;
- sigset_t sigmask, oldsigmask;
struct pthread *curthread, *new_thread;
+ struct thr_param param;
int ret = 0, locked;
_thr_check_init();
@@ -70,6 +69,8 @@
if ((new_thread = _thr_alloc(curthread)) == NULL)
return (EAGAIN);
+ memset(¶m, 0, sizeof(param));
+
if (attr == NULL || *attr == NULL)
/* Use the default thread attributes: */
new_thread->attr = _pthread_attr_default;
@@ -108,12 +109,6 @@
new_thread->arg = arg;
new_thread->cancelflags = PTHREAD_CANCEL_ENABLE |
PTHREAD_CANCEL_DEFERRED;
- getcontext(&uc);
- SIGFILLSET(uc.uc_sigmask);
- uc.uc_stack.ss_sp = new_thread->attr.stackaddr_attr;
- uc.uc_stack.ss_size = new_thread->attr.stacksize_attr;
- makecontext(&uc, (void (*)(void))thread_start, 1, new_thread);
-
/*
* Check if this thread is to inherit the scheduling
* attributes from its parent:
@@ -146,15 +141,7 @@
if (new_thread->attr.suspend == THR_CREATE_SUSPENDED)
new_thread->flags = THR_FLAGS_SUSPENDED;
new_thread->state = PS_RUNNING;
- /*
- * Thread created by thr_create() inherits currrent thread
- * sigmask, however, before new thread setup itself correctly,
- * it can not handle signal, so we should masks all signals here.
- */
- SIGFILLSET(sigmask);
- SIGDELSET(sigmask, SIGTRAP);
- __sys_sigprocmask(SIG_SETMASK, &sigmask, &oldsigmask);
- new_thread->sigmask = oldsigmask;
+
/* Add the new thread. */
_thr_link(curthread, new_thread);
/* Return thread pointer eariler so that new thread can use it. */
@@ -164,9 +151,19 @@
locked = 1;
} else
locked = 0;
+ param.start_func = (void (*)(void *)) thread_start;
+ param.arg = new_thread;
+ param.stack_base = new_thread->attr.stackaddr_attr;
+ param.stack_size = new_thread->attr.stacksize_attr;
+ param.tls_base = (char *)new_thread->tcb;
+ param.tls_size = sizeof(struct tcb);
+ param.child_tid = &new_thread->tid;
+ param.parent_tid = &new_thread->tid;
+ param.flags = 0;
+ if (new_thread->attr.flags & PTHREAD_SCOPE_SYSTEM)
+ param.flags |= THR_SYSTEM_SCOPE;
/* Schedule the new thread. */
- ret = thr_create(&uc, &new_thread->tid, 0);
- __sys_sigprocmask(SIG_SETMASK, &oldsigmask, NULL);
+ ret = thr_new(¶m, sizeof(param));
if (ret != 0) {
if (locked)
THR_THREAD_UNLOCK(curthread, new_thread);
@@ -219,11 +216,6 @@
static void
thread_start(struct pthread *curthread)
{
- _tcb_set(curthread->tcb);
-
- /* Thread was created with all signals blocked, unblock them. */
- __sys_sigprocmask(SIG_SETMASK, &curthread->sigmask, NULL);
-
if (curthread->flags & THR_FLAGS_NEED_SUSPEND)
_thr_suspend_check(curthread);
More information about the p4-projects
mailing list