xref: /freebsd-src/crypto/openssl/crypto/async/arch/async_posix.h (revision c9cf7b5cb1693e44f8caa63f47bbb9ae85508687)
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