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)20int 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)31void async_local_cleanup(void) 32 { 33 } 34 async_fibre_makecontext(async_fibre * fibre)35int 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)54void 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