On Fri, Jan 13, 2017 at 5:47 AM, Christophe Milard
<christophe.mil...@linaro.org> wrote:
> checking the thread safety of odp_random.
>
> Signed-off-by: Christophe Milard <christophe.mil...@linaro.org>
> ---
>  test/common_plat/validation/api/random/random.c | 46 
> +++++++++++++++++++++++++
>  test/common_plat/validation/api/random/random.h |  1 +
>  2 files changed, 47 insertions(+)
>
> diff --git a/test/common_plat/validation/api/random/random.c 
> b/test/common_plat/validation/api/random/random.c
> index a0e2ef7..17234db 100644
> --- a/test/common_plat/validation/api/random/random.c
> +++ b/test/common_plat/validation/api/random/random.c
> @@ -8,6 +8,8 @@
>  #include <odp_cunit_common.h>
>  #include "random.h"
>
> +#define STRESS_TEST_SZ 100000
> +
>  void random_test_get_size(void)
>  {
>         int32_t ret;
> @@ -61,10 +63,54 @@ void random_test_repeat(void)
>         CU_ASSERT(memcmp(buf1, buf2, sizeof(buf1)) == 0);
>  }
>
> +/*
> + * thread part for the random_test_stress
> + */
> +static int run_test_stress(void *arg ODP_UNUSED)
> +{
> +       int32_t i;
> +       int32_t rc;
> +       uint8_t buf[4096];
> +
> +       odp_random_kind_t max_kind = odp_random_max_kind();
> +
> +       /* generate plenty of random data of different length and different
> +        * quality (using the 2 first bytes of the previous iteration buffer 
> as
> +        * length and quality)

This may be a problem. If you're looking to stress the locking code
these should be the same quality level (max_kind) since I believe each
different kind may have its own locks. So spreading things out like
that will only result in less lock contention.

> +        */
> +       for (i = 0; i < STRESS_TEST_SZ; i++) {
> +               rc = odp_random_data(buf, buf[0] + 2, buf[1] % (max_kind + 
> 1));
> +               CU_ASSERT(rc > 0);
> +       }
> +
> +       fflush(stdout);
> +       return CU_get_number_of_failures();
> +}
> +
> +/*
> + * stress tests
> + */
> +void random_test_stress(void)
> +{
> +       pthrd_arg thrdarg;
> +       odp_cpumask_t unused;
> +
> +       thrdarg.numthrds = odp_cpumask_default_worker(&unused, 0);
> +       if (thrdarg.numthrds > MAX_WORKERS)
> +               thrdarg.numthrds = MAX_WORKERS;
> +
> +       /* create threads */
> +       odp_cunit_thread_create(run_test_stress, &thrdarg);
> +
> +       /* wait for all thread endings: */
> +       CU_ASSERT(odp_cunit_thread_exit(&thrdarg) >= 0);
> +}
> +
>  odp_testinfo_t random_suite[] = {
>         ODP_TEST_INFO(random_test_get_size),
>         ODP_TEST_INFO(random_test_kind),
>         ODP_TEST_INFO(random_test_repeat),
> +       ODP_TEST_INFO(random_test_stress),
>         ODP_TEST_INFO_NULL,
>  };
>
> diff --git a/test/common_plat/validation/api/random/random.h 
> b/test/common_plat/validation/api/random/random.h
> index c4bca78..f9538aa 100644
> --- a/test/common_plat/validation/api/random/random.h
> +++ b/test/common_plat/validation/api/random/random.h
> @@ -13,6 +13,7 @@
>  void random_test_get_size(void);
>  void random_test_kind(void);
>  void random_test_repeat(void);
> +void random_test_stress(void);
>
>  /* test arrays: */
>  extern odp_testinfo_t random_suite[];
> --
> 2.7.4
>

Reply via email to