Implement pthreads threading

This commit is contained in:
Juliusz Sosinowicz
2023-05-24 11:53:57 +02:00
parent bff2cf5690
commit ca77da92e5
6 changed files with 110 additions and 13 deletions

View File

@ -291,7 +291,7 @@ void wait_tcp_ready(func_args* args)
} }
void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread) void start_thread(THREAD_CB fun, func_args* args, THREAD_TYPE* thread)
{ {
#if defined(SINGLE_THREADED) #if defined(SINGLE_THREADED)
(void)fun; (void)fun;

View File

@ -269,14 +269,14 @@ static int test_crl_monitor(void)
char buf[128]; char buf[128];
char tmpDir[16]; char tmpDir[16];
char rounds[4]; char rounds[4];
char* serverArgv[] = { const char* serverArgv[] = {
"testsuite", "testsuite",
"-A", "certs/ca-cert.pem", "-A", "certs/ca-cert.pem",
"--crl-dir", tmpDir, "--crl-dir", tmpDir,
"-C", rounds, "-C", rounds,
"-x" "-x"
}; };
char* clientArgv[] = { const char* clientArgv[] = {
"testsuite", "testsuite",
"-C", "-C",
"-c", "certs/server-cert.pem", "-c", "certs/server-cert.pem",
@ -297,10 +297,10 @@ static int test_crl_monitor(void)
goto cleanup; goto cleanup;
} }
server_args.argv = serverArgv; server_args.argv = (char**)serverArgv;
server_args.argc = sizeof(serverArgv) / sizeof(*serverArgv); server_args.argc = sizeof(serverArgv) / sizeof(*serverArgv);
client_args.signal = server_args.signal = &ready; client_args.signal = server_args.signal = &ready;
client_args.argv = clientArgv; client_args.argv = (char**)clientArgv;
client_args.argc = sizeof(clientArgv) / sizeof(*clientArgv); client_args.argc = sizeof(clientArgv) / sizeof(*clientArgv);
InitTcpReady(&ready); InitTcpReady(&ready);
@ -675,14 +675,18 @@ void join_thread(THREAD_TYPE thread)
#endif #endif
} }
#ifndef NO_FILESYSTEM
#ifdef _MSC_VER
#include <direct.h> #include <direct.h>
#endif
#define TMP_DIR_PREFIX "tmpDir-" #define TMP_DIR_PREFIX "tmpDir-"
/* len is length of tmpDir name, assuming /* len is length of tmpDir name, assuming
* len does not include null terminating character */ * len does not include null terminating character */
char* create_tmp_dir(char *tmpDir, int len) char* create_tmp_dir(char *tmpDir, int len)
{ {
if (len < XSTR_SIZEOF(TMP_DIR_PREFIX)) if (len < (int)XSTR_SIZEOF(TMP_DIR_PREFIX))
return NULL; return NULL;
XMEMCPY(tmpDir, TMP_DIR_PREFIX, XSTR_SIZEOF(TMP_DIR_PREFIX)); XMEMCPY(tmpDir, TMP_DIR_PREFIX, XSTR_SIZEOF(TMP_DIR_PREFIX));
@ -690,23 +694,38 @@ char* create_tmp_dir(char *tmpDir, int len)
if (mymktemp(tmpDir, len, len - XSTR_SIZEOF(TMP_DIR_PREFIX)) == NULL) if (mymktemp(tmpDir, len, len - XSTR_SIZEOF(TMP_DIR_PREFIX)) == NULL)
return NULL; return NULL;
#ifdef _MSC_VER
if (_mkdir(tmpDir) != 0) if (_mkdir(tmpDir) != 0)
return NULL; return NULL;
#else
if (mkdir(tmpDir, 0700) != 0)
return NULL;
#endif
return tmpDir; return tmpDir;
} }
int rem_dir(const char* dirName) int rem_dir(const char* dirName)
{ {
#ifdef _MSC_VER
if (_rmdir(dirName) != 0) if (_rmdir(dirName) != 0)
return -1; return -1;
#else
if (rmdir(dirName) != 0)
return -1;
#endif
return 0; return 0;
} }
int rem_file(const char* fileName) int rem_file(const char* fileName)
{ {
#ifdef _MSC_VER
if (_unlink(fileName) != 0) if (_unlink(fileName) != 0)
return -1; return -1;
#else
if (unlink(fileName) != 0)
return -1;
#endif
return 0; return 0;
} }
@ -743,6 +762,7 @@ cleanup:
XFCLOSE(outFile); XFCLOSE(outFile);
return ret; return ret;
} }
#endif /* !NO_FILESYSTEM */
#ifndef NO_SHA256 #ifndef NO_SHA256
/* Create SHA-256 hash of the file based on filename. /* Create SHA-256 hash of the file based on filename.

View File

@ -3374,16 +3374,19 @@ char* mystrnstr(const char* s1, const char* s2, unsigned int n)
int wolfSSL_JoinThread(THREAD_TYPE thread) int wolfSSL_JoinThread(THREAD_TYPE thread)
{ {
int ret = 0;
if (thread == INVALID_THREAD_VAL) if (thread == INVALID_THREAD_VAL)
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
/* We still want to attempt to close the thread handle even on error */
if (WaitForSingleObject((HANDLE)thread, INFINITE) == WAIT_FAILED) if (WaitForSingleObject((HANDLE)thread, INFINITE) == WAIT_FAILED)
return MEMORY_ERROR; ret = MEMORY_ERROR;
if (CloseHandle((HANDLE)thread) == 0) if (CloseHandle((HANDLE)thread) == 0)
return MEMORY_ERROR; ret = MEMORY_ERROR;
return 0; return ret;
} }
#ifdef WOLFSSL_COND #ifdef WOLFSSL_COND
@ -3438,6 +3441,79 @@ char* mystrnstr(const char* s1, const char* s2, unsigned int n)
#else /* pthread */ #else /* pthread */
int wolfSSL_NewThread(THREAD_TYPE* thread,
THREAD_CB cb, void* arg)
{
if (thread == NULL || cb == NULL)
return BAD_FUNC_ARG;
if (pthread_create(thread, NULL, cb, arg) != 0)
return MEMORY_ERROR;
return 0;
}
int wolfSSL_JoinThread(THREAD_TYPE thread)
{
if (thread == INVALID_THREAD_VAL)
return BAD_FUNC_ARG;
if (pthread_join(thread, NULL) != 0)
return MEMORY_ERROR;
return 0;
}
#ifdef WOLFSSL_COND
int wolfSSL_CondInit(COND_TYPE* cond)
{
if (cond == NULL)
return BAD_FUNC_ARG;
if (pthread_cond_init(cond, NULL) != 0)
return MEMORY_ERROR;
return 0;
}
int wolfSSL_CondFree(COND_TYPE* cond)
{
if (cond == NULL)
return BAD_FUNC_ARG;
if (pthread_cond_destroy(cond) != 0)
return MEMORY_ERROR;
return 0;
}
int wolfSSL_CondSignal(COND_TYPE* cond)
{
if (cond == NULL)
return BAD_FUNC_ARG;
if (pthread_cond_signal(cond) != 0)
return MEMORY_ERROR;
return 0;
}
int wolfSSL_CondWait(COND_TYPE* cond,
wolfSSL_Mutex* mutex)
{
if (cond == NULL || mutex == NULL)
return BAD_FUNC_ARG;
/* mutex has to be locked on entry so we can't touch */
if (pthread_cond_wait(cond, mutex) != 0)
return MEMORY_ERROR;
return 0;
}
#endif /* WOLFSSL_COND */
#endif #endif
#endif /* SINGLE_THREADED */ #endif /* SINGLE_THREADED */

