• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (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 /* This must be the first #include file */
11 #include "../async_local.h"
12 
13 #ifdef ASYNC_POSIX
14 
15 # include <stddef.h>
16 # include <unistd.h>
17 
18 #define STACKSIZE       32768
19 
ASYNC_is_capable(void)20 int ASYNC_is_capable(void)
21 {
22     ucontext_t ctx;
23 
24     /*
25      * Some platforms provide getcontext() but it does not work (notably
26      * MacOSX PPC64). Check for a working getcontext();
27      */
28     return getcontext(&ctx) == 0;
29 }
30 
async_local_cleanup(void)31 void async_local_cleanup(void)
32 {
33 }
34 
async_fibre_makecontext(async_fibre * fibre)35 int async_fibre_makecontext(async_fibre *fibre)
36 {
37 #ifndef USE_SWAPCONTEXT
38     fibre->env_init = 0;
39 #endif
40     if (getcontext(&fibre->fibre) == 0) {
41         fibre->fibre.uc_stack.ss_sp = OPENSSL_malloc(STACKSIZE);
42         if (fibre->fibre.uc_stack.ss_sp != NULL) {
43             fibre->fibre.uc_stack.ss_size = STACKSIZE;
44             fibre->fibre.uc_link = NULL;
45             makecontext(&fibre->fibre, async_start_func, 0);
46             return 1;
47         }
48     } else {
49         fibre->fibre.uc_stack.ss_sp = NULL;
50     }
51     return 0;
52 }
53 
async_fibre_free(async_fibre * fibre)54 void async_fibre_free(async_fibre *fibre)
55 {
56     OPENSSL_free(fibre->fibre.uc_stack.ss_sp);
57     fibre->fibre.uc_stack.ss_sp = NULL;
58 }
59 
60 #endif
61