svn commit: r251365 - in stable/9: lib/libc/amd64/gen lib/libc/arm/gen lib/libc/gen lib/libc/i386/gen lib/libc/ia64/gen lib/libc/mips/gen lib/libc/powerpc/gen lib/libc/powerpc64/gen lib/libc/sparc6...
Konstantin Belousov
kib at FreeBSD.org
Tue Jun 4 05:07:06 UTC 2013
Author: kib
Date: Tue Jun 4 05:07:03 2013
New Revision: 251365
URL: http://svnweb.freebsd.org/changeset/base/251365
Log:
MFC r251047:
Avoid a nested frame for getcontext() call in check_deferred_signal().
Modified:
stable/9/lib/libc/amd64/gen/getcontextx.c
stable/9/lib/libc/arm/gen/getcontextx.c
stable/9/lib/libc/gen/Symbol.map
stable/9/lib/libc/i386/gen/getcontextx.c
stable/9/lib/libc/ia64/gen/getcontextx.c
stable/9/lib/libc/mips/gen/getcontextx.c
stable/9/lib/libc/powerpc/gen/getcontextx.c
stable/9/lib/libc/powerpc64/gen/getcontextx.c
stable/9/lib/libc/sparc64/gen/getcontextx.c
stable/9/lib/libthr/thread/thr_sig.c
stable/9/sys/sys/ucontext.h
Directory Properties:
stable/9/lib/libc/ (props changed)
stable/9/lib/libthr/ (props changed)
stable/9/sys/ (props changed)
stable/9/sys/sys/ (props changed)
Modified: stable/9/lib/libc/amd64/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/amd64/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/amd64/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -57,14 +57,12 @@ __getcontextx_size(void)
}
int
-__fillcontextx(char *ctx)
+__fillcontextx2(char *ctx)
{
struct amd64_get_xfpustate xfpu;
ucontext_t *ucp;
ucp = (ucontext_t *)ctx;
- if (getcontext(ucp) == -1)
- return (-1);
if (xstate_sz != 0) {
xfpu.addr = (char *)(ucp + 1);
xfpu.len = xstate_sz;
@@ -80,6 +78,18 @@ __fillcontextx(char *ctx)
return (0);
}
+int
+__fillcontextx(char *ctx)
+{
+ ucontext_t *ucp;
+
+ ucp = (ucontext_t *)ctx;
+ if (getcontext(ucp) == -1)
+ return (-1);
+ __fillcontextx2(ctx);
+ return (0);
+}
+
__weak_reference(__getcontextx, getcontextx);
ucontext_t *
Modified: stable/9/lib/libc/arm/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/arm/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/arm/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -40,6 +40,13 @@ __getcontextx_size(void)
}
int
+__fillcontextx2(char *ctx)
+{
+
+ return (0);
+}
+
+int
__fillcontextx(char *ctx)
{
ucontext_t *ucp;
Modified: stable/9/lib/libc/gen/Symbol.map
==============================================================================
--- stable/9/lib/libc/gen/Symbol.map Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/gen/Symbol.map Tue Jun 4 05:07:03 2013 (r251365)
@@ -526,5 +526,6 @@ FBSDprivate_1.0 {
__elf_aux_vector;
__pthread_map_stacks_exec;
__fillcontextx;
+ __fillcontextx2;
__getcontextx_size;
};
Modified: stable/9/lib/libc/i386/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/i386/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/i386/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -89,14 +89,12 @@ __getcontextx_size(void)
}
int
-__fillcontextx(char *ctx)
+__fillcontextx2(char *ctx)
{
struct i386_get_xfpustate xfpu;
ucontext_t *ucp;
ucp = (ucontext_t *)ctx;
- if (getcontext(ucp) == -1)
- return (-1);
if (xstate_sz != 0) {
xfpu.addr = (char *)(ucp + 1);
xfpu.len = xstate_sz;
@@ -112,6 +110,18 @@ __fillcontextx(char *ctx)
return (0);
}
+int
+__fillcontextx(char *ctx)
+{
+ ucontext_t *ucp;
+
+ ucp = (ucontext_t *)ctx;
+ if (getcontext(ucp) == -1)
+ return (-1);
+ __fillcontextx2(ctx);
+ return (0);
+}
+
__weak_reference(__getcontextx, getcontextx);
ucontext_t *
Modified: stable/9/lib/libc/ia64/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/ia64/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/ia64/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -40,6 +40,13 @@ __getcontextx_size(void)
}
int
+__fillcontextx2(char *ctx)
+{
+
+ return (0);
+}
+
+int
__fillcontextx(char *ctx)
{
ucontext_t *ucp;
Modified: stable/9/lib/libc/mips/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/mips/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/mips/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -40,6 +40,13 @@ __getcontextx_size(void)
}
int
+__fillcontextx2(char *ctx)
+{
+
+ return (0);
+}
+
+int
__fillcontextx(char *ctx)
{
ucontext_t *ucp;
Modified: stable/9/lib/libc/powerpc/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/powerpc/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/powerpc/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -40,6 +40,13 @@ __getcontextx_size(void)
}
int
+__fillcontextx2(char *ctx)
+{
+
+ return (0);
+}
+
+int
__fillcontextx(char *ctx)
{
ucontext_t *ucp;
Modified: stable/9/lib/libc/powerpc64/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/powerpc64/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/powerpc64/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -40,6 +40,13 @@ __getcontextx_size(void)
}
int
+__fillcontextx2(char *ctx)
+{
+
+ return (0);
+}
+
+int
__fillcontextx(char *ctx)
{
ucontext_t *ucp;
Modified: stable/9/lib/libc/sparc64/gen/getcontextx.c
==============================================================================
--- stable/9/lib/libc/sparc64/gen/getcontextx.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libc/sparc64/gen/getcontextx.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -40,6 +40,13 @@ __getcontextx_size(void)
}
int
+__fillcontextx2(char *ctx)
+{
+
+ return (0);
+}
+
+int
__fillcontextx(char *ctx)
{
ucontext_t *ucp;
Modified: stable/9/lib/libthr/thread/thr_sig.c
==============================================================================
--- stable/9/lib/libthr/thread/thr_sig.c Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/lib/libthr/thread/thr_sig.c Tue Jun 4 05:07:03 2013 (r251365)
@@ -323,8 +323,13 @@ check_deferred_signal(struct pthread *cu
return;
#if defined(__amd64__) || defined(__i386__)
- uc = alloca(__getcontextx_size());
- __fillcontextx((char *)uc);
+ int uc_len;
+ uc_len = __getcontextx_size();
+ uc = alloca(uc_len);
+ getcontext(uc);
+ if (curthread->deferred_siginfo.si_signo == 0)
+ return;
+ __fillcontextx2((char *)uc);
#else
ucontext_t ucv;
uc = &ucv;
Modified: stable/9/sys/sys/ucontext.h
==============================================================================
--- stable/9/sys/sys/ucontext.h Tue Jun 4 03:47:21 2013 (r251364)
+++ stable/9/sys/sys/ucontext.h Tue Jun 4 05:07:03 2013 (r251365)
@@ -80,7 +80,8 @@ int swapcontext(ucontext_t *, const ucon
#if __BSD_VISIBLE
int __getcontextx_size(void);
-int __fillcontextx(char *ctx);
+int __fillcontextx(char *ctx) __returns_twice;
+int __fillcontextx2(char *ctx);
#endif
__END_DECLS
More information about the svn-src-stable-9
mailing list