From 7070e5ca2fa41940d56599bf016a45cb1c0e03f0 Mon Sep 17 00:00:00 2001 From: Matt Caswell Date: Tue, 5 May 2015 15:08:39 +0100 Subject: [PATCH] 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 --- crypto/async/Makefile | 15 ++++++++------- crypto/async/arch/async_posix.c | 1 + crypto/async/arch/async_posix.h | 24 +++++++++++++++++++----- util/libeay.num | 2 +- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/crypto/async/Makefile b/crypto/async/Makefile index ec6f2b5feb..c09cb31a79 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 1b21bcc345..bb799e54f8 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 373ad1b934..43cea6d9b0 100644 --- a/crypto/async/arch/async_posix.h +++ b/crypto/async/arch/async_posix.h @@ -62,20 +62,34 @@ # define ASYNC_ARCH # include +# include +# 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) \ diff --git a/util/libeay.num b/util/libeay.num index 48ffd7141e..8a6c4c528e 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -4651,6 +4651,6 @@ TS_RESP_CTX_set_signer_digest 5010 EXIST::FUNCTION: TS_CONF_set_signer_digest 5011 EXIST::FUNCTION: ENGINE_load_dasync 5012 EXIST::FUNCTION:ENGINE,STATIC_ENGINE ASYNC_pause_job 5013 EXIST::FUNCTION: -ASYNC_job_is_waiting 5014 EXIST::FUNCTION: +ASYNC_job_is_waiting 5014 NOEXIST::FUNCTION: ASYNC_in_job 5015 EXIST::FUNCTION: ASYNC_start_job 5016 EXIST::FUNCTION: -- 2.34.1