1 /* 2 * Copyright 2015-2021 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_WIN 14 15 # include <windows.h> 16 # include "internal/cryptlib.h" 17 ASYNC_is_capable(void)18int ASYNC_is_capable(void) 19 { 20 return 1; 21 } 22 async_local_cleanup(void)23void async_local_cleanup(void) 24 { 25 async_ctx *ctx = async_get_ctx(); 26 if (ctx != NULL) { 27 async_fibre *fibre = &ctx->dispatcher; 28 if (fibre != NULL && fibre->fibre != NULL && fibre->converted) { 29 ConvertFiberToThread(); 30 fibre->fibre = NULL; 31 } 32 } 33 } 34 async_fibre_init_dispatcher(async_fibre * fibre)35int async_fibre_init_dispatcher(async_fibre *fibre) 36 { 37 # if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x600 38 fibre->fibre = ConvertThreadToFiberEx(NULL, FIBER_FLAG_FLOAT_SWITCH); 39 # else 40 fibre->fibre = ConvertThreadToFiber(NULL); 41 # endif 42 if (fibre->fibre == NULL) { 43 fibre->converted = 0; 44 fibre->fibre = GetCurrentFiber(); 45 if (fibre->fibre == NULL) 46 return 0; 47 } else { 48 fibre->converted = 1; 49 } 50 51 return 1; 52 } 53 async_start_func_win(PVOID unused)54VOID CALLBACK async_start_func_win(PVOID unused) 55 { 56 async_start_func(); 57 } 58 59 #endif 60