xref: /freebsd-src/crypto/openssl/include/internal/thread_once.h (revision e71b70530d95c4f34d8bdbd78d1242df1ba4a945)
1*e71b7053SJung-uk Kim /*
2*e71b7053SJung-uk Kim  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3*e71b7053SJung-uk Kim  *
4*e71b7053SJung-uk Kim  * Licensed under the OpenSSL license (the "License").  You may not use
5*e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6*e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7*e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8*e71b7053SJung-uk Kim  */
9*e71b7053SJung-uk Kim 
10*e71b7053SJung-uk Kim #include <openssl/crypto.h>
11*e71b7053SJung-uk Kim 
12*e71b7053SJung-uk Kim #define DEFINE_RUN_ONCE(init)                   \
13*e71b7053SJung-uk Kim     static int init(void);                     \
14*e71b7053SJung-uk Kim     int init##_ossl_ret_ = 0;                   \
15*e71b7053SJung-uk Kim     void init##_ossl_(void)                     \
16*e71b7053SJung-uk Kim     {                                           \
17*e71b7053SJung-uk Kim         init##_ossl_ret_ = init();              \
18*e71b7053SJung-uk Kim     }                                           \
19*e71b7053SJung-uk Kim     static int init(void)
20*e71b7053SJung-uk Kim #define DECLARE_RUN_ONCE(init)                  \
21*e71b7053SJung-uk Kim     extern int init##_ossl_ret_;                \
22*e71b7053SJung-uk Kim     void init##_ossl_(void);
23*e71b7053SJung-uk Kim 
24*e71b7053SJung-uk Kim #define DEFINE_RUN_ONCE_STATIC(init)            \
25*e71b7053SJung-uk Kim     static int init(void);                     \
26*e71b7053SJung-uk Kim     static int init##_ossl_ret_ = 0;            \
27*e71b7053SJung-uk Kim     static void init##_ossl_(void)              \
28*e71b7053SJung-uk Kim     {                                           \
29*e71b7053SJung-uk Kim         init##_ossl_ret_ = init();              \
30*e71b7053SJung-uk Kim     }                                           \
31*e71b7053SJung-uk Kim     static int init(void)
32*e71b7053SJung-uk Kim 
33*e71b7053SJung-uk Kim /*
34*e71b7053SJung-uk Kim  * RUN_ONCE - use CRYPTO_THREAD_run_once, and check if the init succeeded
35*e71b7053SJung-uk Kim  * @once: pointer to static object of type CRYPTO_ONCE
36*e71b7053SJung-uk Kim  * @init: function name that was previously given to DEFINE_RUN_ONCE,
37*e71b7053SJung-uk Kim  *        DEFINE_RUN_ONCE_STATIC or DECLARE_RUN_ONCE.  This function
38*e71b7053SJung-uk Kim  *        must return 1 for success or 0 for failure.
39*e71b7053SJung-uk Kim  *
40*e71b7053SJung-uk Kim  * The return value is 1 on success (*) or 0 in case of error.
41*e71b7053SJung-uk Kim  *
42*e71b7053SJung-uk Kim  * (*) by convention, since the init function must return 1 on success.
43*e71b7053SJung-uk Kim  */
44*e71b7053SJung-uk Kim #define RUN_ONCE(once, init)                                            \
45*e71b7053SJung-uk Kim     (CRYPTO_THREAD_run_once(once, init##_ossl_) ? init##_ossl_ret_ : 0)
46