Skip to content

Commit 12685d7

Browse files
Merge pull request #6686 from dgarske/fix_cond
Fixes for wolfSSL conditional porting
2 parents 35f4a1a + 737e12a commit 12685d7

11 files changed

Lines changed: 179 additions & 136 deletions

File tree

.github/workflows/multi-compiler.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
CXX: clang++-14
2727
runs-on: ubuntu-latest
2828
# This should be a safe limit for the tests to run.
29-
timeout-minutes: 2
29+
timeout-minutes: 4
3030
steps:
3131
- uses: actions/checkout@v3
3232
- name: Build

examples/benchmark/tls_bench.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,9 @@ static int ServerMemSend(info_t* info, char* buf, int sz)
416416
XMEMCPY(&info->to_client.buf[info->to_client.write_idx], buf, sz);
417417
info->to_client.write_idx += sz;
418418
info->to_client.write_bytes += sz;
419+
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_client.mutex));
419420

420421
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond));
421-
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_client.mutex));
422422

423423
#ifdef BENCH_USE_NONBLOCK
424424
if (sz == 0) {
@@ -436,8 +436,9 @@ static int ServerMemRecv(info_t* info, char* buf, int sz)
436436
#ifndef BENCH_USE_NONBLOCK
437437
while (info->to_server.write_idx - info->to_server.read_idx < sz &&
438438
!info->to_client.done) {
439-
THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_server.cond,
440-
&info->to_server.mutex));
439+
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_server.mutex));
440+
THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_server.cond));
441+
THREAD_CHECK_RET(wc_LockMutex(&info->to_server.mutex));
441442
}
442443
#else
443444
if (info->to_server.write_idx - info->to_server.read_idx < sz) {
@@ -492,8 +493,8 @@ static int ClientMemSend(info_t* info, char* buf, int sz)
492493
info->to_server.write_idx += sz;
493494
info->to_server.write_bytes += sz;
494495

495-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
496496
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_server.mutex));
497+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
497498

498499
#ifdef BENCH_USE_NONBLOCK
499500
if (sz == 0) {
@@ -511,8 +512,9 @@ static int ClientMemRecv(info_t* info, char* buf, int sz)
511512
#ifndef BENCH_USE_NONBLOCK
512513
while (info->to_client.write_idx - info->to_client.read_idx < sz &&
513514
!info->to_server.done) {
514-
THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_client.cond,
515-
&info->to_client.mutex));
515+
THREAD_CHECK_RET(wc_UnLockMutex(&info->to_client.mutex));
516+
THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_client.cond));
517+
THREAD_CHECK_RET(wc_LockMutex(&info->to_client.mutex));
516518
}
517519
#else
518520
if (info->to_client.write_idx - info->to_client.read_idx < sz) {
@@ -1054,8 +1056,9 @@ static int bench_tls_client(info_t* info)
10541056
if (info->doDTLS && !info->clientOrserverOnly) {
10551057
THREAD_CHECK_RET(wc_LockMutex(&info->dtls_mutex));
10561058
if (info->serverReady != 1) {
1057-
THREAD_CHECK_RET(wolfSSL_CondWait(&info->dtls_cond,
1058-
&info->dtls_mutex));
1059+
THREAD_CHECK_RET(wc_UnLockMutex(&info->dtls_mutex));
1060+
THREAD_CHECK_RET(wolfSSL_CondWait(&info->dtls_cond));
1061+
THREAD_CHECK_RET(wc_LockMutex(&info->dtls_mutex));
10591062
}
10601063
/* for next loop */
10611064
info->serverReady = 0;
@@ -1201,9 +1204,9 @@ static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN client_thread(void* args)
12011204

12021205
ret = bench_tls_client(info);
12031206

1204-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
12051207
info->to_client.done = 1;
12061208
info->client.ret = ret;
1209+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond));
12071210

12081211
WOLFSSL_RETURN_FROM_THREAD(NULL);
12091212
}
@@ -1291,8 +1294,8 @@ static int SocketWaitClient(info_t* info)
12911294
if (!info->clientOrserverOnly) {
12921295
THREAD_CHECK_RET(wc_LockMutex(&info->dtls_mutex));
12931296
info->serverReady = 1;
1294-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->dtls_cond));
12951297
THREAD_CHECK_RET(wc_UnLockMutex(&info->dtls_mutex));
1298+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->dtls_cond));
12961299
}
12971300
#endif
12981301
connd = (int)recvfrom(info->listenFd, (char *)msg, sizeof(msg),
@@ -1659,9 +1662,9 @@ static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN server_thread(void* args)
16591662
}
16601663
}
16611664

1662-
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond));
16631665
info->to_server.done = 1;
16641666
info->server.ret = ret;
1667+
THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond));
16651668

16661669
WOLFSSL_RETURN_FROM_THREAD(NULL);
16671670
}

