File: thread_arch.h

package info (click to toggle)
openssl 3.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 146,996 kB
  • sloc: ansic: 652,495; perl: 247,872; asm: 6,332; sh: 1,681; pascal: 997; python: 648; makefile: 551; lisp: 35; ruby: 16; cpp: 10; sed: 6
file content (126 lines) | stat: -rw-r--r-- 4,184 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
 * Copyright 2019-2024 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#ifndef OSSL_INTERNAL_THREAD_ARCH_H
#define OSSL_INTERNAL_THREAD_ARCH_H
#include <openssl/configuration.h>
#include <openssl/e_os2.h>
#include "internal/time.h"

#if defined(_WIN32)
#include <windows.h>
#endif

#if defined(OPENSSL_THREADS) && defined(OPENSSL_SYS_UNIX)
#define OPENSSL_THREADS_POSIX
#elif defined(OPENSSL_THREADS) && defined(OPENSSL_SYS_VMS)
#define OPENSSL_THREADS_POSIX
#elif defined(OPENSSL_THREADS) && defined(OPENSSL_SYS_WINDOWS) && defined(_WIN32_WINNT)
#if _WIN32_WINNT >= 0x0600
#define OPENSSL_THREADS_WINNT
#elif _WIN32_WINNT >= 0x0501
#define OPENSSL_THREADS_WINNT
#define OPENSSL_THREADS_WINNT_LEGACY
#else
#define OPENSSL_THREADS_NONE
#endif
#else
#define OPENSSL_THREADS_NONE
#endif

#include <openssl/crypto.h>

typedef struct crypto_mutex_st CRYPTO_MUTEX;
typedef struct crypto_condvar_st CRYPTO_CONDVAR;

CRYPTO_MUTEX *ossl_crypto_mutex_new(void);
void ossl_crypto_mutex_lock(CRYPTO_MUTEX *mutex);
int ossl_crypto_mutex_try_lock(CRYPTO_MUTEX *mutex);
void ossl_crypto_mutex_unlock(CRYPTO_MUTEX *mutex);
void ossl_crypto_mutex_free(CRYPTO_MUTEX **mutex);

CRYPTO_CONDVAR *ossl_crypto_condvar_new(void);
void ossl_crypto_condvar_wait(CRYPTO_CONDVAR *cv, CRYPTO_MUTEX *mutex);
void ossl_crypto_condvar_wait_timeout(CRYPTO_CONDVAR *cv, CRYPTO_MUTEX *mutex,
    OSSL_TIME deadline);
void ossl_crypto_condvar_broadcast(CRYPTO_CONDVAR *cv);
void ossl_crypto_condvar_signal(CRYPTO_CONDVAR *cv);
void ossl_crypto_condvar_free(CRYPTO_CONDVAR **cv);

typedef uint32_t CRYPTO_THREAD_RETVAL;
typedef CRYPTO_THREAD_RETVAL (*CRYPTO_THREAD_ROUTINE)(void *);
typedef CRYPTO_THREAD_RETVAL (*CRYPTO_THREAD_ROUTINE_CB)(void *,
    void (**)(void *),
    void **);

#define CRYPTO_THREAD_NO_STATE 0UL
#define CRYPTO_THREAD_FINISHED (1UL << 0)
#define CRYPTO_THREAD_JOIN_AWAIT (1UL << 1)
#define CRYPTO_THREAD_JOINED (1UL << 2)

#define CRYPTO_THREAD_GET_STATE(THREAD, FLAG) ((THREAD)->state & (FLAG))
#define CRYPTO_THREAD_GET_ERROR(THREAD, FLAG) (((THREAD)->state >> 16) & (FLAG))

typedef struct crypto_thread_st {
    uint32_t state;
    void *data;
    CRYPTO_THREAD_ROUTINE routine;
    CRYPTO_THREAD_RETVAL retval;
    void *handle;
    CRYPTO_MUTEX *lock;
    CRYPTO_MUTEX *statelock;
    CRYPTO_CONDVAR *condvar;
    unsigned long thread_id;
    int joinable;
    OSSL_LIB_CTX *ctx;
} CRYPTO_THREAD;

#if defined(OPENSSL_THREADS)

#define CRYPTO_THREAD_UNSET_STATE(THREAD, FLAG) \
    do {                                        \
        (THREAD)->state &= ~(FLAG);             \
    } while ((void)0, 0)

#define CRYPTO_THREAD_SET_STATE(THREAD, FLAG) \
    do {                                      \
        (THREAD)->state |= (FLAG);            \
    } while ((void)0, 0)

#define CRYPTO_THREAD_SET_ERROR(THREAD, FLAG) \
    do {                                      \
        (THREAD)->state |= ((FLAG) << 16);    \
    } while ((void)0, 0)

#define CRYPTO_THREAD_UNSET_ERROR(THREAD, FLAG) \
    do {                                        \
        (THREAD)->state &= ~((FLAG) << 16);     \
    } while ((void)0, 0)

#else

#define CRYPTO_THREAD_UNSET_STATE(THREAD, FLAG)
#define CRYPTO_THREAD_SET_STATE(THREAD, FLAG)
#define CRYPTO_THREAD_SET_ERROR(THREAD, FLAG)
#define CRYPTO_THREAD_UNSET_ERROR(THREAD, FLAG)

#endif /* defined(OPENSSL_THREADS) */

CRYPTO_THREAD *ossl_crypto_thread_native_start(CRYPTO_THREAD_ROUTINE routine,
    void *data, int joinable);
int ossl_crypto_thread_native_spawn(CRYPTO_THREAD *thread);
int ossl_crypto_thread_native_join(CRYPTO_THREAD *thread,
    CRYPTO_THREAD_RETVAL *retval);
int ossl_crypto_thread_native_perform_join(CRYPTO_THREAD *thread,
    CRYPTO_THREAD_RETVAL *retval);
int ossl_crypto_thread_native_exit(void);
int ossl_crypto_thread_native_is_self(CRYPTO_THREAD *thread);
int ossl_crypto_thread_native_clean(CRYPTO_THREAD *thread);

#endif /* OSSL_INTERNAL_THREAD_ARCH_H */