1 /* $OpenBSD: crypto_lock.c,v 1.2 2018/11/28 15:51:32 jsing Exp $ */
3 * Copyright (c) 2018 Brent Cook <bcook@openbsd.org>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include <openssl/crypto.h>
22 static pthread_mutex_t locks
[] = {
23 PTHREAD_MUTEX_INITIALIZER
,
24 PTHREAD_MUTEX_INITIALIZER
,
25 PTHREAD_MUTEX_INITIALIZER
,
26 PTHREAD_MUTEX_INITIALIZER
,
27 PTHREAD_MUTEX_INITIALIZER
,
28 PTHREAD_MUTEX_INITIALIZER
,
29 PTHREAD_MUTEX_INITIALIZER
,
30 PTHREAD_MUTEX_INITIALIZER
,
31 PTHREAD_MUTEX_INITIALIZER
,
32 PTHREAD_MUTEX_INITIALIZER
,
33 PTHREAD_MUTEX_INITIALIZER
,
34 PTHREAD_MUTEX_INITIALIZER
,
35 PTHREAD_MUTEX_INITIALIZER
,
36 PTHREAD_MUTEX_INITIALIZER
,
37 PTHREAD_MUTEX_INITIALIZER
,
38 PTHREAD_MUTEX_INITIALIZER
,
39 PTHREAD_MUTEX_INITIALIZER
,
40 PTHREAD_MUTEX_INITIALIZER
,
41 PTHREAD_MUTEX_INITIALIZER
,
42 PTHREAD_MUTEX_INITIALIZER
,
43 PTHREAD_MUTEX_INITIALIZER
,
44 PTHREAD_MUTEX_INITIALIZER
,
45 PTHREAD_MUTEX_INITIALIZER
,
46 PTHREAD_MUTEX_INITIALIZER
,
47 PTHREAD_MUTEX_INITIALIZER
,
48 PTHREAD_MUTEX_INITIALIZER
,
49 PTHREAD_MUTEX_INITIALIZER
,
50 PTHREAD_MUTEX_INITIALIZER
,
51 PTHREAD_MUTEX_INITIALIZER
,
52 PTHREAD_MUTEX_INITIALIZER
,
53 PTHREAD_MUTEX_INITIALIZER
,
54 PTHREAD_MUTEX_INITIALIZER
,
55 PTHREAD_MUTEX_INITIALIZER
,
56 PTHREAD_MUTEX_INITIALIZER
,
57 PTHREAD_MUTEX_INITIALIZER
,
58 PTHREAD_MUTEX_INITIALIZER
,
59 PTHREAD_MUTEX_INITIALIZER
,
60 PTHREAD_MUTEX_INITIALIZER
,
61 PTHREAD_MUTEX_INITIALIZER
,
62 PTHREAD_MUTEX_INITIALIZER
,
63 PTHREAD_MUTEX_INITIALIZER
,
66 #define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \
67 __attribute__((__unused__))
69 CTASSERT((sizeof(locks
) / sizeof(*locks
)) == CRYPTO_NUM_LOCKS
);
72 CRYPTO_lock(int mode
, int type
, const char *file
, int line
)
74 if (type
< 0 || type
>= CRYPTO_NUM_LOCKS
)
77 if (mode
& CRYPTO_LOCK
)
78 (void) pthread_mutex_lock(&locks
[type
]);
79 else if (mode
& CRYPTO_UNLOCK
)
80 (void) pthread_mutex_unlock(&locks
[type
]);
84 CRYPTO_add_lock(int *pointer
, int amount
, int type
, const char *file
,
89 CRYPTO_lock(CRYPTO_LOCK
|CRYPTO_WRITE
, type
, file
, line
);
90 ret
= *pointer
+ amount
;
92 CRYPTO_lock(CRYPTO_UNLOCK
|CRYPTO_WRITE
, type
, file
, line
);