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