examples/echoserver/echoserver.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,8 @@ static void SignalReady(void* args, word16 port)
7474
THREAD_CHECK_RET(wc_LockMutex(&ready->mutex));
7575
ready->ready = 1;
7676
ready->port = port;
77-
#ifdef COND_NO_REQUIRE_LOCKED_MUTEX
7877
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
79-
#endif
8078
THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond));
81-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
82-
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
83-
#endif
8479
#endif /* NO_MAIN_DRIVER && WOLFSSL_COND */
8580
(void)args;
8681
(void)port;

src/bio.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1963,10 +1963,10 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
19631963

19641964
WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
19651965
{
1966-
static WOLFSSL_BIO_METHOD meth;
1966+
static WOLFSSL_BIO_METHOD meth =
1967+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_MD);
19671968

19681969
WOLFSSL_ENTER("wolfSSL_BIO_f_md");
1969-
meth.type = WOLFSSL_BIO_MD;
19701970

19711971
return &meth;
19721972
}
@@ -1986,10 +1986,10 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
19861986

19871987
WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void)
19881988
{
1989-
static WOLFSSL_BIO_METHOD meth;
1989+
static WOLFSSL_BIO_METHOD meth =
1990+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BUFFER);
19901991

19911992
WOLFSSL_ENTER("wolfSSL_BIO_f_buffer");
1992-
meth.type = WOLFSSL_BIO_BUFFER;
19931993

19941994
return &meth;
19951995
}
@@ -2017,10 +2017,10 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
20172017

20182018
WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void)
20192019
{
2020-
static WOLFSSL_BIO_METHOD bio_meth;
2020+
static WOLFSSL_BIO_METHOD bio_meth =
2021+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BIO);
20212022

20222023
WOLFSSL_ENTER("wolfSSL_BIO_s_bio");
2023-
bio_meth.type = WOLFSSL_BIO_BIO;
20242024

20252025
return &bio_meth;
20262026
}
@@ -2029,10 +2029,10 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
20292029
#ifndef NO_FILESYSTEM
20302030
WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void)
20312031
{
2032-
static WOLFSSL_BIO_METHOD file_meth;
2032+
static WOLFSSL_BIO_METHOD file_meth =
2033+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_FILE);
20332034

20342035
WOLFSSL_ENTER("wolfSSL_BIO_s_file");
2035-
file_meth.type = WOLFSSL_BIO_FILE;
20362036

20372037
return &file_meth;
20382038
}
@@ -2041,21 +2041,21 @@ int wolfSSL_BIO_flush(WOLFSSL_BIO* bio)
20412041

20422042
WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void)
20432043
{
2044-
static WOLFSSL_BIO_METHOD meth;
2044+
static WOLFSSL_BIO_METHOD meth =
2045+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_SSL);
20452046

20462047
WOLFSSL_ENTER("wolfSSL_BIO_f_ssl");
2047-
meth.type = WOLFSSL_BIO_SSL;
20482048

20492049
return &meth;
20502050
}
20512051

20522052

20532053
WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void)
20542054
{
2055-
static WOLFSSL_BIO_METHOD meth;
2055+
static WOLFSSL_BIO_METHOD meth =
2056+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_SOCKET);
20562057

20572058
WOLFSSL_ENTER("wolfSSL_BIO_s_socket");
2058-
meth.type = WOLFSSL_BIO_SOCKET;
20592059

20602060
return &meth;
20612061
}
@@ -2803,21 +2803,21 @@ WOLFSSL_BIO* wolfSSL_BIO_pop(WOLFSSL_BIO* bio)
28032803

28042804
WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void)
28052805
{
2806-
static WOLFSSL_BIO_METHOD meth;
2806+
static WOLFSSL_BIO_METHOD meth =
2807+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_MEMORY);
28072808

28082809
WOLFSSL_ENTER("wolfSSL_BIO_s_mem");
2809-
meth.type = WOLFSSL_BIO_MEMORY;
28102810

28112811
return &meth;
28122812
}
28132813

28142814

28152815
WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void)
28162816
{
2817-
static WOLFSSL_BIO_METHOD meth;
2817+
static WOLFSSL_BIO_METHOD meth =
2818+
WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BASE64);
28182819

28192820
WOLFSSL_ENTER("wolfSSL_BIO_f_base64");
2820-
meth.type = WOLFSSL_BIO_BASE64;
28212821

28222822
return &meth;
28232823
}

src/crl.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -931,20 +931,17 @@ static int SignalSetup(WOLFSSL_CRL* crl, int status)
931931
int ret;
932932

