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