Преглед изворни кода

Refactor HAVE_PTHREAD and _POSIX_THREADS (#6536)

* HAVE_PTHREAD gate in test.h
* add config.h and settings.h to test.h
* added config.h and settings.h to other test.h in wolfcrypt/test
* settings #ifdef _POSIX_THREADS HAVE_PTHREAD
* cyassl settings _POSIX_THREADS HAVE_PTHREAD
* undo cyassl _POSIX_THREADS HAVE_PTHREAD
* move settings.h #include in both test.h
* add !defined(SINGLE_THREADED) logic
* refactor  HAVE_PTHREAD, _POSIX_THREADS
gojimmypi пре 11 месеци
родитељ
комит
6b240fa41a

+ 11 - 2
examples/benchmark/tls_bench.c

@@ -66,8 +66,17 @@ Or
 #endif
 
 /* PTHREAD requires server and client enabled */
-#if defined(HAVE_PTHREAD) && (defined(NO_WOLFSSL_CLIENT) || defined(NO_WOLFSSL_SERVER))
-    #undef HAVE_PTHREAD
+#if defined(NO_WOLFSSL_CLIENT) || defined(NO_WOLFSSL_SERVER)
+    #if defined(HAVE_PTHREAD)
+        #ifdef __GNUC__  /* GCC compiler */
+            #pragma message "PTHREAD requires server and client enabled."
+        #elif defined(_MSC_VER) /* Microsoft Visual C++ compiler */
+            #pragma message("PTHREAD requires server and client enabled.")
+        #else
+            #warning "PTHREAD requires server and client enabled."
+        #endif
+        #undef HAVE_PTHREAD
+    #endif
 #endif
 
 #ifdef HAVE_PTHREAD

+ 4 - 4
examples/client/client.c

@@ -1740,7 +1740,7 @@ static int client_srtp_test(WOLFSSL *ssl, func_args *args)
     size_t srtp_secret_length;
     byte *srtp_secret, *p;
     int ret;
-#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#ifdef HAVE_PTHREAD
     srtp_test_helper *srtp_helper = args->srtp_helper;
     byte *other_secret = NULL;
     size_t other_size = 0;
@@ -1774,7 +1774,7 @@ static int client_srtp_test(WOLFSSL *ssl, func_args *args)
         printf("%02X", *p);
     printf("\n");
 
-#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#ifdef HAVE_PTHREAD
     if (srtp_helper != NULL) {
         srtp_helper_get_ekm(srtp_helper, &other_secret, &other_size);
 
@@ -1790,7 +1790,7 @@ static int client_srtp_test(WOLFSSL *ssl, func_args *args)
         /* we are delegated from server to free this buffer  */
         XFREE(other_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     }
-#endif
+#endif /* HAVE_PTHREAD */
 
     XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
 
@@ -4546,7 +4546,7 @@ exit:
 
         StartTCP();
 
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
         args.srtp_helper = NULL;
 #endif
         args.argc = argc;

+ 2 - 2
examples/echoserver/echoserver.c

@@ -67,7 +67,7 @@
 
 static void SignalReady(void* args, word16 port)
 {
-#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && !defined(__MINGW32__)
+#if defined(NO_MAIN_DRIVER) && defined(HAVE_PTHREAD)
     /* signal ready to tcp_accept */
     func_args* server_args = (func_args*)args;
     tcp_ready* ready = server_args->signal;
@@ -76,7 +76,7 @@ static void SignalReady(void* args, word16 port)
     ready->port = port;
     PTHREAD_CHECK_RET(pthread_cond_signal(&ready->cond));
     PTHREAD_CHECK_RET(pthread_mutex_unlock(&ready->mutex));
-#endif
+#endif /* NO_MAIN_DRIVER && HAVE_PTHREAD */
     (void)args;
     (void)port;
 }

+ 4 - 4
examples/server/server.c

@@ -1319,7 +1319,7 @@ static int server_srtp_test(WOLFSSL *ssl, func_args *args)
     size_t srtp_secret_length;
     byte *srtp_secret, *p;
     int ret;
-#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#ifdef HAVE_PTHREAD
     srtp_test_helper *srtp_helper = args->srtp_helper;
 #else
     (void)args;
@@ -1351,7 +1351,7 @@ static int server_srtp_test(WOLFSSL *ssl, func_args *args)
         printf("%02X", *p);
     printf("\n");
 
-#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#ifdef HAVE_PTHREAD
     if (srtp_helper != NULL) {
         srtp_helper_set_ekm(srtp_helper, srtp_secret, srtp_secret_length);
 
@@ -1359,7 +1359,7 @@ static int server_srtp_test(WOLFSSL *ssl, func_args *args)
            correctness */
         return 0;
     }
-#endif /* _POSIX_THREADS */
+#endif /* HAVE_PTHREAD */
 
     XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     return 0;
@@ -3807,7 +3807,7 @@ exit:
         args.argv = argv;
         args.signal = &ready;
         args.return_code = 0;
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
         args.srtp_helper = NULL;
 #endif
         InitTcpReady(&ready);

+ 3 - 3
tests/suites.c

@@ -329,7 +329,7 @@ static int execute_test_case(int svr_argc, char** svr_argv,
     int         reqClientCert;
 #endif
 
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
     srtp_test_helper srtp_helper;
 #endif
     /* Is Valid Cipher and Version Checks */
@@ -460,7 +460,7 @@ static int execute_test_case(int svr_argc, char** svr_argv,
 
     InitTcpReady(&ready);
 
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
     srtp_helper_init(&srtp_helper);
     cliArgs.srtp_helper = &srtp_helper;
     svrArgs.srtp_helper = &srtp_helper;
@@ -580,7 +580,7 @@ static int execute_test_case(int svr_argc, char** svr_argv,
 #endif
     FreeTcpReady(&ready);
 
-#if defined (WOLFSSL_SRTP) &&!defined(SINGLE_THREADED) &&  defined(_POSIX_THREADS)
+#if defined (WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
     srtp_helper_free(&srtp_helper);
 #endif
 

+ 7 - 7
tests/unit.c

@@ -275,9 +275,7 @@ exit:
 
 void wait_tcp_ready(func_args* args)
 {
-#ifdef SINGLE_THREADED
-    (void)args;
-#elif defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#ifdef HAVE_PTHREAD
     PTHREAD_CHECK_RET(pthread_mutex_lock(&args->signal->mutex));
 
     if (!args->signal->ready)
@@ -287,6 +285,7 @@ void wait_tcp_ready(func_args* args)
 
     PTHREAD_CHECK_RET(pthread_mutex_unlock(&args->signal->mutex));
 #else
+    /* no threading wait or single threaded */
     (void)args;
 #endif
 }
@@ -294,11 +293,11 @@ void wait_tcp_ready(func_args* args)
 
 void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
 {
-#ifdef SINGLE_THREADED
+#if defined(SINGLE_THREADED)
     (void)fun;
     (void)args;
     (void)thread;
-#elif defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#elif defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_create(thread, 0, fun, args));
     return;
 #elif defined (WOLFSSL_TIRTOS)
@@ -313,6 +312,7 @@ void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
     }
     Task_yield();
 #else
+    /* custom / external thread type */
     *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0);
 #endif
 }
@@ -320,9 +320,9 @@ void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
 
 void join_thread(THREAD_TYPE thread)
 {
-#ifdef SINGLE_THREADED
+#if defined(SINGLE_THREADED)
     (void)thread;
-#elif defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#elif defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_join(thread, 0));
 #elif defined (WOLFSSL_TIRTOS)
     while(1) {

+ 7 - 6
testsuite/testsuite.c

@@ -431,7 +431,7 @@ static void simple_test(func_args* args)
  */
 void wait_tcp_ready(func_args* args)
 {
-#if defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#if defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_mutex_lock(&args->signal->mutex));
 
     if (!args->signal->ready)
@@ -459,7 +459,7 @@ void wait_tcp_ready(func_args* args)
     (void)args;
 #else
     (void)args;
-#endif
+#endif /* thread checks */
 }
 
 
@@ -471,7 +471,7 @@ void wait_tcp_ready(func_args* args)
  */
 void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
 {
-#if defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#if defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_create(thread, 0, fun, args));
     return;
 #elif defined(WOLFSSL_TIRTOS)
@@ -527,10 +527,11 @@ void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
     {
         printf("Ethernet Bypass Application: failed to create idle thread!\n");
     }
-
+    /* end if NETOS */
 #else
+    /* custom / external thread type */
     *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0);
-#endif
+#endif /* thread types */
 }
 
 
@@ -540,7 +541,7 @@ void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread)
  */
 void join_thread(THREAD_TYPE thread)
 {
-#if defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#if defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_join(thread, 0));
 #elif defined(WOLFSSL_TIRTOS)
     while(1) {

+ 2 - 3
wolfcrypt/src/random.c

@@ -874,8 +874,7 @@ static WC_INLINE word64 Entropy_TimeHiRes(void)
 
     return now.tv_nsec;
 }
-#elif !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) && \
-      !defined(__MINGW32__)
+#elif defined(HAVE_PTHREAD)
 
 /* Start and stop thread that counts as a proxy for time counter. */
 #define ENTROPY_MEMUSE_THREADED
@@ -983,7 +982,7 @@ static void Entropy_StopThread(void)
         entropy_thread_started = 0;
     }
 }
-
+    /* end if defined(HAVE_PTHREAD) */
 #else
 
 #error "No high precision time available for MemUse Entropy."

+ 5 - 0
wolfcrypt/test/test.h

@@ -35,6 +35,11 @@
     typedef sword32 wc_test_ret_t;
 #endif
 
+#ifdef HAVE_CONFIG_H
+    #include <config.h>
+#endif
+#include <wolfssl/wolfcrypt/settings.h>
+
 #ifdef HAVE_STACK_SIZE
 THREAD_RETURN WOLFSSL_THREAD wolfcrypt_test(void* args);
 #else

+ 19 - 13
wolfssl/test.h

@@ -28,6 +28,11 @@
 #ifndef wolfSSL_TEST_H
 #define wolfSSL_TEST_H
 
+#ifdef HAVE_CONFIG_H
+    #include <config.h>
+#endif
+#include <wolfssl/wolfcrypt/settings.h>
+
 #ifdef FUSION_RTOS
     #include <fclstdio.h>
     #include <fclstdlib.h>
@@ -182,7 +187,9 @@
     #include <sys/ioctl.h>
     #include <sys/time.h>
     #include <sys/socket.h>
-    #include <pthread.h>
+    #ifdef HAVE_PTHREAD
+        #include <pthread.h>
+    #endif
     #include <fcntl.h>
     #ifdef TEST_IPV6
         #include <netdb.h>
@@ -529,7 +536,7 @@ typedef struct tcp_ready {
     word16 ready;              /* predicate */
     word16 port;
     char*  srfName;     /* server ready file name */
-#if defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#ifdef HAVE_PTHREAD
     pthread_mutex_t mutex;
     pthread_cond_t  cond;
 #endif
@@ -543,12 +550,13 @@ static WC_INLINE void InitTcpReady(tcp_ready* ready)
     ready->ready = 0;
     ready->port = 0;
     ready->srfName = NULL;
-#ifdef SINGLE_THREADED
-#elif defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#if defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_mutex_init(&ready->mutex, 0));
     PTHREAD_CHECK_RET(pthread_cond_init(&ready->cond, 0));
 #elif defined(NETOS)
     tx_mutex_create(&ready->mutex, "wolfSSL Lock", TX_INHERIT);
+#else
+    /* no threading init or single threaded */
 #endif
 }
 
@@ -558,9 +566,7 @@ static WC_INLINE void InitTcpReady(tcp_ready* ready)
 
 static WC_INLINE void FreeTcpReady(tcp_ready* ready)
 {
-#ifdef SINGLE_THREADED
-    (void)ready;
-#elif defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#if defined(HAVE_PTHREAD)
     PTHREAD_CHECK_RET(pthread_mutex_destroy(&ready->mutex));
     PTHREAD_CHECK_RET(pthread_cond_destroy(&ready->cond));
 #elif defined(NETOS)
@@ -599,14 +605,14 @@ typedef struct callback_functions {
     unsigned char doUdp:1;
 } callback_functions;
 
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
 typedef struct srtp_test_helper {
     pthread_mutex_t mutex;
     pthread_cond_t  cond;
     uint8_t* server_srtp_ekm;
     size_t   server_srtp_ekm_size;
 } srtp_test_helper;
-#endif
+#endif /* WOLFSSL_SRTP HAVE_PTHREAD */
 
 typedef struct func_args {
     int    argc;
@@ -614,7 +620,7 @@ typedef struct func_args {
     int    return_code;
     tcp_ready* signal;
     callback_functions *callbacks;
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
     srtp_test_helper* srtp_helper;
 #endif
 } func_args;
@@ -655,7 +661,7 @@ static const word16      wolfSSLPort = 11111;
 extern int   myoptind;
 extern char* myoptarg;
 
-#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS)
+#if defined(WOLFSSL_SRTP) && defined(HAVE_PTHREAD)
 
 static WC_INLINE void srtp_helper_init(srtp_test_helper *srtp)
 {
@@ -2201,7 +2207,7 @@ static WC_INLINE void udp_accept(SOCKET_T* sockfd, SOCKET_T* clientfd,
     #endif
 
     if (args != NULL && args->signal != NULL) {
-#if defined(_POSIX_THREADS) && !defined(__MINGW32__)
+#if defined(HAVE_PTHREAD)
         /* signal ready to accept data */
         tcp_ready* ready = args->signal;
         PTHREAD_CHECK_RET(pthread_mutex_lock(&ready->mutex));
@@ -2248,7 +2254,7 @@ static WC_INLINE void tcp_accept(SOCKET_T* sockfd, SOCKET_T* clientfd,
     if(do_listen) {
         tcp_listen(sockfd, &port, useAnyAddr, udp, sctp);
 
-    #if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && !defined(__MINGW32__)
+    #if defined(NO_MAIN_DRIVER) && defined(HAVE_PTHREAD)
         /* signal ready to tcp_accept */
         if (args)
             ready = args->signal;

+ 17 - 0
wolfssl/wolfcrypt/settings.h

@@ -275,6 +275,23 @@
 
 #include <wolfssl/wolfcrypt/visibility.h>
 
+/* AFTER user_settings.h is loaded,
+** determine if POSIX multi-threaded: HAVE_PTHREAD  */
+#if defined(SINGLE_THREADED) || defined(__MINGW32__)
+    /* Never HAVE_PTHREAD in single thread, or non-POSIX mode.
+    ** Reminder: MING32 is win32 threads, not POSIX threads */
+    #undef HAVE_PTHREAD
+#else
+    #ifdef _POSIX_THREADS
+        /* HAVE_PTHREAD == POSIX threads capable and enabled. */
+        #undef HAVE_PTHREAD
+        #define HAVE_PTHREAD 1
+    #else
+        /* Not manually disabled, but POSIX threads not found. */
+        #undef HAVE_PTHREAD
+    #endif
+#endif
+
 #define WOLFSSL_MAKE_FIPS_VERSION(major, minor) (((major) * 256) + (minor))
 #if !defined(HAVE_FIPS)
     #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION(0,0)

+ 4 - 2
wolfssl/wolfcrypt/types.h

@@ -31,6 +31,9 @@ decouple library dependencies with standard string, memory and so on.
 #ifndef WOLF_CRYPT_TYPES_H
 #define WOLF_CRYPT_TYPES_H
 
+    #ifdef HAVE_CONFIG_H
+        #include <config.h>
+    #endif
     #include <wolfssl/wolfcrypt/settings.h>
     #include <wolfssl/wolfcrypt/wc_port.h>
 
@@ -1351,8 +1354,7 @@ typedef struct w64wrapper {
         typedef unsigned int  THREAD_RETURN;
         typedef size_t        THREAD_TYPE;
         #define WOLFSSL_THREAD
-    #elif (defined(_POSIX_THREADS) || defined(HAVE_PTHREAD)) && \
-        !defined(__MINGW32__)
+    #elif defined(HAVE_PTHREAD)
         typedef void*         THREAD_RETURN;
         typedef pthread_t     THREAD_TYPE;
         #define WOLFSSL_THREAD