1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * All rights reserved.
3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This package is an SSL implementation written
5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * by Eric Young (eay@cryptsoft.com).
6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The implementation was written so as to conform with Netscapes SSL.
7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This library is free for commercial and non-commercial use as long as
9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the following conditions are aheared to.  The following conditions
10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * apply to all code found in this distribution, be it the RC4, RSA,
11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * included with this distribution is covered by the same copyright terms
13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright remains Eric Young's, and as such any Copyright notices in
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the code are not to be removed.
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * If this package is used in a product, Eric Young should be given attribution
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * as the author of the parts of the library used.
19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This can be in the form of a textual message at program startup or
20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * in documentation (online or textual) provided with the package.
21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions
24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met:
25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the copyright
26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer.
27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright
28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    notice, this list of conditions and the following disclaimer in the
29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    documentation and/or other materials provided with the distribution.
30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this software
31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    must display the following acknowledgement:
32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes cryptographic software written by
33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *     Eric Young (eay@cryptsoft.com)"
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    The word 'cryptographic' can be left out if the rouines from the library
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    being used are not cryptographic related :-).
36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. If you include any Windows specific code (or a derivative thereof) from
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    the apps directory (application code) you must include an acknowledgement:
38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SUCH DAMAGE.
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The licence and distribution terms for any publically available version or
53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * derivative of this code cannot be changed.  i.e. this code cannot simply be
54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copied and put under another distribution licence
55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * [including the GNU Public Licence.] */
56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#ifndef OPENSSL_HEADER_THREAD_H
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#define OPENSSL_HEADER_THREAD_H
59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
60e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#include <sys/types.h>
61e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/base.h>
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(__cplusplus)
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyextern "C" {
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
69e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#if defined(OPENSSL_NO_THREADS)
704969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamintypedef struct crypto_mutex_st {
718f860b133896bf655e4342ecefe692d52df81d48Robert Sloan  char padding;  // Empty structs have different sizes in C and C++.
724969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin} CRYPTO_MUTEX;
73e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#elif defined(OPENSSL_WINDOWS)
748f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_MUTEX can appear in public header files so we really don't want to
758f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// pull in windows.h. It's statically asserted that this structure is large
768f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// enough to contain a Windows SRWLOCK by thread_win.c.
77e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleytypedef union crypto_mutex_st {
78d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin  void *handle;
79e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley} CRYPTO_MUTEX;
80e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#elif defined(__MACH__) && defined(__APPLE__)
81e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleytypedef pthread_rwlock_t CRYPTO_MUTEX;
82e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#else
838f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// It is reasonable to include pthread.h on non-Windows systems, however the
848f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// |pthread_rwlock_t| that we need is hidden under feature flags, and we can't
858f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// ensure that we'll be able to get it. It's statically asserted that this
868f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// structure is large enough to contain a |pthread_rwlock_t| by
878f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// thread_pthread.c.
88e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleytypedef union crypto_mutex_st {
89e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  double alignment;
90e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley  uint8_t padding[3*sizeof(int) + 5*sizeof(unsigned) + 16 + 8];
91e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley} CRYPTO_MUTEX;
92e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley#endif
93e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
948f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_refcount_t is the type of a reference count.
958f860b133896bf655e4342ecefe692d52df81d48Robert Sloan//
968f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// Since some platforms use C11 atomics to access this, it should have the
978f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// _Atomic qualifier. However, this header is included by C++ programs as well
988f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// as C code that might not set -std=c11. So, in practice, it's not possible to
998f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// do that. Instead we statically assert that the size and native alignment of
1008f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// a plain uint32_t and an _Atomic uint32_t are equal in refcount_c11.c.
10153b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langleytypedef uint32_t CRYPTO_refcount_t;
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1048f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// Deprecated functions.
1058f860b133896bf655e4342ecefe692d52df81d48Robert Sloan//
1068f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// Historically, OpenSSL required callers to provide locking callbacks.
1078f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// BoringSSL is thread-safe by default, but some old code calls these functions
1088f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// and so no-op implementations are provided.
10953b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley
1108f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// These defines do nothing but are provided to make old code easier to
1118f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// compile.
11253b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley#define CRYPTO_LOCK 1
11353b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley#define CRYPTO_UNLOCK 2
11453b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley#define CRYPTO_READ 4
11553b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley#define CRYPTO_WRITE 8
11653b272a2813a0b11f107d77100ff8805ada8fbd2Adam Langley
1178f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_num_locks returns one. (This is non-zero that callers who allocate
1188f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// sizeof(lock) times this value don't get zero and then fail because malloc(0)
1198f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// returned NULL.)
120d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT int CRYPTO_num_locks(void);
121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1228f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_set_locking_callback does nothing.
123d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_set_locking_callback(
124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    void (*func)(int mode, int lock_num, const char *file, int line));
125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1268f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_set_add_lock_callback does nothing.
127d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_set_add_lock_callback(int (*func)(
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    int *num, int amount, int lock_num, const char *file, int line));
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1308f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_get_locking_callback returns NULL.
1316e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid BenjaminOPENSSL_EXPORT void (*CRYPTO_get_locking_callback(void))(int mode, int lock_num,
1326e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin                                                         const char *file,
1336e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin                                                         int line);
1346e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin
1358f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_get_lock_name returns a fixed, dummy string.
136d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT const char *CRYPTO_get_lock_name(int lock_num);
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1388f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_THREADID_set_callback returns one.
139d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT int CRYPTO_THREADID_set_callback(
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    void (*threadid_func)(CRYPTO_THREADID *threadid));
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1428f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_THREADID_set_numeric does nothing.
143d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id,
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                                                unsigned long val);
145e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
1468f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_THREADID_set_pointer does nothing.
147d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr);
148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1498f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_THREADID_current does nothing.
150e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyOPENSSL_EXPORT void CRYPTO_THREADID_current(CRYPTO_THREADID *id);
151e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley
1528f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_set_id_callback does nothing.
153d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_set_id_callback(unsigned long (*func)(void));
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langleytypedef struct {
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  int references;
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  struct CRYPTO_dynlock_value *data;
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} CRYPTO_dynlock;
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1608f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_set_dynlock_create_callback does nothing.
161d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_set_dynlock_create_callback(
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file,
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                                                        int line));
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1658f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_set_dynlock_lock_callback does nothing.
166d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    int mode, struct CRYPTO_dynlock_value *l, const char *file, int line));
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1698f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_set_dynlock_destroy_callback does nothing.
170d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyOPENSSL_EXPORT void CRYPTO_set_dynlock_destroy_callback(
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l,
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley                                 const char *file, int line));
173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1748f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_get_dynlock_create_callback returns NULL.
1756e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid BenjaminOPENSSL_EXPORT struct CRYPTO_dynlock_value *(
1766e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin    *CRYPTO_get_dynlock_create_callback(void))(const char *file, int line);
1776e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin
1788f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_get_dynlock_lock_callback returns NULL.
1796e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid BenjaminOPENSSL_EXPORT void (*CRYPTO_get_dynlock_lock_callback(void))(
1806e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin    int mode, struct CRYPTO_dynlock_value *l, const char *file, int line);
1816e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin
1828f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// CRYPTO_get_dynlock_destroy_callback returns NULL.
1836e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid BenjaminOPENSSL_EXPORT void (*CRYPTO_get_dynlock_destroy_callback(void))(
1846e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin    struct CRYPTO_dynlock_value *l, const char *file, int line);
1856e899c7d3f4c7bd6383a0ca171a50e95aa9d8e2dDavid Benjamin
186d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#if defined(__cplusplus)
1888f860b133896bf655e4342ecefe692d52df81d48Robert Sloan}  // extern C
189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#endif
190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
1918f860b133896bf655e4342ecefe692d52df81d48Robert Sloan#endif  // OPENSSL_HEADER_THREAD_H
192