xref: /dragonfly/crypto/libressl/crypto/crypto_lock.c (revision 72c3367655e64985522b7a48ddfab613e869dc68)
1 /* $OpenBSD: crypto_lock.c,v 1.2 2018/11/28 15:51:32 jsing Exp $ */
2 /*
3  * Copyright (c) 2018 Brent Cook <bcook@openbsd.org>
4  *
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.
8  *
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.
16  */
17 
18 #include <pthread.h>
19 
20 #include <openssl/crypto.h>
21 
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,
64 };
65 
66 #define CTASSERT(x) extern char  _ctassert[(x) ? 1 : -1 ] \
67                                   __attribute__((__unused__))
68 
69 CTASSERT((sizeof(locks) / sizeof(*locks)) == CRYPTO_NUM_LOCKS);
70 
71 void
CRYPTO_lock(int mode,int type,const char * file,int line)72 CRYPTO_lock(int mode, int type, const char *file, int line)
73 {
74           if (type < 0 || type >= CRYPTO_NUM_LOCKS)
75                     return;
76 
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]);
81 }
82 
83 int
CRYPTO_add_lock(int * pointer,int amount,int type,const char * file,int line)84 CRYPTO_add_lock(int *pointer, int amount, int type, const char *file,
85     int line)
86 {
87           int ret;
88 
89           CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE, type, file, line);
90           ret = *pointer + amount;
91           *pointer = ret;
92           CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE, type, file, line);
93 
94           return (ret);
95 }
96