forked from wolfSSL/wolfssl
Implement pthreads threading
This commit is contained in:
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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 */
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user