|  | /* | 
|  | * Copyright 2021 The OpenSSL Project Authors. All Rights Reserved. | 
|  | * | 
|  | * Licensed under the Apache License 2.0 (the "License").  You may not use | 
|  | * this file except in compliance with the License.  You can obtain a copy | 
|  | * in the file LICENSE in the source distribution or at | 
|  | * https://www.openssl.org/source/license.html | 
|  | */ | 
|  |  | 
|  | #if defined(_WIN32) | 
|  | # include <windows.h> | 
|  | #endif | 
|  |  | 
|  | #include <string.h> | 
|  | #include "testutil.h" | 
|  |  | 
|  | #if !defined(OPENSSL_THREADS) || defined(CRYPTO_TDEBUG) | 
|  |  | 
|  | typedef unsigned int thread_t; | 
|  |  | 
|  | static int run_thread(thread_t *t, void (*f)(void)) | 
|  | { | 
|  | f(); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | static int wait_for_thread(thread_t thread) | 
|  | { | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | #elif defined(OPENSSL_SYS_WINDOWS) | 
|  |  | 
|  | typedef HANDLE thread_t; | 
|  |  | 
|  | static DWORD WINAPI thread_run(LPVOID arg) | 
|  | { | 
|  | void (*f)(void); | 
|  |  | 
|  | *(void **) (&f) = arg; | 
|  |  | 
|  | f(); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static int run_thread(thread_t *t, void (*f)(void)) | 
|  | { | 
|  | *t = CreateThread(NULL, 0, thread_run, *(void **) &f, 0, NULL); | 
|  | return *t != NULL; | 
|  | } | 
|  |  | 
|  | static int wait_for_thread(thread_t thread) | 
|  | { | 
|  | return WaitForSingleObject(thread, INFINITE) == 0; | 
|  | } | 
|  |  | 
|  | #else | 
|  |  | 
|  | typedef pthread_t thread_t; | 
|  |  | 
|  | static void *thread_run(void *arg) | 
|  | { | 
|  | void (*f)(void); | 
|  |  | 
|  | *(void **) (&f) = arg; | 
|  |  | 
|  | f(); | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | static int run_thread(thread_t *t, void (*f)(void)) | 
|  | { | 
|  | return pthread_create(t, NULL, thread_run, *(void **) &f) == 0; | 
|  | } | 
|  |  | 
|  | static int wait_for_thread(thread_t thread) | 
|  | { | 
|  | return pthread_join(thread, NULL) == 0; | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  |