diff options
author | Matt Caswell <matt@openssl.org> | 2015-05-05 15:08:39 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2015-11-20 23:33:05 +0000 |
commit | 7070e5ca2fa41940d56599bf016a45cb1c0e03f0 (patch) | |
tree | a604a3525518f1cb3a232c4502072990b62053d0 /crypto | |
parent | 4cfa6204e8740a3e89b96fac3f1ac49d137e9dc9 (diff) | |
download | openssl-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/Makefile | 15 | ||||
-rw-r--r-- | crypto/async/arch/async_posix.c | 1 | ||||
-rw-r--r-- | crypto/async/arch/async_posix.h | 24 |
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) \ |