/** * \file threading_helpers.h * * \brief This file contains the prototypes of helper functions for the purpose * of testing threading. */ /* * Copyright The Mbed TLS Contributors * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ #ifndef THREADING_HELPERS_H #define THREADING_HELPERS_H #if defined MBEDTLS_THREADING_C #include "mbedtls/private_access.h" #include "mbedtls/build_info.h" /* Most fields of publicly available structs are private and are wrapped with * MBEDTLS_PRIVATE macro. This define allows tests to access the private fields * directly (without using the MBEDTLS_PRIVATE wrapper). */ #define MBEDTLS_ALLOW_PRIVATE_ACCESS #define MBEDTLS_ERR_THREADING_THREAD_ERROR -0x001F #if defined(MBEDTLS_THREADING_PTHREAD) #include #endif /* MBEDTLS_THREADING_PTHREAD */ #if defined(MBEDTLS_THREADING_ALT) /* You should define the mbedtls_test_thread_t type in your header */ #include "threading_alt.h" /** * \brief Set your alternate threading implementation * function pointers for test threads. If used, this * function must be called once in the main thread * before any other MbedTLS function is called. * * \note These functions are part of the testing API only and * thus not considered part of the public API of * MbedTLS and thus may change without notice. * * \param thread_create The thread create function implementation. * \param thread_join The thread join function implementation. */ void mbedtls_test_thread_set_alt(int (*thread_create)(mbedtls_test_thread_t *thread, void *(*thread_func)( void *), void *thread_data), int (*thread_join)(mbedtls_test_thread_t *thread)); #else /* MBEDTLS_THREADING_ALT*/ typedef struct mbedtls_test_thread_t { #if defined(MBEDTLS_THREADING_PTHREAD) pthread_t MBEDTLS_PRIVATE(thread); #else /* MBEDTLS_THREADING_PTHREAD */ /* Make sure this struct is always non-empty */ unsigned dummy; #endif } mbedtls_test_thread_t; #endif /* MBEDTLS_THREADING_ALT*/ /** * \brief The function pointers for thread create and thread * join. * * \note These functions are part of the testing API only * and thus not considered part of the public API of * MbedTLS and thus may change without notice. * * \note All these functions are expected to work or * the result will be undefined. */ extern int (*mbedtls_test_thread_create)(mbedtls_test_thread_t *thread, void *(*thread_func)(void *), void *thread_data); extern int (*mbedtls_test_thread_join)(mbedtls_test_thread_t *thread); #if defined(MBEDTLS_THREADING_PTHREAD) && defined(MBEDTLS_TEST_HOOKS) #define MBEDTLS_TEST_MUTEX_USAGE #endif #if defined(MBEDTLS_TEST_MUTEX_USAGE) /** * Activate the mutex usage verification framework. See threading_helpers.c for * information. */ void mbedtls_test_mutex_usage_init(void); /** * Deactivate the mutex usage verification framework. See threading_helpers.c * for information. */ void mbedtls_test_mutex_usage_end(void); /** * Call this function after executing a test case to check for mutex usage * errors. */ void mbedtls_test_mutex_usage_check(void); #endif /* MBEDTLS_TEST_MUTEX_USAGE */ #endif /* MBEDTLS_THREADING_C */ #endif /* THREADING_HELPERS_H */