From 0646adedb014165fd3a891b2551de98cc5423724 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Fri, 10 Jan 2025 08:01:13 +0100 Subject: [PATCH 1/4] test: increase test_oom levels --- test/test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test.c b/test/test.c index f3cbd13a8..126f063d3 100644 --- a/test/test.c +++ b/test/test.c @@ -459,7 +459,7 @@ static int testcase_oom(const struct test *test, int levels, bool verbose) int test_oom(const char *name, bool verbose) { size_t i; - const int levels = 64; + const int levels = 128; int err = 0; test_mode = TEST_MEMORY; From f88cc44dc9ced4285425c564fa5e0d588039a85f Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 20 Jan 2025 13:16:01 +0100 Subject: [PATCH 2/4] main: add re_fhs_flush --- include/re_main.h | 1 + src/main/main.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/re_main.h b/include/re_main.h index 4b5d103fc..4d6d94bf0 100644 --- a/include/re_main.h +++ b/include/re_main.h @@ -71,6 +71,7 @@ void re_thread_async_cancel(intptr_t id); void re_thread_async_main_cancel(intptr_t id); void re_set_mutex(void *mutexp); +void re_fhs_flush(void); struct tmrl *re_tmrl_get(void); diff --git a/src/main/main.c b/src/main/main.c index 09895d3c9..af3ad0f9a 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -1654,3 +1654,23 @@ void re_thread_async_main_cancel(intptr_t id) re_async_cancel(re->async, id); } + + +/** + * Flush file descriptors handlers if re loop is not running + */ +void re_fhs_flush(void) +{ + struct re *re = re_get(); + if (!re) { + DEBUG_WARNING("re_fhs_flush: re not ready\n"); + return; + } + + if (re_atomic_rlx(&re->polling)) { + DEBUG_WARNING("re_fhs_flush: re polling is running\n"); + return; + } + + fhsld_flush(re); +} From 6493f44b9ebb0171cb6a4286bac18bf9bf9c34e1 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 20 Jan 2025 13:16:27 +0100 Subject: [PATCH 3/4] test: add test_exec and check memory leaks re_fhs_flush is used to cleanup OOM tests --- test/test.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/test/test.c b/test/test.c index 126f063d3..71a7e840a 100644 --- a/test/test.c +++ b/test/test.c @@ -387,6 +387,35 @@ static const struct test *find_test_int(const char *name) } +static int test_exec(const struct test *test) +{ + if (!test) + return EINVAL; + + struct memstat mstat_before; + struct memstat mstat_after; + + mem_get_stat(&mstat_before); + + int err = test->exec(); + re_fhs_flush(); + + mem_get_stat(&mstat_after); + + if (mstat_after.blocks_cur > mstat_before.blocks_cur) { + mem_debug(); + re_assert(false && "Test leaks memory blocks"); + } + + if (mstat_after.bytes_cur > mstat_before.bytes_cur) { + mem_debug(); + re_assert(false && "Test leaks memory bytes"); + } + + return err; +} + + /** * Run a single testcase in OOM (Out-of-memory) mode. * @@ -418,7 +447,7 @@ static int testcase_oom(const struct test *test, int levels, bool verbose) mem_threshold_set(i); - err = test->exec(); + err = test_exec(test); if (err == 0) { /* success, stop now */ break; @@ -522,7 +551,7 @@ static int test_unit(const char *name, bool verbose) goto out; } - err = test->exec(); + err = test_exec(test); if (err) { DEBUG_WARNING("%s: test failed (%m)\n", name, err); goto out; @@ -595,7 +624,7 @@ static int testcase_perf(const struct test *test, double *usec_avgp) usec_start = tmr_jiffies_usec(); for (i = 1; i <= DRYRUN_MAX; i++) { - err = test->exec(); + err = test_exec(test); if (err) return err; @@ -613,7 +642,7 @@ static int testcase_perf(const struct test *test, double *usec_avgp) /* now for the real measurement */ usec_start = tmr_jiffies_usec(); for (i=0; iexec(); + err = test_exec(test); if (err) return err; } From 198e657815bb045e93b53458fb93e341be0d7781 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 20 Jan 2025 13:18:04 +0100 Subject: [PATCH 4/4] test/rtcp: fix OOM tests --- test/rtcp.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/test/rtcp.c b/test/rtcp.c index 3004116fd..ae03d7a40 100644 --- a/test/rtcp.c +++ b/test/rtcp.c @@ -146,7 +146,7 @@ static int test_loss(const uint16_t *seqv, size_t seqc, if (err) { if (err == ENOENT) err = ENOMEM; - goto out; + TEST_ERR(err); } /* in OOM-test, detect if member/sender was not allocated */ @@ -155,9 +155,12 @@ static int test_loss(const uint16_t *seqv, size_t seqc, stats.rx.jit == 0) { err = ENOMEM; - goto out; + TEST_ERR(err); } + if (test_mode == TEST_MEMORY) + goto out; + /* verify expected packets sent and packet loss */ TEST_EQUALS(seqc, stats.rx.sent); TEST_EQUALS(exp_lost, stats.rx.lost); @@ -181,14 +184,22 @@ int test_rtcp_packetloss(void) static const uint16_t seqv7[] = {1,2,8,9,10}; int err = 0; - err |= test_loss(seqv1, RE_ARRAY_SIZE(seqv1), 0); - err |= test_loss(seqv2, RE_ARRAY_SIZE(seqv2), 0); - err |= test_loss(seqv3, RE_ARRAY_SIZE(seqv3), 0); - err |= test_loss(seqv4, RE_ARRAY_SIZE(seqv4), 1); - err |= test_loss(seqv5, RE_ARRAY_SIZE(seqv5), 2); - err |= test_loss(seqv6, RE_ARRAY_SIZE(seqv6), 1); - err |= test_loss(seqv7, RE_ARRAY_SIZE(seqv7), 5); + err = test_loss(seqv1, RE_ARRAY_SIZE(seqv1), 0); + TEST_ERR(err); + err = test_loss(seqv2, RE_ARRAY_SIZE(seqv2), 0); + TEST_ERR(err); + err = test_loss(seqv3, RE_ARRAY_SIZE(seqv3), 0); + TEST_ERR(err); + err = test_loss(seqv4, RE_ARRAY_SIZE(seqv4), 1); + TEST_ERR(err); + err = test_loss(seqv5, RE_ARRAY_SIZE(seqv5), 2); + TEST_ERR(err); + err = test_loss(seqv6, RE_ARRAY_SIZE(seqv6), 1); + TEST_ERR(err); + err = test_loss(seqv7, RE_ARRAY_SIZE(seqv7), 5); + TEST_ERR(err); +out: return err; }