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 Workerint 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 Workerint 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 Workerint 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 Workerint 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 Workerint 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 Workerint 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