View File

@ -1359,8 +1359,9 @@ typedef struct w64wrapper {
!defined(__MINGW32__) !defined(__MINGW32__)
typedef void* THREAD_RETURN; typedef void* THREAD_RETURN;
typedef pthread_t THREAD_TYPE; typedef pthread_t THREAD_TYPE;
typedef pthread_cond_t COND_TYPE;
#define WOLFSSL_COND
#define WOLFSSL_THREAD #define WOLFSSL_THREAD
#error TODO implement threading with pthreads
#elif defined(FREERTOS) #elif defined(FREERTOS)
typedef unsigned int THREAD_RETURN; typedef unsigned int THREAD_RETURN;
typedef TaskHandle_t THREAD_TYPE; typedef TaskHandle_t THREAD_TYPE;
@ -1387,7 +1388,7 @@ typedef struct w64wrapper {
typedef THREAD_RETURN (WOLFSSL_THREAD *THREAD_CB)(void* arg); typedef THREAD_RETURN (WOLFSSL_THREAD *THREAD_CB)(void* arg);
#ifndef INVALID_THREAD_VAL #ifndef INVALID_THREAD_VAL
#define INVALID_THREAD_VAL (-1) #define INVALID_THREAD_VAL ((THREAD_TYPE)(-1))
#endif #endif
WOLFSSL_LOCAL int wolfSSL_NewThread(THREAD_TYPE* thread, WOLFSSL_LOCAL int wolfSSL_NewThread(THREAD_TYPE* thread,

View File

@ -294,7 +294,7 @@ static void wolfssl_memstats(WOLFSSL* ssl)
/* Start the server thread. */ /* Start the server thread. */
void start_thread(THREAD_FUNC func, func_args* args, THREAD_TYPE* thread) void start_thread(THREAD_CB func, func_args* args, THREAD_TYPE* thread)
{ {
k_thread_create(thread, server_stack, K_THREAD_STACK_SIZEOF(server_stack), k_thread_create(thread, server_stack, K_THREAD_STACK_SIZEOF(server_stack),
func, args, NULL, NULL, 5, 0, K_NO_WAIT); func, args, NULL, NULL, 5, 0, K_NO_WAIT);

View File

@ -517,7 +517,7 @@ static void wolfssl_memstats(WOLFSSL* ssl)
/* Start the server thread. */ /* Start the server thread. */
void start_thread(THREAD_FUNC func, func_args* args, THREAD_TYPE* thread) void start_thread(THREAD_CB func, func_args* args, THREAD_TYPE* thread)
{ {
k_thread_create(thread, server_stack, K_THREAD_STACK_SIZEOF(server_stack), k_thread_create(thread, server_stack, K_THREAD_STACK_SIZEOF(server_stack),
func, args, NULL, NULL, 5, 0, K_NO_WAIT); func, args, NULL, NULL, 5, 0, K_NO_WAIT);