Skip to content

Commit 925d17f

Browse files
committed
Define a few internal macros for easy use of run_once functions
Because pthread_once() takes a function taking no argument and returning nothing, and we want to be able to check if they're successful, we define a few internal macros to get around the issue. Reviewed-by: Kurt Roeckx <[email protected]>
1 parent aebb9aa commit 925d17f

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

include/internal/thread_once.h

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

0 commit comments

Comments
 (0)