Hi!
> Use thread-safe versions of tst_res's functions if tests linked
> with pthread library.
> 
> Signed-off-by: Alexey Kodanev <[email protected]>
> ---
>  include/test.h |   31 +++++++++++++++++++++++++++++++
>  1 files changed, 31 insertions(+), 0 deletions(-)
> 
> diff --git a/include/test.h b/include/test.h
> index 29824d3..e3de278 100644
> --- a/include/test.h
> +++ b/include/test.h
> @@ -1,6 +1,7 @@
>  /*
>   * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
>   * Copyright (c) 2009-2013 Cyril Hrubis [email protected]
> + * Copyright (c) 2014 Oracle and/or its affiliates. All Rights Reserved.
>   *
>   * This program is free software; you can redistribute it and/or modify it
>   * under the terms of version 2 of the GNU General Public License as
> @@ -114,6 +115,36 @@
>  extern int Forker_pids[];
>  extern int Forker_npids;
>  
> +/*
> + * Macro to use for making functions called only once in
> + * multi-threaded tests such as init or cleanup function.
> + * The first call to @name_fn function by any thread shall
> + * call the @exec_fn. Subsequent calls shall not call @exec_fn.
> + * *_fn functions must not take any arguments.
> + */
> +#define DECLARE_ONCE_FN(name_fn, exec_fn)                    \
> +     static pthread_once_t name_fn##_ex = PTHREAD_ONCE_INIT; \
> +     void name_fn(void)                                      \
> +     {                                                       \
> +             pthread_once(&name_fn##_ex, exec_fn);           \
> +     }

We can hide the pthread_once vairable from the global namespace by
putting it to the body of the function (because it's static).

> +/*
> + * Will be defined if test is compiled with -pthread.
> + * Then we can use thread-safe versions.
> + */
> +#ifdef _REENTRANT
> +#define tst_res                      tst_res_r
> +#define tst_resm             tst_resm_r
> +#define tst_resm_hexd                tst_resm_hexd_r
> +#define tst_brk                      tst_brk_r
> +#define tst_brkm             tst_brkm_r
> +#define tst_require_root     tst_require_root_r
> +#define tst_flush            tst_flush_r
> +#define tst_exit             tst_exit_r
> +#define tst_environ          tst_environ_r
> +#endif
> +

I would rather see this done in less hacky way. I'm thinking how, but
know of anything better for now.


-- 
Cyril Hrubis
[email protected]

------------------------------------------------------------------------------
Android apps run on BlackBerry 10
Introducing the new BlackBerry 10.2.1 Runtime for Android apps.
Now with support for Jelly Bean, Bluetooth, Mapview and more.
Get your Android app in front of a whole new audience.  Start now.
http://pubads.g.doubleclick.net/gampad/clk?id=124407151&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to