933933
/* signal to calling thread we're setup */
934-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
935934
if (wc_LockMutex(&crl->crlLock) != 0) {
936935
WOLFSSL_MSG("wc_LockMutex crlLock failed");
937936
return BAD_MUTEX_E;
938937
}
939-
#endif
940-
941938
crl->setup = status;
942-
ret = wolfSSL_CondSignal(&crl->cond);
943-
944-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
945-
wc_UnLockMutex(&crl->crlLock);
946-
#endif
939+
if (wc_UnLockMutex(&crl->crlLock) != 0) {
940+
WOLFSSL_MSG("wc_UnLockMutex crlLock failed");
941+
return BAD_MUTEX_E;
942+
}
947943

944+
ret = wolfSSL_CondSignal(&crl->cond);
948945
if (ret != 0)
949946
return BAD_COND_E;
950947

@@ -1491,31 +1488,38 @@ static int StartMonitorCRL(WOLFSSL_CRL* crl)
14911488
return THREAD_CREATE_E;
14921489
}
14931490

1494-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
14951491
/* wait for setup to complete */
14961492
if (wc_LockMutex(&crl->crlLock) != 0) {
1497-
WOLFSSL_MSG("wc_LockMutex crlLock error");
1493+
WOLFSSL_MSG("wc_LockMutex crlLock failed");
14981494
return BAD_MUTEX_E;
14991495
}
1500-
#endif
1501-
15021496
while (crl->setup == 0) {
1503-
if (wolfSSL_CondWait(&crl->cond, &crl->crlLock) != 0) {
1497+
int condRet;
1498+
if (wc_UnLockMutex(&crl->crlLock) != 0) {
1499+
WOLFSSL_MSG("wc_UnLockMutex crlLock failed");
1500+
return BAD_MUTEX_E;
1501+
}
1502+
condRet = wolfSSL_CondWait(&crl->cond);
1503+
if (wc_LockMutex(&crl->crlLock) != 0) {
1504+
WOLFSSL_MSG("wc_LockMutex crlLock failed");
1505+
return BAD_MUTEX_E;
1506+
}
1507+
if (condRet != 0) {
15041508
ret = BAD_COND_E;
15051509
break;
15061510
}
15071511
}
1508-
if (crl->setup < 0)
1512+
if (ret >= 0 && crl->setup < 0)
15091513
ret = crl->setup; /* store setup error */
15101514

1511-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
1512-
wc_UnLockMutex(&crl->crlLock);
1513-
#endif
1514-
15151515
if (ret < 0) {
15161516
WOLFSSL_MSG("DoMonitor setup failure");
15171517
crl->tid = INVALID_THREAD_VAL; /* thread already done */
15181518
}
1519+
if (wc_UnLockMutex(&crl->crlLock) != 0) {
1520+
WOLFSSL_MSG("wc_UnLockMutex crlLock failed");
1521+
return BAD_MUTEX_E;
1522+
}
15191523

15201524
return ret;
15211525
}

tests/utils.c

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -322,31 +322,23 @@ void signal_ready(tcp_ready* ready)
322322
{
323323
THREAD_CHECK_RET(wc_LockMutex(&ready->mutex));
324324
ready->ready = 1;
325-
#ifdef COND_NO_REQUIRE_LOCKED_MUTEX
326325
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
327-
#endif
328326
THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond));
329-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
330-
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
331-
#endif
332327
}
333328
#endif
334329

335330
void wait_tcp_ready(func_args* args)
336331
{
337332
#if !defined(SINGLE_THREADED) && defined(WOLFSSL_COND)
338-
if (!args->signal->ready) {
339-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
340-
THREAD_CHECK_RET(wc_LockMutex(&args->signal->mutex));
341-
#endif
342-
THREAD_CHECK_RET(wolfSSL_CondWait(&args->signal->cond,
343-
&args->signal->mutex));
344-
#ifndef COND_NO_REQUIRE_LOCKED_MUTEX
345-
THREAD_CHECK_RET(wc_UnLockMutex(&args->signal->mutex));
346-
#endif
333+
tcp_ready* ready = args->signal;
334+
THREAD_CHECK_RET(wc_LockMutex(&ready->mutex));
335+
if (!ready->ready) {
336+
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
337+
THREAD_CHECK_RET(wolfSSL_CondWait(&ready->cond));
338+
THREAD_CHECK_RET(wc_LockMutex(&ready->mutex));
347339
}
348-
args->signal->ready = 0; /* reset */
349-
340+
ready->ready = 0; /* reset */
341+
THREAD_CHECK_RET(wc_UnLockMutex(&ready->mutex));
350342
#else
351343
/* no threading wait or single threaded */
352344
(void)args;
@@ -356,7 +348,7 @@ void wait_tcp_ready(func_args* args)
356348
#ifndef SINGLE_THREADED
357349
/* Start a thread.
358350
*
359-
* @param [in] fun Function to executre in thread.
351+
* @param [in] fun Function to execute in thread.
360352
* @param [in] args Object to send to function in thread.
361353
* @param [out] thread Handle to thread.
362354
*/

0 commit comments

Comments
 (0)