1 /* 2 * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #ifndef OPENSSL_ASYNC_ARCH_ASYNC_POSIX_H 11 #define OPENSSL_ASYNC_ARCH_ASYNC_POSIX_H 12 #include <openssl/e_os2.h> 13 14 #if defined(OPENSSL_SYS_UNIX) \ 15 && defined(OPENSSL_THREADS) && !defined(OPENSSL_NO_ASYNC) \ 16 && !defined(__ANDROID__) && !defined(__OpenBSD__) 17 18 # include <unistd.h> 19 20 # if _POSIX_VERSION >= 200112L 21 22 # include <pthread.h> 23 24 # define ASYNC_POSIX 25 # define ASYNC_ARCH 26 27 # include <ucontext.h> 28 # include <setjmp.h> 29 30 typedef struct async_fibre_st { 31 ucontext_t fibre; 32 jmp_buf env; 33 int env_init; 34 } async_fibre; 35 36 static ossl_inline int async_fibre_swapcontext(async_fibre *o, async_fibre *n, int r) 37 { 38 o->env_init = 1; 39 40 if (!r || !_setjmp(o->env)) { 41 if (n->env_init) 42 _longjmp(n->env, 1); 43 else 44 setcontext(&n->fibre); 45 } 46 47 return 1; 48 } 49 50 # define async_fibre_init_dispatcher(d) 51 52 int async_fibre_makecontext(async_fibre *fibre); 53 void async_fibre_free(async_fibre *fibre); 54 55 # endif 56 #endif 57 #endif /* OPENSSL_ASYNC_ARCH_ASYNC_POSIX_H */ 58