Date: Tue, 4 Apr 2006 21:18:12 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 94635 for review Message-ID: <200604042118.k34LIC9O003777@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=94635 Change 94635 by peter@peter_daintree on 2006/04/04 21:17:47 IFC @94632 Affected files ... .. //depot/projects/hammer/etc/rc.subr#34 integrate .. //depot/projects/hammer/lib/libc/stdlib/malloc.3#11 integrate .. //depot/projects/hammer/lib/libc/stdlib/malloc.c#27 integrate .. //depot/projects/hammer/lib/libthr/arch/amd64/amd64/pthread_md.c#2 integrate .. //depot/projects/hammer/lib/libthr/arch/amd64/include/pthread_md.h#2 integrate .. //depot/projects/hammer/lib/libthr/arch/i386/i386/pthread_md.c#6 integrate .. //depot/projects/hammer/lib/libthr/arch/i386/include/pthread_md.h#5 integrate .. //depot/projects/hammer/lib/libthr/pthread.map#9 integrate .. //depot/projects/hammer/lib/libthr/thread/Makefile.inc#14 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_attr.c#5 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_barrier.c#5 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_barrierattr.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_cancel.c#11 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_clean.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_concurrency.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_cond.c#13 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_condattr.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_create.c#22 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_detach.c#10 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_equal.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_exit.c#18 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_fork.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_getprio.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_getschedparam.c#4 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_info.c#7 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_init.c#23 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_join.c#14 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_kill.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_list.c#6 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_main_np.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_multi_np.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_mutex.c#29 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_mutexattr.c#5 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_private.h#31 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_pspinlock.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_resume_np.c#8 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_rtld.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_rwlock.c#7 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_rwlockattr.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_self.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_setprio.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_setschedparam.c#9 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_sig.c#13 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_single_np.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_spec.c#3 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_spinlock.c#11 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_stack.c#6 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_suspend_np.c#6 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_switch_np.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_syscalls.c#11 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_umtx.c#2 integrate .. //depot/projects/hammer/lib/libthr/thread/thr_yield.c#2 integrate .. //depot/projects/hammer/release/doc/zh_CN.GB2312/relnotes/common/new.sgml#10 integrate .. //depot/projects/hammer/share/man/man4/mfi.4#2 integrate .. //depot/projects/hammer/share/man/man8/rc.subr.8#8 integrate .. //depot/projects/hammer/sys/alpha/include/kdb.h#3 integrate .. //depot/projects/hammer/sys/amd64/amd64/gdb_machdep.c#13 integrate .. //depot/projects/hammer/sys/amd64/amd64/pmap.c#151 integrate .. //depot/projects/hammer/sys/amd64/include/gdb_machdep.h#4 integrate .. //depot/projects/hammer/sys/amd64/include/kdb.h#3 integrate .. //depot/projects/hammer/sys/dev/acpica/Osd/OsdHardware.c#16 integrate .. //depot/projects/hammer/sys/dev/hwpmc/hwpmc_x86.c#5 integrate .. //depot/projects/hammer/sys/dev/iicbus/if_ic.c#12 integrate .. //depot/projects/hammer/sys/dev/iicbus/iic.c#8 integrate .. //depot/projects/hammer/sys/dev/scc/scc_bfe.h#2 integrate .. //depot/projects/hammer/sys/dev/scc/scc_core.c#2 integrate .. //depot/projects/hammer/sys/dev/uart/uart_dev_z8530.c#13 integrate .. //depot/projects/hammer/sys/i386/i386/exception.s#13 integrate .. //depot/projects/hammer/sys/i386/include/kdb.h#3 integrate .. //depot/projects/hammer/sys/ia64/ia64/interrupt.c#22 integrate .. //depot/projects/hammer/sys/ia64/include/kdb.h#3 integrate .. //depot/projects/hammer/sys/kern/subr_kdb.c#18 integrate .. //depot/projects/hammer/sys/kern/vfs_bio.c#69 integrate .. //depot/projects/hammer/sys/kern/vfs_subr.c#104 integrate .. //depot/projects/hammer/sys/net/if_media.h#15 integrate .. //depot/projects/hammer/sys/netinet/in_pcb.c#40 integrate .. //depot/projects/hammer/sys/netinet/tcp_input.c#61 integrate .. //depot/projects/hammer/sys/netinet/tcp_subr.c#56 integrate .. //depot/projects/hammer/sys/netipsec/ipsec.c#12 integrate .. //depot/projects/hammer/sys/netipsec/keysock.c#12 integrate .. //depot/projects/hammer/sys/sparc64/include/kdb.h#3 integrate .. //depot/projects/hammer/sys/sys/umtx.h#13 integrate .. //depot/projects/hammer/sys/ufs/ffs/ffs_softdep.c#36 integrate .. //depot/projects/hammer/sys/ufs/ufs/ufsmount.h#10 integrate .. //depot/projects/hammer/usr.bin/calendar/calendars/calendar.freebsd#46 integrate .. //depot/projects/hammer/usr.bin/find/find.1#19 integrate Differences ... ==== //depot/projects/hammer/etc/rc.subr#34 (text+ko) ==== @@ -1,7 +1,7 @@ -# $NetBSD: rc.subr,v 1.60 2003/07/26 05:13:47 lukem Exp $ -# $FreeBSD: src/etc/rc.subr,v 1.50 2006/03/23 16:48:32 flz Exp $ +# $NetBSD: rc.subr,v 1.65 2004/10/12 14:45:29 lukem Exp $ +# $FreeBSD: src/etc/rc.subr,v 1.51 2006/04/04 10:52:15 flz Exp $ # -# Copyright (c) 1997-2002 The NetBSD Foundation, Inc. +# Copyright (c) 1997-2004 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation @@ -39,6 +39,8 @@ # functions used by various rc scripts # +: ${rcvar_manpage:='rc.conf(5)'} + # # Operating System dependent/independent variables # @@ -138,12 +140,13 @@ return 1 ;; *) - warn "\$${1} is not set properly - see rc.conf(5)." + warn "\$${1} is not set properly - see ${rcvar_manpage}." return 1 ;; esac } +# # reverse_list list # print the list in reverse order # @@ -598,7 +601,7 @@ start) if [ -z "$rc_fast" -a -n "$rc_pid" ]; then - echo "${name} already running? (pid=$rc_pid)." + echo 1>&2 "${name} already running? (pid=$rc_pid)." return 1 fi @@ -612,7 +615,7 @@ # for _f in $required_vars; do if ! checkyesno $_f; then - warn "\$${_f} is not set." + warn "\$${_f} is not enabled." if [ -z "$rc_force" ]; then return 1 fi @@ -684,10 +687,10 @@ if [ -z "$rc_pid" ]; then [ -n "$rc_fast" ] && return 0 if [ -n "$pidfile" ]; then - echo \ + echo 1>&2 \ "${name} not running? (check $pidfile)." else - echo "${name} not running?" + echo 1>&2 "${name} not running?" fi return 1 fi @@ -729,10 +732,10 @@ reload) if [ -z "$rc_pid" ]; then if [ -n "$pidfile" ]; then - echo \ + echo 1>&2 \ "${name} not running? (check $pidfile)." else - echo "${name} not running?" + echo 1>&2 "${name} not running?" fi return 1 fi @@ -854,7 +857,7 @@ } # -# load_rc_config +# load_rc_config command # Source in the configuration file for a given command. # load_rc_config() @@ -898,6 +901,25 @@ ;; esac } + +# +# load_rc_config_var cmd var +# Read the rc.conf(5) var for cmd and set in the +# current shell, using load_rc_config in a subshell to prevent +# unwanted side effects from other variable assignments. +# +load_rc_config_var() +{ + if [ $# -ne 2 ]; then + err 3 'USAGE: load_rc_config_var cmd var' + fi + eval $(eval '( + load_rc_config '$1' >/dev/null; + if [ -n "${'$2'}" -o "${'$2'-UNSET}" != "UNSET" ]; then + echo '$2'=\'\''${'$2'}\'\''; + fi + )' ) +} # # rc_usage commands @@ -1065,6 +1087,8 @@ fi } +_rc_subr_loaded=: + # make_symlink src link # Make a symbolic link 'link' to src from basedir. If the # directory in which link is to be created does not exist ==== //depot/projects/hammer/lib/libc/stdlib/malloc.3#11 (text+ko) ==== @@ -30,9 +30,9 @@ .\" SUCH DAMAGE. .\" .\" @(#)malloc.3 8.1 (Berkeley) 6/4/93 -.\" $FreeBSD: src/lib/libc/stdlib/malloc.3,v 1.68 2006/03/28 22:16:04 jasone Exp $ +.\" $FreeBSD: src/lib/libc/stdlib/malloc.3,v 1.69 2006/04/04 20:27:53 jasone Exp $ .\" -.Dd March 28, 2006 +.Dd April 4, 2006 .Dt MALLOC 3 .Os .Sh NAME @@ -316,6 +316,11 @@ The .Fn free function returns no value. +.Pp +The +.Fn malloc_usable_size +function returns the usable size of the allocation pointed to by +.Fa ptr . .Sh IMPLEMENTATION NOTES This allocator uses multiple arenas in order to reduce lock contention for threaded programs on multi-processor systems. ==== //depot/projects/hammer/lib/libc/stdlib/malloc.c#27 (text+ko) ==== @@ -66,7 +66,7 @@ * | | Sub-page | 1 kB | * | | | 2 kB | * |====================================| - * | Medium | 4 kB | + * | Large | 4 kB | * | | 8 kB | * | | 16 kB | * | | ... | @@ -74,7 +74,7 @@ * | | 512 kB | * | | 1 MB | * |====================================| - * | Large | 2 MB | + * | Huge | 2 MB | * | | 4 MB | * | | 6 MB | * | | ... | @@ -85,11 +85,11 @@ * Small : Each size class is segregated into its own set of runs. Each run * maintains a bitmap of which regions are free/allocated. * - * Medium : Each allocation is backed by a dedicated run. Metadata are stored - * in the associated arena chunk header maps. + * Large : Each allocation is backed by a dedicated run. Metadata are stored + * in the associated arena chunk header maps. * - * Large : Each allocation is backed by a dedicated contiguous set of chunks. - * Metadata are stored in a separate red-black tree. + * Huge : Each allocation is backed by a dedicated contiguous set of chunks. + * Metadata are stored in a separate red-black tree. * ******************************************************************************* */ @@ -143,8 +143,10 @@ (a_qr_b)->a_field.qre_prev = t; \ } while (0) -/* qr_meld() and qr_split() are functionally equivalent, so there's no need to - * have two copies of the code. */ +/* + * qr_meld() and qr_split() are functionally equivalent, so there's no need to + * have two copies of the code. + */ #define qr_split(a_qr_a, a_qr_b, a_type, a_field) \ qr_meld((a_qr_a), (a_qr_b), a_type, a_field) @@ -173,7 +175,7 @@ /* * In order to disable various extra features that may have negative - * performance impacts, (assertions, expanded statistics, redzones), define + * performance impacts, (assertions, expanded statistics), define * NO_MALLOC_EXTRAS. */ /* #define NO_MALLOC_EXTRAS */ @@ -183,7 +185,7 @@ #endif #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.120 2006/03/30 20:25:52 jasone Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.122 2006/04/04 19:46:28 jasone Exp $"); #include "libc_private.h" #ifdef MALLOC_DEBUG @@ -348,8 +350,12 @@ spinlock_t lock; } malloc_mutex_t; +/* Set to true once the allocator has been initialized. */ static bool malloc_initialized = false; +/* Used to avoid initialization races. */ +static malloc_mutex_t init_lock = {_SPINLOCK_INITIALIZER}; + /******************************************************************************/ /* * Statistics data structures. @@ -654,7 +660,7 @@ */ /* Used as a special "nil" return value for malloc(0). */ -static int nil; +static const int nil; /* Number of CPUs. */ static unsigned ncpus; @@ -1498,62 +1504,125 @@ /* Generate red-black tree code for arena chunks. */ RB_GENERATE_STATIC(arena_chunk_tree_s, arena_chunk_s, link, arena_chunk_comp); -static inline void -arena_run_mask_free_set(arena_run_t *run, unsigned reg) +static inline void * +arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin) { - unsigned elm, bit; + void *ret; + unsigned i, mask, bit, regind; assert(run->magic == ARENA_RUN_MAGIC); - assert(reg < run->bin->nregs); + + for (i = run->regs_minelm; i < REGS_MASK_NELMS; i++) { + mask = run->regs_mask[i]; + if (mask != 0) { + /* Usable allocation found. */ + bit = ffs(mask) - 1; + + regind = ((i << (SIZEOF_INT_2POW + 3)) + bit); + ret = (void *)&((char *)run)[bin->reg0_offset + + (bin->reg_size * regind)]; + + /* Clear bit. */ + mask ^= (1 << bit); + run->regs_mask[i] = mask; - elm = reg >> (SIZEOF_INT_2POW + 3); - if (elm < run->regs_minelm) - run->regs_minelm = elm; - bit = reg - (elm << (SIZEOF_INT_2POW + 3)); - assert((run->regs_mask[elm] & (1 << bit)) == 0); - run->regs_mask[elm] |= (1 << bit); + return (ret); + } else { + /* + * Make a note that nothing before this element + * contains a free region. + */ + run->regs_minelm = i + 1; + } + } + /* Not reached. */ + assert(0); } static inline void -arena_run_mask_free_unset(arena_run_t *run, unsigned reg) +arena_run_reg_dalloc(arena_run_t *run, arena_bin_t *bin, void *ptr, size_t size) { - unsigned elm, bit; + unsigned diff, regind, elm, bit; assert(run->magic == ARENA_RUN_MAGIC); - assert(reg < run->bin->nregs); - elm = reg >> (SIZEOF_INT_2POW + 3); - bit = reg - (elm << (SIZEOF_INT_2POW + 3)); - assert((run->regs_mask[elm] & (1 << bit)) != 0); - run->regs_mask[elm] ^= (1 << bit); -} + /* + * Avoid doing division with a variable divisor if possible. This + * single operation can reduce allocator throughput by around 20%! + */ +#define POW2_CASE(p) \ + case (1 << (p)): \ + regind = diff >> (p); \ + break; +#define QUANTUM_CASE(n) \ + case ((n) << QUANTUM_2POW_MIN): \ + regind = diff / ((n) << QUANTUM_2POW_MIN); \ + break; -static inline unsigned -arena_run_search(arena_run_t *run) -{ - unsigned i, mask, bit; + /* + * These assertions make sure that the switch statement matches + * compile-time configuration. + */ + assert(tiny_min_2pow >= 1); + assert(QUANTUM_2POW_MIN >= 3 && QUANTUM_2POW_MIN <= 4); + assert(SMALL_MAX_2POW_DEFAULT == 9); - assert(run->magic == ARENA_RUN_MAGIC); + diff = (unsigned)((uintptr_t)ptr - (uintptr_t)run - bin->reg0_offset); + switch (size) { + POW2_CASE(1) + POW2_CASE(2) +#if (QUANTUM_2POW_MIN > 3) + POW2_CASE(3) +#endif + QUANTUM_CASE(1) + QUANTUM_CASE(2) + QUANTUM_CASE(3) + QUANTUM_CASE(4) + QUANTUM_CASE(5) + QUANTUM_CASE(6) + QUANTUM_CASE(7) + QUANTUM_CASE(8) + QUANTUM_CASE(9) + QUANTUM_CASE(10) + QUANTUM_CASE(11) + QUANTUM_CASE(12) + QUANTUM_CASE(13) + QUANTUM_CASE(14) + QUANTUM_CASE(15) + QUANTUM_CASE(16) + QUANTUM_CASE(17) + QUANTUM_CASE(18) + QUANTUM_CASE(19) + QUANTUM_CASE(20) + QUANTUM_CASE(21) + QUANTUM_CASE(22) + QUANTUM_CASE(23) + QUANTUM_CASE(24) + QUANTUM_CASE(25) + QUANTUM_CASE(26) + QUANTUM_CASE(27) + QUANTUM_CASE(28) + QUANTUM_CASE(29) + QUANTUM_CASE(30) + QUANTUM_CASE(31) + QUANTUM_CASE(32) - for (i = run->regs_minelm; i < REGS_MASK_NELMS; i++) { - mask = run->regs_mask[i]; - if (mask != 0) { - bit = ffs(mask); - if (bit != 0) { - /* Usable allocation found. */ - return ((i << (SIZEOF_INT_2POW + 3)) - + bit - 1); - } - } else { - /* - * Make a note that nothing before this element - * contains a free region. - */ - run->regs_minelm = i + 1; - } + POW2_CASE(10) + POW2_CASE(11) + POW2_CASE(12) /* Handle up to 8 kB pages. */ + default: + regind = diff / size; } +#undef POW2_CASE +#undef QUANTUM_CASE + assert(regind < bin->nregs); - return (UINT_MAX); + elm = regind >> (SIZEOF_INT_2POW + 3); + if (elm < run->regs_minelm) + run->regs_minelm = elm; + bit = regind - (elm << (SIZEOF_INT_2POW + 3)); + assert((run->regs_mask[elm] & (1 << bit)) == 0); + run->regs_mask[elm] |= (1 << bit); } static void @@ -1638,7 +1707,7 @@ header_size += pagesize - (header_size % pagesize); } - header_npages = header_size / pagesize; + header_npages = header_size >> pagesize_2pow; pow2_header_npages = pow2_ceil(header_npages); /* @@ -1665,7 +1734,7 @@ * the beginning of the chunk, which we just took care of by * "allocating" the leading pages. */ - while (map_offset < (chunk_size / pagesize)) { + while (map_offset < (chunk_size >> pagesize_2pow)) { log2_run_pages = ffs(map_offset) - 1; run_pages = (1 << log2_run_pages); for (i = 0; i < run_pages; i++) { @@ -1858,7 +1927,7 @@ * large enough. Look for a precise fit, but do not pass up a chunk * that has a run which is large enough to split. */ - min_ind = ffs(size / pagesize) - 1; + min_ind = ffs(size >> pagesize_2pow) - 1; RB_FOREACH(chunk, arena_chunk_tree_s, &arena->chunks) { for (i = min_ind; i < (opt_chunk_2pow - pagesize_2pow); @@ -2044,18 +2113,12 @@ size_t size) { void *ret; - unsigned regind; assert(run->magic == ARENA_RUN_MAGIC); assert(run->nfree > 0); - regind = arena_run_search(run); - assert(regind != UINT_MAX); - assert(regind < bin->nregs); - - ret = (void *)&((char *)run)[bin->reg0_offset + (bin->reg_size - * regind)]; - arena_run_mask_free_unset(run, regind); + ret = arena_run_reg_alloc(run, bin); + assert(ret != NULL); run->nfree--; if (run->nfree < run->free_min) { /* Promote run to higher fullness quartile. */ @@ -2256,7 +2319,6 @@ if (mapelm.large == false) { arena_run_t *run; arena_bin_t *bin; - unsigned regind; /* Small allocation. */ @@ -2270,10 +2332,8 @@ if (opt_junk) memset(ptr, 0x5a, size); - regind = (unsigned)(((uintptr_t)ptr - (uintptr_t)run - - bin->reg0_offset) / size); malloc_mutex_lock(&arena->mtx); - arena_run_mask_free_set(run, regind); + arena_run_reg_dalloc(run, bin, ptr, size); run->nfree++; if (run->nfree > run->free_max) { /* Demote run to lower fullness quartile. */ @@ -2913,12 +2973,6 @@ malloc_init(void) { - /* - * We always initialize before threads are created, since any thread - * creation first triggers allocations. - */ - assert(__isthreaded == 0 || malloc_initialized); - if (malloc_initialized == false) return (malloc_init_hard()); @@ -2933,6 +2987,16 @@ char buf[PATH_MAX + 1]; const char *opts; + malloc_mutex_lock(&init_lock); + if (malloc_initialized) { + /* + * Another thread initialized the allocator before this one + * acquired init_lock. + */ + malloc_mutex_unlock(&init_lock); + return (false); + } + /* Get number of CPUs. */ { int mib[2]; @@ -3283,8 +3347,10 @@ /* Allocate and initialize arenas. */ arenas = (arena_t **)base_alloc(sizeof(arena_t *) * narenas); - if (arenas == NULL) + if (arenas == NULL) { + malloc_mutex_unlock(&init_lock); return (true); + } /* * Zero the array. In practice, this should always be pre-zeroed, * since it was just mmap()ed, but let's be sure. @@ -3296,12 +3362,15 @@ * arena_choose_hard(). */ arenas_extend(0); - if (arenas[0] == NULL) + if (arenas[0] == NULL) { + malloc_mutex_unlock(&init_lock); return (true); + } malloc_mutex_init(&arenas_mtx); malloc_initialized = true; + malloc_mutex_unlock(&init_lock); return (false); } @@ -3325,7 +3394,7 @@ if (size == 0) { if (opt_sysv == false) - ret = &nil; + ret = (void *)&nil; else ret = NULL; goto RETURN; @@ -3407,11 +3476,17 @@ num_size = num * size; if (num_size == 0) { if (opt_sysv == false) - ret = &nil; + ret = (void *)&nil; else ret = NULL; goto RETURN; - } else if (num_size / size != num) { + /* + * Try to avoid division here. We know that it isn't possible to + * overflow during multiplication if neither operand uses any of the + * most significant half of the bits in a size_t. + */ + } else if (((num | size) & (SIZE_T_MAX << (sizeof(size_t) << 2))) + && (num_size / size != num)) { /* size_t overflow. */ ret = NULL; goto RETURN; @@ -3474,7 +3549,7 @@ if (ptr != &nil && ptr != NULL) idalloc(ptr); - ret = &nil; + ret = (void *)&nil; } UTRACE(ptr, size, ret); ==== //depot/projects/hammer/lib/libthr/arch/amd64/amd64/pthread_md.c#2 (text+ko) ==== @@ -23,7 +23,7 @@ * (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/libthr/arch/amd64/amd64/pthread_md.c,v 1.1 2005/04/02 01:19:57 davidxu Exp $ + * $FreeBSD: src/lib/libthr/arch/amd64/amd64/pthread_md.c,v 1.2 2006/04/04 03:26:05 davidxu Exp $ */ #include <sys/types.h> @@ -38,13 +38,11 @@ _tcb_ctor(struct pthread *thread, int initial) { struct tcb *tcb; - void *oldtls; if (initial) - __asm __volatile("movq %%fs:0, %0" : "=r" (oldtls)); + __asm __volatile("movq %%fs:0, %0" : "=r" (tcb)); else - oldtls = NULL; - tcb = _rtld_allocate_tls(oldtls, sizeof(struct tcb), 16); + tcb = _rtld_allocate_tls(NULL, sizeof(struct tcb), 16); if (tcb) tcb->tcb_thread = thread; return (tcb); ==== //depot/projects/hammer/lib/libthr/arch/amd64/include/pthread_md.h#2 (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/amd64/include/pthread_md.h,v 1.1 2005/04/02 01:19:57 davidxu Exp $ + * $FreeBSD: src/lib/libthr/arch/amd64/include/pthread_md.h,v 1.3 2006/04/04 03:35:26 davidxu Exp $ */ /* @@ -91,13 +91,9 @@ return (TCB_GET64(tcb_self)); } -extern struct pthread *_thr_initial; - static __inline struct pthread * _get_curthread(void) { - if (_thr_initial) - return (TCB_GET64(tcb_thread)); - return (NULL); + return (TCB_GET64(tcb_thread)); } #endif ==== //depot/projects/hammer/lib/libthr/arch/i386/i386/pthread_md.c#6 (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.6 2006/01/07 06:01:43 davidxu Exp $ + * $FreeBSD: src/lib/libthr/arch/i386/i386/pthread_md.c,v 1.7 2006/04/04 03:26:06 davidxu Exp $ */ #include <sys/types.h> @@ -39,14 +39,11 @@ _tcb_ctor(struct pthread *thread, int initial) { struct tcb *tcb; - void *oldtls; if (initial) - __asm __volatile("movl %%gs:0, %0" : "=r" (oldtls)); + __asm __volatile("movl %%gs:0, %0" : "=r" (tcb)); else - oldtls = NULL; - - tcb = _rtld_allocate_tls(oldtls, sizeof(struct tcb), 16); + tcb = _rtld_allocate_tls(NULL, sizeof(struct tcb), 16); if (tcb) tcb->tcb_thread = thread; return (tcb); ==== //depot/projects/hammer/lib/libthr/arch/i386/include/pthread_md.h#5 (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.5 2005/10/29 03:08:43 davidxu Exp $ + * $FreeBSD: src/lib/libthr/arch/i386/include/pthread_md.h,v 1.7 2006/04/04 03:35:25 davidxu Exp $ */ /* @@ -94,14 +94,10 @@ return (TCB_GET32(tcb_self)); } -extern struct pthread *_thr_initial; - /* Get the current thread. */ static __inline struct pthread * _get_curthread(void) { - if (_thr_initial) - return (TCB_GET32(tcb_thread)); - return (NULL); + return (TCB_GET32(tcb_thread)); } #endif ==== //depot/projects/hammer/lib/libthr/pthread.map#9 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/lib/libthr/pthread.map,v 1.13 2006/03/08 23:47:04 davidxu Exp $ +# $FreeBSD: src/lib/libthr/pthread.map,v 1.14 2006/04/04 02:57:49 davidxu Exp $ LIBTHREAD_1_0 { global: ___creat; @@ -16,8 +16,8 @@ __pthread_cond_wait; __pthread_mutex_init; __pthread_mutex_lock; + __pthread_mutex_timedlock; __pthread_mutex_trylock; - __pthread_mutex_timedlock; __read; __readv; __recvfrom; @@ -26,6 +26,9 @@ __sendmsg; __sendto; __sigsuspend; + __sigtimedwait; + __sigwait; + __sigwaitinfo; __wait4; __write; __writev; @@ -43,7 +46,6 @@ _pthread_barrierattr_getpshared; _pthread_barrierattr_init; _pthread_barrierattr_setpshared; - _pthread_attr_default; _pthread_attr_destroy; _pthread_attr_get_np; _pthread_attr_getdetachstate; @@ -75,7 +77,6 @@ _pthread_cond_signal; _pthread_cond_timedwait; _pthread_cond_wait; - _pthread_condattr_default; _pthread_condattr_destroy; _pthread_condattr_getclock; _pthread_condattr_getpshared; @@ -104,7 +105,6 @@ _pthread_mutex_timedlock; _pthread_mutex_trylock; _pthread_mutex_unlock; - _pthread_mutexattr_default; _pthread_mutexattr_destroy; _pthread_mutexattr_getkind_np; _pthread_mutexattr_getprioceiling; @@ -156,21 +156,18 @@ _pthread_timedjoin_np; _pthread_yield; _raise; - _sem_close; _sem_destroy; _sem_getvalue; _sem_init; - _sem_open; _sem_post; _sem_timedwait; _sem_trywait; - _sem_unlink; _sem_wait; _sigaction; _sigprocmask; _sigsuspend; + _sigtimedwait; _sigwait; - _sigtimedwait; _sigwaitinfo; _sleep; _spinlock; @@ -181,7 +178,10 @@ _usleep; _vfork; _wait; + _wait4; _waitpid; + _write; + _writev; accept; aio_suspend; close; @@ -320,21 +320,16 @@ recvfrom; recvmsg; select; - sem_close; sem_destroy; sem_getvalue; sem_init; - sem_open; sem_post; sem_timedwait; sem_trywait; - sem_unlink; sem_wait; sendmsg; sendto; sigaction; - sigaltstack; - sigpending; sigprocmask; sigsuspend; sigwait; ==== //depot/projects/hammer/lib/libthr/thread/Makefile.inc#14 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/lib/libthr/thread/Makefile.inc,v 1.15 2006/03/27 23:50:21 davidxu Exp $ +# $FreeBSD: src/lib/libthr/thread/Makefile.inc,v 1.16 2006/04/04 02:57:49 davidxu Exp $ # thr sources .PATH: ${.CURDIR}/thread @@ -39,7 +39,6 @@ thr_rwlockattr.c \ thr_self.c \ thr_sem.c \ - thr_seterrno.c \ thr_setprio.c \ thr_setschedparam.c \ thr_sig.c \ ==== //depot/projects/hammer/lib/libthr/thread/thr_attr.c#5 (text+ko) ==== @@ -93,14 +93,16 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libthr/thread/thr_attr.c,v 1.4 2006/01/09 03:59:51 davidxu Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_attr.c,v 1.5 2006/04/04 02:57:49 davidxu Exp $ */ +#include "namespace.h" #include <errno.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #include <pthread_np.h> +#include "un-namespace.h" #include "thr_private.h" ==== //depot/projects/hammer/lib/libthr/thread/thr_barrier.c#5 (text+ko) ==== @@ -23,12 +23,14 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libthr/thread/thr_barrier.c,v 1.4 2005/04/04 23:43:53 davidxu Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_barrier.c,v 1.5 2006/04/04 02:57:49 davidxu Exp $ */ +#include "namespace.h" #include <errno.h> #include <stdlib.h> #include <pthread.h> +#include "un-namespace.h" #include "thr_private.h" @@ -54,10 +56,12 @@ int _pthread_barrier_init(pthread_barrier_t *barrier, - const pthread_barrierattr_t *attr, int count) + const pthread_barrierattr_t *attr, unsigned count) { pthread_barrier_t bar; + (void)attr; + if (barrier == NULL || count <= 0) return (EINVAL); ==== //depot/projects/hammer/lib/libthr/thread/thr_barrierattr.c#3 (text+ko) ==== @@ -25,12 +25,14 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * - * $FreeBSD: src/lib/libthr/thread/thr_barrierattr.c,v 1.2 2005/04/02 01:20:00 davidxu Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_barrierattr.c,v 1.3 2006/04/04 02:57:49 davidxu Exp $ */ +#include "namespace.h" #include <errno.h> #include <stdlib.h> #include <pthread.h> +#include "un-namespace.h" #include "thr_private.h" ==== //depot/projects/hammer/lib/libthr/thread/thr_cancel.c#11 (text+ko) ==== @@ -23,11 +23,13 @@ * (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/libthr/thread/thr_cancel.c,v 1.12 2006/03/25 07:03:13 davidxu Exp $ + * $FreeBSD: src/lib/libthr/thread/thr_cancel.c,v 1.13 2006/04/04 02:57:49 davidxu Exp $ * */ +#include "namespace.h" #include <pthread.h> +#include "un-namespace.h" #include "thr_private.h" @@ -36,8 +38,6 @@ __weak_reference(_pthread_setcanceltype, pthread_setcanceltype); __weak_reference(_pthread_testcancel, pthread_testcancel); >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604042118.k34LIC9O003777>