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