1 /**
2  * \file threading_helpers.h
3  *
4  * \brief This file contains the prototypes of helper functions for the purpose
5  *        of testing threading.
6  */
7 
8 /*
9  *  Copyright The Mbed TLS Contributors
10  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
11  */
12 
13 #ifndef THREADING_HELPERS_H
14 #define THREADING_HELPERS_H
15 
16 #if defined MBEDTLS_THREADING_C
17 
18 #include "mbedtls/private_access.h"
19 #include "mbedtls/build_info.h"
20 
21 /* Most fields of publicly available structs are private and are wrapped with
22  * MBEDTLS_PRIVATE macro. This define allows tests to access the private fields
23  * directly (without using the MBEDTLS_PRIVATE wrapper). */
24 #define MBEDTLS_ALLOW_PRIVATE_ACCESS
25 
26 #define MBEDTLS_ERR_THREADING_THREAD_ERROR                 -0x001F
27 
28 #if defined(MBEDTLS_THREADING_PTHREAD)
29 #include <pthread.h>
30 #endif /* MBEDTLS_THREADING_PTHREAD */
31 
32 #if defined(MBEDTLS_THREADING_ALT)
33 /* You should define the mbedtls_test_thread_t type in your header */
34 #include "threading_alt.h"
35 
36 /**
37  * \brief                   Set your alternate threading implementation
38  *                          function pointers for test threads. If used, this
39  *                          function must be called once in the main thread
40  *                          before any other MbedTLS function is called.
41  *
42  * \note                    These functions are part of the testing API only and
43  *                          thus not considered part of the public API of
44  *                          MbedTLS and thus may change without notice.
45  *
46  * \param thread_create     The thread create function implementation.
47  * \param thread_join       The thread join function implementation.
48 
49  */
50 void mbedtls_test_thread_set_alt(int (*thread_create)(mbedtls_test_thread_t *thread,
51                                                       void *(*thread_func)(
52                                                           void *),
53                                                       void *thread_data),
54                                  int (*thread_join)(mbedtls_test_thread_t *thread));
55 
56 #else /* MBEDTLS_THREADING_ALT*/
57 
58 typedef struct mbedtls_test_thread_t {
59 
60 #if defined(MBEDTLS_THREADING_PTHREAD)
61     pthread_t MBEDTLS_PRIVATE(thread);
62 #else /* MBEDTLS_THREADING_PTHREAD */
63     /* Make sure this struct is always non-empty */
64     unsigned dummy;
65 #endif
66 
67 } mbedtls_test_thread_t;
68 
69 #endif /* MBEDTLS_THREADING_ALT*/
70 
71 /**
72  * \brief                   The function pointers for thread create and thread
73  *                          join.
74  *
75  * \note                    These functions are part of the testing API only
76  *                          and thus not considered part of the public API of
77  *                          MbedTLS and thus may change without notice.
78  *
79  * \note                    All these functions are expected to work or
80  *                          the result will be undefined.
81  */
82 extern int (*mbedtls_test_thread_create)(mbedtls_test_thread_t *thread,
83                                          void *(*thread_func)(void *), void *thread_data);
84 extern int (*mbedtls_test_thread_join)(mbedtls_test_thread_t *thread);
85 
86 #if defined(MBEDTLS_THREADING_PTHREAD) && defined(MBEDTLS_TEST_HOOKS)
87 #define MBEDTLS_TEST_MUTEX_USAGE
88 #endif
89 
90 #if defined(MBEDTLS_TEST_MUTEX_USAGE)
91 /**
92  *  Activate the mutex usage verification framework. See threading_helpers.c for
93  *  information.
94  */
95 void mbedtls_test_mutex_usage_init(void);
96 
97 /**
98  *  Deactivate the mutex usage verification framework. See threading_helpers.c
99  *  for information.
100  */
101 void mbedtls_test_mutex_usage_end(void);
102 
103 /**
104  *  Call this function after executing a test case to check for mutex usage
105  * errors.
106  */
107 void mbedtls_test_mutex_usage_check(void);
108 #endif /* MBEDTLS_TEST_MUTEX_USAGE */
109 
110 #endif /* MBEDTLS_THREADING_C */
111 
112 #endif /* THREADING_HELPERS_H */
113