aboutsummaryrefslogtreecommitdiff
path: root/crypto
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2015-05-05 15:08:39 +0100
committerMatt Caswell <matt@openssl.org>2015-11-20 23:33:05 +0000
commit7070e5ca2fa41940d56599bf016a45cb1c0e03f0 (patch)
treea604a3525518f1cb3a232c4502072990b62053d0 /crypto
parent4cfa6204e8740a3e89b96fac3f1ac49d137e9dc9 (diff)
downloadopenssl-7070e5ca2fa41940d56599bf016a45cb1c0e03f0.zip
openssl-7070e5ca2fa41940d56599bf016a45cb1c0e03f0.tar.gz
openssl-7070e5ca2fa41940d56599bf016a45cb1c0e03f0.tar.bz2
Use longjmp at setjmp where possible
Where we can we should use longjmp and setjmp in preference to swapcontext/ setcontext as they seem to be more performant. Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/async/Makefile15
-rw-r--r--crypto/async/arch/async_posix.c1
-rw-r--r--crypto/async/arch/async_posix.h24
3 files changed, 28 insertions, 12 deletions
diff --git a/crypto/async/Makefile b/crypto/async/Makefile
index ec6f2b5..c09cb31 100644
--- a/crypto/async/Makefile
+++ b/crypto/async/Makefile
@@ -77,7 +77,7 @@ clean:
# DO NOT DELETE THIS LINE -- make depend depends on it.
-arch/async_posix.o: ../../include/openssl/async.h
+arch/async_posix.o: ../../e_os.h ../../include/openssl/async.h
arch/async_posix.o: ../../include/openssl/crypto.h
arch/async_posix.o: ../../include/openssl/e_os2.h
arch/async_posix.o: ../../include/openssl/opensslconf.h
@@ -90,9 +90,10 @@ arch/async_posix.o: arch/../arch/async_posix.h arch/../arch/async_win.h
arch/async_posix.o: arch/../async_locl.h arch/async_posix.c
arch/async_win.o: ../../include/openssl/async.h arch/async_win.c
arch/async_win.o: arch/async_win.h
-async.o: ../../include/openssl/async.h ../../include/openssl/crypto.h
-async.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h
-async.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
-async.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
-async.o: ../../include/openssl/symhacks.h arch/async_null.h arch/async_posix.h
-async.o: arch/async_win.h async.c async_locl.h
+async.o: ../../e_os.h ../../include/openssl/async.h
+async.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
+async.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
+async.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
+async.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
+async.o: arch/async_null.h arch/async_posix.h arch/async_win.h async.c
+async.o: async_locl.h
diff --git a/crypto/async/arch/async_posix.c b/crypto/async/arch/async_posix.c
index 1b21bcc..bb799e5 100644
--- a/crypto/async/arch/async_posix.c
+++ b/crypto/async/arch/async_posix.c
@@ -75,6 +75,7 @@ int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre)
fibre->fibre.uc_stack.ss_sp = stack;
fibre->fibre.uc_stack.ss_size = STACKSIZE;
fibre->fibre.uc_link = NULL;
+ fibre->env_init = 0;
return 1;
}
diff --git a/crypto/async/arch/async_posix.h b/crypto/async/arch/async_posix.h
index 373ad1b..43cea6d 100644
--- a/crypto/async/arch/async_posix.h
+++ b/crypto/async/arch/async_posix.h
@@ -62,20 +62,34 @@
# define ASYNC_ARCH
# include <ucontext.h>
+# include <setjmp.h>
+# include "e_os.h"
extern __thread ASYNC_CTX *sysvctx;
typedef struct async_fibre_st {
ucontext_t fibre;
+ jmp_buf env;
+ int env_init;
} ASYNC_FIBRE;
# define ASYNC_set_ctx(nctx) (sysvctx = (nctx))
# define ASYNC_get_ctx() (sysvctx)
-# define ASYNC_FIBRE_swapcontext(o,n,r) \
- ((r)? \
- !swapcontext(&(o)->fibre, &(n)->fibre) \
- : \
- !setcontext(&(n)->fibre))
+
+static inline int ASYNC_FIBRE_swapcontext(ASYNC_FIBRE *o, ASYNC_FIBRE *n, int r)
+{
+ o->env_init = 1;
+
+ if (!r || !setjmp(o->env)) {
+ if (n->env_init)
+ longjmp(n->env, 1);
+ else
+ setcontext(&n->fibre);
+ }
+
+ return 1;
+}
+
# define ASYNC_FIBRE_makecontext(c) \
(ASYNC_FIBRE_init(c) \
&& !getcontext(&(c)->fibre) \