xref: /linux/tools/perf/util/rwsem.c (revision e78f70bad29c5ae1e1076698b690b15794e9b81e) !
1 // SPDX-License-Identifier: GPL-2.0
2 #include "util.h"
3 #include "rwsem.h"
4 
5 #if RWS_ERRORCHECK
6 #include "mutex.h"
7 #endif
8 
9 int init_rwsem(struct rw_semaphore *sem)
10 {
11 #if RWS_ERRORCHECK
12 	mutex_init(&sem->mtx);
13 	return 0;
14 #else
15 	return pthread_rwlock_init(&sem->lock, NULL);
16 #endif
17 }
18 
19 int exit_rwsem(struct rw_semaphore *sem)
20 {
21 #if RWS_ERRORCHECK
22 	mutex_destroy(&sem->mtx);
23 	return 0;
24 #else
25 	return pthread_rwlock_destroy(&sem->lock);
26 #endif
27 }
28 
29 int down_read(struct rw_semaphore *sem)
30 	NO_THREAD_SAFETY_ANALYSIS
31 {
32 #if RWS_ERRORCHECK
33 	mutex_lock(&sem->mtx);
34 	return 0;
35 #else
36 	return perf_singlethreaded ? 0 : pthread_rwlock_rdlock(&sem->lock);
37 #endif
38 }
39 
40 int up_read(struct rw_semaphore *sem)
41 	NO_THREAD_SAFETY_ANALYSIS
42 {
43 #if RWS_ERRORCHECK
44 	mutex_unlock(&sem->mtx);
45 	return 0;
46 #else
47 	return perf_singlethreaded ? 0 : pthread_rwlock_unlock(&sem->lock);
48 #endif
49 }
50 
51 int down_write(struct rw_semaphore *sem)
52 	NO_THREAD_SAFETY_ANALYSIS
53 {
54 #if RWS_ERRORCHECK
55 	mutex_lock(&sem->mtx);
56 	return 0;
57 #else
58 	return perf_singlethreaded ? 0 : pthread_rwlock_wrlock(&sem->lock);
59 #endif
60 }
61 
62 int up_write(struct rw_semaphore *sem)
63 	NO_THREAD_SAFETY_ANALYSIS
64 {
65 #if RWS_ERRORCHECK
66 	mutex_unlock(&sem->mtx);
67 	return 0;
68 #else
69 	return perf_singlethreaded ? 0 : pthread_rwlock_unlock(&sem->lock);
70 #endif
71 }
72