1 /* 2 * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (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 fibre->env_init = 0; 38 if (getcontext(&fibre->fibre) == 0) { 39 fibre->fibre.uc_stack.ss_sp = OPENSSL_malloc(STACKSIZE); 40 if (fibre->fibre.uc_stack.ss_sp != NULL) { 41 fibre->fibre.uc_stack.ss_size = STACKSIZE; 42 fibre->fibre.uc_link = NULL; 43 makecontext(&fibre->fibre, async_start_func, 0); 44 return 1; 45 } 46 } else { 47 fibre->fibre.uc_stack.ss_sp = NULL; 48 } 49 return 0; 50 } 51 async_fibre_free(async_fibre * fibre)52void async_fibre_free(async_fibre *fibre) 53 { 54 OPENSSL_free(fibre->fibre.uc_stack.ss_sp); 55 fibre->fibre.uc_stack.ss_sp = NULL; 56 } 57 58 #endif 59