Date: Tue, 15 Feb 2005 05:02:39 GMT From: David Xu <davidxu@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 71093 for review Message-ID: <200502150502.j1F52d6L083593@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=71093 Change 71093 by davidxu@davidxu_alona on 2005/02/15 05:02:04 code cleanup. Affected files ... .. //depot/projects/davidxu_thread/src/lib/libthread/arch/alpha/alpha/pthread_md.c#4 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/alpha/include/pthread_md.h#4 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/amd64/include/atomic_ops.h#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/amd64/include/pthread_md.h#5 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/i386/i386/pthread_md.c#3 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/ia64/context.S#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/ia64/enter_uts.S#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/ia64/pthread_md.c#3 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/include/pthread_md.h#5 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/include/pthread_md.h#2 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/powerpc/assym.c#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/powerpc/assym.s#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/powerpc/context.S#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/powerpc/enter_uts.S#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/include/pthread_md.h#4 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/sparc64/assym.s#2 delete .. //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/sparc64/pthread_md.c#3 edit .. //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/sparc64/thr_getcontext.S#2 delete Differences ... ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/alpha/alpha/pthread_md.c#4 (text+ko) ==== @@ -28,7 +28,7 @@ __FBSDID("$FreeBSD: src/lib/libpthread/arch/alpha/alpha/pthread_md.c,v 1.2 2004/08/15 16:28:04 dfr Exp $"); #include <stdlib.h> -#include <strings.h> +#include <string.h> #include "pthread_md.h" /* @@ -40,6 +40,7 @@ struct tcb *tcb; if ((tcb = malloc(sizeof(struct tcb))) != NULL) { + memset(tcb, 0, sizeof(struct tcb)); tcb->tcb_thread = thread; } return (tcb); ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/alpha/include/pthread_md.h#4 (text+ko) ==== @@ -30,24 +30,35 @@ #define _PTHREAD_MD_H_ #include <stddef.h> +#include <sys/types.h> -#define DTV_OFFSET offsetof(struct tcb, tcb_tdv) +#define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv) struct pthread; struct tcb; struct tdv; /* We don't know what this is yet? */ +/* + * tp points to one of these. We define the static TLS as an array + * of long double to enforce 16-byte alignment of the TLS memory, + * struct alpha_tp, struct tcb and also struct kcb. Both static and + * dynamic allocation of any of these structures will result in a + * valid, well-aligned thread pointer. + */ +struct alpha_tp { + struct tdv *tp_tdv; /* dynamic TLS */ + uint64_t _reserved_; + long double tp_tls[0]; /* static TLS */ +}; + struct tcb { - struct tdv *tcb_tdv; /* dynamic TLS */ struct pthread *tcb_thread; + struct alpha_tp tcb_tp; }; #define _tp __builtin_thread_pointer() -#define _tcb ((struct tcb*)((char*)(_tp))) +#define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp))) -/* - * The constructors. - */ struct tcb *_tcb_ctor(struct pthread *, int); void _tcb_dtor(struct tcb *); @@ -55,13 +66,9 @@ static __inline void _tcb_set(struct tcb *tcb) { - /* There is no thread yet; use the fake tcb. */ - __builtin_set_thread_pointer(tcb); + __builtin_set_thread_pointer(&tcb->tcb_tp); } -/* - * Get the current tcb. - */ static __inline struct tcb * _tcb_get(void) { ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/amd64/include/pthread_md.h#5 (text+ko) ==== @@ -79,20 +79,15 @@ __result; \ }) -/* - * The constructors. - */ struct tcb *_tcb_ctor(struct pthread *, int); void _tcb_dtor(struct tcb *tcb); -/* Called from the KSE to set its private data. */ static __inline void _tcb_set(struct tcb *tcb) { amd64_set_fsbase(tcb); } -/* Get the current kcb. */ static __inline struct tcb * _tcb_get(void) { @@ -101,7 +96,6 @@ extern struct pthread *_thr_initial; -/* Get the current thread. */ static __inline struct pthread * _get_curthread(void) { ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/i386/i386/pthread_md.c#3 (text+ko) ==== @@ -29,13 +29,8 @@ __FBSDID("$FreeBSD: src/lib/libpthread/arch/i386/i386/pthread_md.c,v 1.4 2004/11/06 03:35:51 peter Exp $"); #include <sys/types.h> -#include <machine/cpufunc.h> #include <machine/segments.h> #include <machine/sysarch.h> - -#include <unistd.h> -#include <signal.h> -#include <stdlib.h> #include <string.h> #include "rtld_tls.h" ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/ia64/pthread_md.c#3 (text+ko) ==== @@ -28,6 +28,7 @@ */ #include <stdlib.h> +#include <string.h> #include <sys/types.h> #include "rtld_tls.h" #include "pthread_md.h" @@ -48,7 +49,7 @@ #if 1 if ((tcb = malloc(sizeof(struct tcb))) != NULL) { - tcb->tcb_tdv = 0; + memset(tcb, 0, sizeof(struct tcb)); tcb->tcb_thread = thread; } #else ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/ia64/include/pthread_md.h#5 (text+ko) ==== @@ -31,32 +31,41 @@ #include <stddef.h> -#define DTV_OFFSET offsetof(struct tcb, tcb_tdv) +#define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv) struct pthread; struct tcb; struct tdv; /* We don't know what this is yet? */ +/* + * tp points to one of these. We define the static TLS as an array + * of long double to enforce 16-byte alignment of the TLS memory, + * struct ia64_tp, struct tcb and also struct kcb. Both static and + * dynamic allocation of any of these structures will result in a + * valid, well-aligned thread pointer. + */ +struct ia64_tp { + struct tdv *tp_tdv; /* dynamic TLS */ + uint64_t _reserved_; + long double tp_tls[0]; /* static TLS */ +}; + struct tcb { - struct tdv *tcb_tdv; /* dynamic TLS */ struct pthread *tcb_thread; + struct ia64_tp tcb_tp; }; -register struct tcb *_tp __asm("%r13"); +register struct ia64_tp *_tp __asm("%r13"); -#define _tcb _tp +#define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp))) -/* - * The tcb constructors. - */ struct tcb *_tcb_ctor(struct pthread *, int); void _tcb_dtor(struct tcb *); -/* Called from the KSE to set its private data. */ static __inline void _tcb_set(struct tcb *tcb) { - _tp = tcb; + _tp = &tcb->tcb_tp; } static __inline struct tcb * ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/powerpc/include/pthread_md.h#2 (text+ko) ==== @@ -33,24 +33,11 @@ #ifndef _PTHREAD_MD_H_ #define _PTHREAD_MD_H_ -#include <sys/kse.h> #include <stddef.h> -#include <ucontext.h> - -extern void _ppc32_enter_uts(struct kse_mailbox *, kse_func_t, void *, size_t); -extern int _ppc32_setcontext(mcontext_t *, intptr_t, intptr_t *); -extern int _ppc32_getcontext(mcontext_t *); +#include <sys/types.h> -#define KSE_STACKSIZE 16384 #define DTV_OFFSET offsetof(struct tcb, tcb_tp.tp_tdv) -#define THR_GETCONTEXT(ucp) _ppc32_getcontext(&(ucp)->uc_mcontext) -#define THR_SETCONTEXT(ucp) _ppc32_setcontext(&(ucp)->uc_mcontext, 0, NULL) - -#define PER_THREAD - -struct kcb; -struct kse; struct pthread; struct tcb; struct tdv; @@ -65,20 +52,10 @@ }; struct tcb { - struct kse_thr_mailbox tcb_tmbx; struct pthread *tcb_thread; - struct kcb *tcb_curkcb; - long tcb_isfake; struct ppc32_tp tcb_tp; }; -struct kcb { - struct kse_mailbox kcb_kmbx; - struct tcb kcb_faketcb; - struct tcb *kcb_curtcb; - struct kse *kcb_kse; -}; - /* * From the PowerPC32 TLS spec: * @@ -90,97 +67,12 @@ #define _tcb ((struct tcb *)(_tpr - TP_OFFSET - offsetof(struct tcb, tcb_tp))) -/* - * The kcb and tcb constructors. - */ struct tcb *_tcb_ctor(struct pthread *, int); void _tcb_dtor(struct tcb *); -struct kcb *_kcb_ctor(struct kse *kse); -void _kcb_dtor(struct kcb *); -/* Called from the KSE to set its private data. */ static __inline void -_kcb_set(struct kcb *kcb) +_tcb_set(struct tcb *tcb) { - /* There is no thread yet; use the fake tcb. */ - _tpr = (uint8_t *)&kcb->kcb_faketcb.tcb_tp + TP_OFFSET; -} - -/* - * Get the current kcb. - * - * This can only be called while in a critical region; don't - * worry about having the kcb changed out from under us. - */ -static __inline struct kcb * -_kcb_get(void) -{ - return (_tcb->tcb_curkcb); -} - -/* - * Enter a critical region. - * - * Read and clear km_curthread in the kse mailbox. - */ -static __inline struct kse_thr_mailbox * -_kcb_critical_enter(void) -{ - struct kse_thr_mailbox *crit; - uint32_t flags; - - if (_tcb->tcb_isfake != 0) { - /* - * We already are in a critical region since - * there is no current thread. - */ - crit = NULL; - } else { - flags = _tcb->tcb_tmbx.tm_flags; - _tcb->tcb_tmbx.tm_flags |= TMF_NOUPCALL; - crit = _tcb->tcb_curkcb->kcb_kmbx.km_curthread; - _tcb->tcb_curkcb->kcb_kmbx.km_curthread = NULL; - _tcb->tcb_tmbx.tm_flags = flags; - } - return (crit); -} - -static __inline void -_kcb_critical_leave(struct kse_thr_mailbox *crit) -{ - /* No need to do anything if this is a fake tcb. */ - if (_tcb->tcb_isfake == 0) - _tcb->tcb_curkcb->kcb_kmbx.km_curthread = crit; -} - -static __inline int -_kcb_in_critical(void) -{ - uint32_t flags; - int ret; - - if (_tcb->tcb_isfake != 0) { - /* - * We are in a critical region since there is no - * current thread. - */ - ret = 1; - } else { - flags = _tcb->tcb_tmbx.tm_flags; - _tcb->tcb_tmbx.tm_flags |= TMF_NOUPCALL; - ret = (_tcb->tcb_curkcb->kcb_kmbx.km_curthread == NULL); - _tcb->tcb_tmbx.tm_flags = flags; - } - return (ret); -} - -static __inline void -_tcb_set(struct kcb *kcb, struct tcb *tcb) -{ - if (tcb == NULL) - tcb = &kcb->kcb_faketcb; - kcb->kcb_curtcb = tcb; - tcb->tcb_curkcb = kcb; _tpr = (uint8_t *)&tcb->tcb_tp + TP_OFFSET; } @@ -190,69 +82,14 @@ return (_tcb); } +extern struct pthread *_thr_initial; + static __inline struct pthread * _get_curthread(void) { - return (_tcb->tcb_thread); -} - -/* - * Get the current kse. - * - * Like _kcb_get(), this can only be called while in a critical region. - */ -static __inline struct kse * -_get_curkse(void) -{ - return (_tcb->tcb_curkcb->kcb_kse); -} - -static __inline int -_thread_enter_uts(struct tcb *tcb, struct kcb *kcb) -{ - if (_ppc32_getcontext(&tcb->tcb_tmbx.tm_context.uc_mcontext) == 0) { - /* Make the fake tcb the current thread. */ - kcb->kcb_curtcb = &kcb->kcb_faketcb; - _tpr = (uint8_t *)&kcb->kcb_faketcb.tcb_tp + TP_OFFSET; - _ppc32_enter_uts(&kcb->kcb_kmbx, kcb->kcb_kmbx.km_func, - kcb->kcb_kmbx.km_stack.ss_sp, - kcb->kcb_kmbx.km_stack.ss_size - 32); - /* We should not reach here. */ - return (-1); - } - return (0); -} - -static __inline int -_thread_switch(struct kcb *kcb, struct tcb *tcb, int setmbox) -{ - mcontext_t *mc; - extern int _libkse_debug; - - _tcb_set(kcb, tcb); - mc = &tcb->tcb_tmbx.tm_context.uc_mcontext; - - /* - * A full context needs a system call to restore, so use - * kse_switchin. Otherwise, the partial context can be - * restored with _ppc32_setcontext - */ - if (mc->mc_vers != _MC_VERSION_KSE && _libkse_debug != 0) { - if (setmbox) - kse_switchin(&tcb->tcb_tmbx, KSE_SWITCHIN_SETTMBX); - else - kse_switchin(&tcb->tcb_tmbx, 0); - } else { - tcb->tcb_tmbx.tm_lwp = kcb->kcb_kmbx.km_lwp; - if (setmbox) - _ppc32_setcontext(mc, (intptr_t)&tcb->tcb_tmbx, - (intptr_t *)&kcb->kcb_kmbx.km_curthread); - else - _ppc32_setcontext(mc, 0, NULL); - } - - /* We should not reach here. */ - return (-1); + if (_thr_initial) + return (_tcb->tcb_thread); + return (NULL); } #endif /* _PTHREAD_MD_H_ */ ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/include/pthread_md.h#4 (text+ko) ==== @@ -41,31 +41,37 @@ struct tcb; struct tdv; /* We don't know what this is yet? */ +/* + * %g6 points to one of these. We define the static TLS as an array + * of long double to enforce 16-byte alignment of the TLS memory. + * + * XXX - Both static and dynamic allocation of any of these structures + * will result in a valid, well-aligned thread pointer??? + */ +struct sparc64_tp { + struct tdv *tp_tdv; /* dynamic TLS */ + uint64_t _reserved_; + long double tp_tls[0]; /* static TLS */ +}; + struct tcb { - struct tdv *tp_tdv; /* dynamic TLS */ struct pthread *tcb_thread; + struct sparc64_tp tcb_tp; }; -register struct tcb *_tp __asm("%g6"); +register struct sparc64_tp *_tp __asm("%g6"); -#define _tcb _tp +#define _tcb ((struct tcb*)((char*)(_tp) - offsetof(struct tcb, tcb_tp))) -/* - * The tcb constructors. - */ struct tcb *_tcb_ctor(struct pthread *, int); void _tcb_dtor(struct tcb *); -/* Called from the thread to set its private data. */ static __inline void _tcb_set(struct tcb *tcb) { - _tcb = tcb; + _tp = &tcb->tcb_tp; } -/* - * Get the current tcb. - */ static __inline struct tcb * _tcb_get(void) { ==== //depot/projects/davidxu_thread/src/lib/libthread/arch/sparc64/sparc64/pthread_md.c#3 (text+ko) ====
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200502150502.j1F52d6L083593>