xref: /aosp_15_r20/external/mesa3d/src/util/rwlock.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2020 Lag Free Games, LLC
3*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Yonggang Luo
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include <assert.h>
8*61046927SAndroid Build Coastguard Worker #include "rwlock.h"
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
11*61046927SAndroid Build Coastguard Worker #include <windows.h>
12*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct u_rwlock) == sizeof(SRWLOCK),
13*61046927SAndroid Build Coastguard Worker    "struct u_rwlock should have equal size with SRWLOCK");
14*61046927SAndroid Build Coastguard Worker #endif
15*61046927SAndroid Build Coastguard Worker 
u_rwlock_init(struct u_rwlock * rwlock)16*61046927SAndroid Build Coastguard Worker int u_rwlock_init(struct u_rwlock *rwlock)
17*61046927SAndroid Build Coastguard Worker {
18*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
19*61046927SAndroid Build Coastguard Worker    InitializeSRWLock((PSRWLOCK)(&rwlock->rwlock));
20*61046927SAndroid Build Coastguard Worker    return 0;
21*61046927SAndroid Build Coastguard Worker #else
22*61046927SAndroid Build Coastguard Worker    return pthread_rwlock_init(&rwlock->rwlock, NULL);
23*61046927SAndroid Build Coastguard Worker #endif
24*61046927SAndroid Build Coastguard Worker }
25*61046927SAndroid Build Coastguard Worker 
u_rwlock_destroy(struct u_rwlock * rwlock)26*61046927SAndroid Build Coastguard Worker int u_rwlock_destroy(struct u_rwlock *rwlock)
27*61046927SAndroid Build Coastguard Worker {
28*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
29*61046927SAndroid Build Coastguard Worker    return 0;
30*61046927SAndroid Build Coastguard Worker #else
31*61046927SAndroid Build Coastguard Worker    return pthread_rwlock_destroy(&rwlock->rwlock);
32*61046927SAndroid Build Coastguard Worker #endif
33*61046927SAndroid Build Coastguard Worker }
34*61046927SAndroid Build Coastguard Worker 
u_rwlock_rdlock(struct u_rwlock * rwlock)35*61046927SAndroid Build Coastguard Worker int u_rwlock_rdlock(struct u_rwlock *rwlock)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
38*61046927SAndroid Build Coastguard Worker    AcquireSRWLockShared((PSRWLOCK)&rwlock->rwlock);
39*61046927SAndroid Build Coastguard Worker    return 0;
40*61046927SAndroid Build Coastguard Worker #else
41*61046927SAndroid Build Coastguard Worker    return pthread_rwlock_rdlock(&rwlock->rwlock);
42*61046927SAndroid Build Coastguard Worker #endif
43*61046927SAndroid Build Coastguard Worker }
44*61046927SAndroid Build Coastguard Worker 
u_rwlock_rdunlock(struct u_rwlock * rwlock)45*61046927SAndroid Build Coastguard Worker int u_rwlock_rdunlock(struct u_rwlock *rwlock)
46*61046927SAndroid Build Coastguard Worker {
47*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
48*61046927SAndroid Build Coastguard Worker    ReleaseSRWLockShared((PSRWLOCK)&rwlock->rwlock);
49*61046927SAndroid Build Coastguard Worker    return 0;
50*61046927SAndroid Build Coastguard Worker #else
51*61046927SAndroid Build Coastguard Worker    return pthread_rwlock_unlock(&rwlock->rwlock);
52*61046927SAndroid Build Coastguard Worker #endif
53*61046927SAndroid Build Coastguard Worker }
54*61046927SAndroid Build Coastguard Worker 
u_rwlock_wrlock(struct u_rwlock * rwlock)55*61046927SAndroid Build Coastguard Worker int u_rwlock_wrlock(struct u_rwlock *rwlock)
56*61046927SAndroid Build Coastguard Worker {
57*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
58*61046927SAndroid Build Coastguard Worker    AcquireSRWLockExclusive((PSRWLOCK)&rwlock->rwlock);
59*61046927SAndroid Build Coastguard Worker    return 0;
60*61046927SAndroid Build Coastguard Worker #else
61*61046927SAndroid Build Coastguard Worker    return pthread_rwlock_wrlock(&rwlock->rwlock);
62*61046927SAndroid Build Coastguard Worker #endif
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker 
u_rwlock_wrunlock(struct u_rwlock * rwlock)65*61046927SAndroid Build Coastguard Worker int u_rwlock_wrunlock(struct u_rwlock *rwlock)
66*61046927SAndroid Build Coastguard Worker {
67*61046927SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(HAVE_PTHREAD)
68*61046927SAndroid Build Coastguard Worker    ReleaseSRWLockExclusive((PSRWLOCK)&rwlock->rwlock);
69*61046927SAndroid Build Coastguard Worker    return 0;
70*61046927SAndroid Build Coastguard Worker #else
71*61046927SAndroid Build Coastguard Worker    return pthread_rwlock_unlock(&rwlock->rwlock);
72*61046927SAndroid Build Coastguard Worker #endif
73*61046927SAndroid Build Coastguard Worker }
74