mirror of https://github.com/xemu-project/xemu.git
tests: fix ptimer leaks
Spotted by ASAN. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
461a862022
commit
072bdb07c5
|
@ -12,6 +12,7 @@
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
#include "sysemu/replay.h"
|
#include "sysemu/replay.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
#include "block/aio.h"
|
||||||
|
|
||||||
#define DELTA_ADJUST 1
|
#define DELTA_ADJUST 1
|
||||||
#define DELTA_NO_ADJUST -1
|
#define DELTA_NO_ADJUST -1
|
||||||
|
@ -353,3 +354,10 @@ ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask)
|
||||||
s->policy_mask = policy_mask;
|
s->policy_mask = policy_mask;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ptimer_free(ptimer_state *s)
|
||||||
|
{
|
||||||
|
qemu_bh_delete(s->bh);
|
||||||
|
timer_free(s->timer);
|
||||||
|
g_free(s);
|
||||||
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct ptimer_state ptimer_state;
|
||||||
typedef void (*ptimer_cb)(void *opaque);
|
typedef void (*ptimer_cb)(void *opaque);
|
||||||
|
|
||||||
ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
|
ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
|
||||||
|
void ptimer_free(ptimer_state *s);
|
||||||
void ptimer_set_period(ptimer_state *s, int64_t period);
|
void ptimer_set_period(ptimer_state *s, int64_t period);
|
||||||
void ptimer_set_freq(ptimer_state *s, uint32_t freq);
|
void ptimer_set_freq(ptimer_state *s, uint32_t freq);
|
||||||
uint64_t ptimer_get_limit(ptimer_state *s);
|
uint64_t ptimer_get_limit(ptimer_state *s);
|
||||||
|
|
|
@ -108,6 +108,11 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
|
||||||
return bh;
|
return bh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_bh_delete(QEMUBH *bh)
|
||||||
|
{
|
||||||
|
g_free(bh);
|
||||||
|
}
|
||||||
|
|
||||||
void replay_bh_schedule_event(QEMUBH *bh)
|
void replay_bh_schedule_event(QEMUBH *bh)
|
||||||
{
|
{
|
||||||
bh->cb(bh->opaque);
|
bh->cb(bh->opaque);
|
||||||
|
|
|
@ -73,6 +73,7 @@ static void check_set_count(gconstpointer arg)
|
||||||
ptimer_set_count(ptimer, 1000);
|
ptimer_set_count(ptimer, 1000);
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_set_limit(gconstpointer arg)
|
static void check_set_limit(gconstpointer arg)
|
||||||
|
@ -92,6 +93,7 @@ static void check_set_limit(gconstpointer arg)
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
|
||||||
g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
|
g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_oneshot(gconstpointer arg)
|
static void check_oneshot(gconstpointer arg)
|
||||||
|
@ -194,6 +196,7 @@ static void check_oneshot(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_periodic(gconstpointer arg)
|
static void check_periodic(gconstpointer arg)
|
||||||
|
@ -360,6 +363,7 @@ static void check_periodic(gconstpointer arg)
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==,
|
||||||
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
|
(no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_on_the_fly_mode_change(gconstpointer arg)
|
static void check_on_the_fly_mode_change(gconstpointer arg)
|
||||||
|
@ -406,6 +410,7 @@ static void check_on_the_fly_mode_change(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_on_the_fly_period_change(gconstpointer arg)
|
static void check_on_the_fly_period_change(gconstpointer arg)
|
||||||
|
@ -438,6 +443,7 @@ static void check_on_the_fly_period_change(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_on_the_fly_freq_change(gconstpointer arg)
|
static void check_on_the_fly_freq_change(gconstpointer arg)
|
||||||
|
@ -470,6 +476,7 @@ static void check_on_the_fly_freq_change(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_run_with_period_0(gconstpointer arg)
|
static void check_run_with_period_0(gconstpointer arg)
|
||||||
|
@ -487,6 +494,7 @@ static void check_run_with_period_0(gconstpointer arg)
|
||||||
|
|
||||||
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
|
g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_run_with_delta_0(gconstpointer arg)
|
static void check_run_with_delta_0(gconstpointer arg)
|
||||||
|
@ -591,6 +599,7 @@ static void check_run_with_delta_0(gconstpointer arg)
|
||||||
g_assert_true(triggered);
|
g_assert_true(triggered);
|
||||||
|
|
||||||
ptimer_stop(ptimer);
|
ptimer_stop(ptimer);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_periodic_with_load_0(gconstpointer arg)
|
static void check_periodic_with_load_0(gconstpointer arg)
|
||||||
|
@ -649,6 +658,7 @@ static void check_periodic_with_load_0(gconstpointer arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
ptimer_stop(ptimer);
|
ptimer_stop(ptimer);
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_oneshot_with_load_0(gconstpointer arg)
|
static void check_oneshot_with_load_0(gconstpointer arg)
|
||||||
|
@ -682,14 +692,14 @@ static void check_oneshot_with_load_0(gconstpointer arg)
|
||||||
} else {
|
} else {
|
||||||
g_assert_false(triggered);
|
g_assert_false(triggered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptimer_free(ptimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_ptimer_tests(uint8_t policy)
|
static void add_ptimer_tests(uint8_t policy)
|
||||||
{
|
{
|
||||||
uint8_t *ppolicy = g_malloc(1);
|
char policy_name[256] = "";
|
||||||
char *policy_name = g_malloc0(256);
|
char *tmp;
|
||||||
|
|
||||||
*ppolicy = policy;
|
|
||||||
|
|
||||||
if (policy == PTIMER_POLICY_DEFAULT) {
|
if (policy == PTIMER_POLICY_DEFAULT) {
|
||||||
g_sprintf(policy_name, "default");
|
g_sprintf(policy_name, "default");
|
||||||
|
@ -715,49 +725,67 @@ static void add_ptimer_tests(uint8_t policy)
|
||||||
g_strlcat(policy_name, "no_counter_rounddown,", 256);
|
g_strlcat(policy_name, "no_counter_rounddown,", 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
|
||||||
ppolicy, check_set_count);
|
g_memdup(&policy, 1), check_set_count, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
|
||||||
ppolicy, check_set_limit);
|
g_memdup(&policy, 1), check_set_limit, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
|
||||||
ppolicy, check_oneshot);
|
g_memdup(&policy, 1), check_oneshot, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
|
||||||
ppolicy, check_periodic);
|
g_memdup(&policy, 1), check_periodic, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s",
|
||||||
ppolicy, check_on_the_fly_mode_change);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s",
|
||||||
ppolicy, check_on_the_fly_period_change);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_on_the_fly_period_change, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s",
|
||||||
ppolicy, check_on_the_fly_freq_change);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s",
|
||||||
ppolicy, check_run_with_period_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_run_with_period_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s",
|
||||||
ppolicy, check_run_with_delta_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_run_with_delta_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s",
|
||||||
ppolicy, check_periodic_with_load_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_periodic_with_load_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
|
|
||||||
g_test_add_data_func(
|
g_test_add_data_func_full(
|
||||||
g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name),
|
tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s",
|
||||||
ppolicy, check_oneshot_with_load_0);
|
policy_name),
|
||||||
|
g_memdup(&policy, 1), check_oneshot_with_load_0, g_free);
|
||||||
|
g_free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_all_ptimer_policies_comb_tests(void)
|
static void add_all_ptimer_policies_comb_tests(void)
|
||||||
|
|
Loading…
Reference in New Issue