summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r--usr/src/lib/libc/amd64/Makefile2
-rw-r--r--usr/src/lib/libc/i386/Makefile.com2
-rw-r--r--usr/src/lib/libc/inc/thr_inlines.h12
-rw-r--r--usr/src/lib/libc/inc/thr_uberdata.h28
-rw-r--r--usr/src/lib/libc/port/gen/getlogin.c79
-rw-r--r--usr/src/lib/libc/port/mapfile-vers5
-rw-r--r--usr/src/lib/libc/port/sys/zone.c5
-rw-r--r--usr/src/lib/libc/port/threads/thr.c4
-rw-r--r--usr/src/lib/libc/port/threads/tmem.c85
-rw-r--r--usr/src/lib/libc/sparc/Makefile.com2
-rw-r--r--usr/src/lib/libc/sparc/crt/_rtld.c9
-rw-r--r--usr/src/lib/libc/sparcv9/Makefile.com2
12 files changed, 208 insertions, 27 deletions
diff --git a/usr/src/lib/libc/amd64/Makefile b/usr/src/lib/libc/amd64/Makefile
index 9ddd748eb6..396c536387 100644
--- a/usr/src/lib/libc/amd64/Makefile
+++ b/usr/src/lib/libc/amd64/Makefile
@@ -20,6 +20,7 @@
#
#
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
@@ -798,6 +799,7 @@ THREADSOBJS= \
assfail.o \
cancel.o \
door_calls.o \
+ tmem.o \
pthr_attr.o \
pthr_barrier.o \
pthr_cond.o \
diff --git a/usr/src/lib/libc/i386/Makefile.com b/usr/src/lib/libc/i386/Makefile.com
index 31a7bc945f..d5826d8e45 100644
--- a/usr/src/lib/libc/i386/Makefile.com
+++ b/usr/src/lib/libc/i386/Makefile.com
@@ -21,6 +21,7 @@
#
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
+# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
@@ -840,6 +841,7 @@ THREADSOBJS= \
assfail.o \
cancel.o \
door_calls.o \
+ tmem.o \
pthr_attr.o \
pthr_barrier.o \
pthr_cond.o \
diff --git a/usr/src/lib/libc/inc/thr_inlines.h b/usr/src/lib/libc/inc/thr_inlines.h
index f7cdc6a6bd..66d811f25b 100644
--- a/usr/src/lib/libc/inc/thr_inlines.h
+++ b/usr/src/lib/libc/inc/thr_inlines.h
@@ -47,17 +47,19 @@
extern __GNU_INLINE ulwp_t *
_curthread(void)
{
-#if defined(__amd64)
ulwp_t *__value;
- __asm__ __volatile__("movq %%fs:0, %0" : "=r" (__value));
+ __asm__ __volatile__(
+#if defined(__amd64)
+ "movq %%fs:0, %0\n\t"
#elif defined(__i386)
- ulwp_t *__value;
- __asm__ __volatile__("movl %%gs:0, %0" : "=r" (__value));
+ "movl %%gs:0, %0\n\t"
#elif defined(__sparc)
- register ulwp_t *__value __asm__("g7");
+ ".register %%g7, #scratch\n\t"
+ "mov %%g7, %0\n\t"
#else
#error "port me"
#endif
+ : "=r" (__value));
return (__value);
}
diff --git a/usr/src/lib/libc/inc/thr_uberdata.h b/usr/src/lib/libc/inc/thr_uberdata.h
index 42c08049b2..5f67e760e2 100644
--- a/usr/src/lib/libc/inc/thr_uberdata.h
+++ b/usr/src/lib/libc/inc/thr_uberdata.h
@@ -22,6 +22,9 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
*/
+/*
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
#ifndef _THR_UBERDATA_H
#define _THR_UBERDATA_H
@@ -488,6 +491,28 @@ typedef struct {
#endif /* _SYSCALL32 */
/*
+ * As part of per-thread caching libumem (ptcumem), we add a small amount to the
+ * thread's uberdata to facilitate it. The tm_roots are the roots of linked
+ * lists which is used by libumem to chain together allocations. tm_size is used
+ * to track the total amount of data stored across those linked lists.
+ */
+#define NTMEMBASE 16
+
+typedef struct {
+ size_t tm_size;
+ void *tm_roots[NTMEMBASE];
+} tumem_t;
+
+#ifdef _SYSCALL32
+typedef struct {
+ uint32_t tm_size;
+ caddr32_t tm_roots[NTMEMBASE];
+} tumem32_t;
+#endif
+
+typedef void (*tmem_func_t)(void *, int);
+
+/*
* Maximum number of read locks allowed for one thread on one rwlock.
* This could be as large as INT_MAX, but the SUSV3 test suite would
* take an inordinately long time to complete. This is big enough.
@@ -653,6 +678,7 @@ typedef struct ulwp {
#if defined(sparc)
void *ul_unwind_ret; /* used only by _ex_clnup_handler() */
#endif
+ tumem_t ul_tmem; /* used only by umem */
} ulwp_t;
#define ul_cursig ul_cp.s.cursig /* deferred signal number */
@@ -1083,6 +1109,7 @@ typedef struct ulwp32 {
#if defined(sparc)
caddr32_t ul_unwind_ret; /* used only by _ex_clnup_handler() */
#endif
+ tumem32_t ul_tmem; /* used only by umem */
} ulwp32_t;
#define REPLACEMENT_SIZE32 ((size_t)&((ulwp32_t *)NULL)->ul_sigmask)
@@ -1205,6 +1232,7 @@ extern ulwp_t *find_lwp(thread_t);
extern void finish_init(void);
extern void update_sched(ulwp_t *);
extern void queue_alloc(void);
+extern void tmem_exit(void);
extern void tsd_exit(void);
extern void tsd_free(ulwp_t *);
extern void tls_setup(void);
diff --git a/usr/src/lib/libc/port/gen/getlogin.c b/usr/src/lib/libc/port/gen/getlogin.c
index a3d7b4cf3b..e96d294fd0 100644
--- a/usr/src/lib/libc/port/gen/getlogin.c
+++ b/usr/src/lib/libc/port/gen/getlogin.c
@@ -27,7 +27,9 @@
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
-#pragma ident "%Z%%M% %I% %E% SMI"
+/*
+ * Copyright (c) 2013 Joyent, Inc. All rights reserved.
+ */
#pragma weak _getlogin = getlogin
#pragma weak _getlogin_r = getlogin_r
@@ -35,6 +37,7 @@
#include "lint.h"
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/sysmacros.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
@@ -51,40 +54,55 @@
* XXX - _POSIX_LOGIN_NAME_MAX limits the length of a login name. The utmpx
* interface provides for a 32 character login name, but for the sake of
* compatibility, we are still using the old utmp-imposed limit.
+ *
+ * If you want the full name, use the Consolidation Private getxlogin().
*/
-/*
- * POSIX.1c Draft-6 version of the function getlogin_r.
- * It was implemented by Solaris 2.3.
- */
-char *
-getlogin_r(char *answer, int namelen)
+static int
+generic_getlogin(char *answer, int namelen, boolean_t truncate)
{
int uf;
off64_t me;
struct futmpx ubuf;
- if (namelen < _POSIX_LOGIN_NAME_MAX) {
- errno = ERANGE;
- return (NULL);
- }
-
if ((me = (off64_t)ttyslot()) < 0)
- return (NULL);
+ return (-1);
if ((uf = open64(UTMPX_FILE, 0)) < 0)
- return (NULL);
+ return (-1);
(void) lseek64(uf, me * sizeof (ubuf), SEEK_SET);
if (read(uf, &ubuf, sizeof (ubuf)) != sizeof (ubuf)) {
(void) close(uf);
- return (NULL);
+ return (-1);
}
(void) close(uf);
if (ubuf.ut_user[0] == '\0')
+ return (-1);
+ if (strnlen(ubuf.ut_user, sizeof (ubuf.ut_user)) >= namelen &&
+ !truncate) {
+ errno = ERANGE;
+ return (-1);
+ }
+ (void) strlcpy(answer, ubuf.ut_user, namelen);
+
+ return (0);
+}
+
+/*
+ * POSIX.1c Draft-6 version of the function getlogin_r.
+ * It was implemented by Solaris 2.3.
+ */
+char *
+getlogin_r(char *answer, int namelen)
+{
+ if (namelen < _POSIX_LOGIN_NAME_MAX) {
+ errno = ERANGE;
return (NULL);
- (void) strncpy(&answer[0], &ubuf.ut_user[0],
- _POSIX_LOGIN_NAME_MAX - 1);
- answer[_POSIX_LOGIN_NAME_MAX - 1] = '\0';
- return (&answer[0]);
+ }
+
+ if (generic_getlogin(answer, _POSIX_LOGIN_NAME_MAX, B_TRUE) == 0)
+ return (answer);
+
+ return (NULL);
}
/*
@@ -98,7 +116,7 @@ __posix_getlogin_r(char *name, int namelen)
int oerrno = errno;
errno = 0;
- if (getlogin_r(name, namelen) == NULL) {
+ if (getlogin_r(name, namelen) != 0) {
if (errno == 0)
nerrno = EINVAL;
else
@@ -111,9 +129,28 @@ __posix_getlogin_r(char *name, int namelen)
char *
getlogin(void)
{
- char *answer = tsdalloc(_T_LOGIN, _POSIX_LOGIN_NAME_MAX, NULL);
+ struct futmpx fu;
+ char *answer = tsdalloc(_T_LOGIN,
+ MAX(sizeof (fu.ut_user), _POSIX_LOGIN_NAME_MAX), NULL);
if (answer == NULL)
return (NULL);
return (getlogin_r(answer, _POSIX_LOGIN_NAME_MAX));
}
+
+char *
+getxlogin(void)
+{
+ struct futmpx fu;
+ char *answer = tsdalloc(_T_LOGIN,
+ MAX(sizeof (fu.ut_user), _POSIX_LOGIN_NAME_MAX), NULL);
+
+ if (answer == NULL)
+ return (NULL);
+
+ if (generic_getlogin(answer,
+ MAX(sizeof (fu.ut_user), _POSIX_LOGIN_NAME_MAX), B_FALSE) != 0)
+ return (NULL);
+
+ return (answer);
+}
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers
index d6907e359d..ae0034931d 100644
--- a/usr/src/lib/libc/port/mapfile-vers
+++ b/usr/src/lib/libc/port/mapfile-vers
@@ -24,6 +24,7 @@
# Copyright 2010 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
#
+# Copyright (c) 2012, Joyent, Inc. All rights reserved.
# Copyright (c) 2012 by Delphix. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
@@ -2743,6 +2744,7 @@ $endif
getvmusage;
__getwchar_xpg5;
__getwc_xpg5;
+ getxlogin;
gtty;
__idmap_flush_kcache;
__idmap_reg;
@@ -2888,6 +2890,9 @@ $endif
thr_wait_mutator;
_thr_wait_mutator;
__tls_get_addr;
+ _tmem_get_base;
+ _tmem_get_nentries;
+ _tmem_set_cleanup;
tpool_create;
tpool_dispatch;
tpool_destroy;
diff --git a/usr/src/lib/libc/port/sys/zone.c b/usr/src/lib/libc/port/sys/zone.c
index 4a4c70043d..182a7f22f7 100644
--- a/usr/src/lib/libc/port/sys/zone.c
+++ b/usr/src/lib/libc/port/sys/zone.c
@@ -22,6 +22,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2011 Joyent Inc. All rights reserved.
*/
#include "lint.h"
@@ -39,7 +40,8 @@
zoneid_t
zone_create(const char *name, const char *root, const struct priv_set *privs,
const char *rctls, size_t rctlsz, const char *zfs, size_t zfssz,
- int *extended_error, int match, int doi, const bslabel_t *label, int flags)
+ int *extended_error, int match, int doi, const bslabel_t *label, int flags,
+ zoneid_t req_zoneid)
{
zone_def zd;
priv_data_t *d;
@@ -59,6 +61,7 @@ zone_create(const char *name, const char *root, const struct priv_set *privs,
zd.doi = doi;
zd.label = label;
zd.flags = flags;
+ zd.zoneid = req_zoneid;
return ((zoneid_t)syscall(SYS_zone, ZONE_CREATE, &zd));
}
diff --git a/usr/src/lib/libc/port/threads/thr.c b/usr/src/lib/libc/port/threads/thr.c
index ae55fbddf5..b5d848449d 100644
--- a/usr/src/lib/libc/port/threads/thr.c
+++ b/usr/src/lib/libc/port/threads/thr.c
@@ -22,6 +22,9 @@
/*
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
*/
+/*
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
#include "lint.h"
#include "thr_uberdata.h"
@@ -771,6 +774,7 @@ _thrp_exit()
}
lmutex_unlock(&udp->link_lock);
+ tmem_exit(); /* deallocate tmem allocations */
tsd_exit(); /* deallocate thread-specific data */
tls_exit(); /* deallocate thread-local storage */
heldlock_exit(); /* deal with left-over held locks */
diff --git a/usr/src/lib/libc/port/threads/tmem.c b/usr/src/lib/libc/port/threads/tmem.c
new file mode 100644
index 0000000000..00203de593
--- /dev/null
+++ b/usr/src/lib/libc/port/threads/tmem.c
@@ -0,0 +1,85 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ */
+
+#include "lint.h"
+#include "thr_uberdata.h"
+
+/*
+ * This file implements the private interface with libumem for per-thread
+ * caching umem (ptcumem). For the full details on how tcumem works and how
+ * these functions work, see section 8.4 of the big theory statement in
+ * lib/libumem/common/umem.c.
+ */
+static tmem_func_t tmem_cleanup = NULL;
+
+uintptr_t
+_tmem_get_base(void)
+{
+ return ((uintptr_t)&curthread->ul_tmem - (uintptr_t)curthread);
+}
+
+int
+_tmem_get_nentries(void)
+{
+ return (NTMEMBASE);
+}
+
+void
+_tmem_set_cleanup(tmem_func_t f)
+{
+ tmem_cleanup = f;
+}
+
+/*
+ * This is called by _thrp_exit() to clean up any per-thread allocations that
+ * are still hanging around and haven't been cleaned up.
+ */
+void
+tmem_exit(void)
+{
+ int ii;
+ void *buf, *next;
+ tumem_t *tp = &curthread->ul_tmem;
+
+
+ if (tp->tm_size == 0)
+ return;
+
+ /*
+ * Since we have something stored here, we need to ensure we declared a
+ * clean up handler. If we haven't that's broken and our single private
+ * consumer should be shot.
+ */
+ if (tmem_cleanup == NULL)
+ abort();
+ for (ii = 0; ii < NTMEMBASE; ii++) {
+ buf = tp->tm_roots[ii];
+ while (buf != NULL) {
+ next = *(void **)buf;
+ tmem_cleanup(buf, ii);
+ buf = next;
+ }
+ }
+}
diff --git a/usr/src/lib/libc/sparc/Makefile.com b/usr/src/lib/libc/sparc/Makefile.com
index cc6bae0df4..4840990414 100644
--- a/usr/src/lib/libc/sparc/Makefile.com
+++ b/usr/src/lib/libc/sparc/Makefile.com
@@ -21,6 +21,7 @@
#
# Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
+# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
@@ -875,6 +876,7 @@ THREADSOBJS= \
assfail.o \
cancel.o \
door_calls.o \
+ tmem.o \
pthr_attr.o \
pthr_barrier.o \
pthr_cond.o \
diff --git a/usr/src/lib/libc/sparc/crt/_rtld.c b/usr/src/lib/libc/sparc/crt/_rtld.c
index a9e9c6d98a..843cfe03a5 100644
--- a/usr/src/lib/libc/sparc/crt/_rtld.c
+++ b/usr/src/lib/libc/sparc/crt/_rtld.c
@@ -62,6 +62,15 @@
#define SYSCONFIG (*(funcs[SYSCONFIG_F]))
/*
+ * GCC will not emit unused static functions unless specifically told it must
+ */
+#ifdef __GNUC__
+#define __USED __attribute__((used))
+#else
+#define __USED
+#endif
+
+/*
* Alias ld.so entry point -- receives a bootstrap structure and a vector
* of strings. The vector is "well-known" to us, and consists of pointers
* to string constants. This aliasing bootstrap requires no relocation in
diff --git a/usr/src/lib/libc/sparcv9/Makefile.com b/usr/src/lib/libc/sparcv9/Makefile.com
index 54b3258fe9..669e06395c 100644
--- a/usr/src/lib/libc/sparcv9/Makefile.com
+++ b/usr/src/lib/libc/sparcv9/Makefile.com
@@ -21,6 +21,7 @@
#
# Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved.
+# Copyright (c) 2012, Joyent, Inc. All rights reserved.
#
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
# Use is subject to license terms.
@@ -822,6 +823,7 @@ THREADSOBJS= \
assfail.o \
cancel.o \
door_calls.o \
+ tmem.o \
pthr_attr.o \
pthr_barrier.o \
pthr_cond.o \