mirror of
https://git.proxmox.com/git/libgit2
synced 2026-01-06 04:29:36 +00:00
Add SRWLock implementation of rwlocks for Win32
This commit is contained in:
parent
2b6e190847
commit
972bb689c4
@ -66,12 +66,17 @@ typedef git_atomic git_atomic_ssize;
|
||||
#define git_rwlock pthread_rwlock_t
|
||||
#define git_rwlock_init(a) pthread_rwlock_init(a, NULL)
|
||||
#define git_rwlock_rdlock(a) pthread_rwlock_rdlock(a)
|
||||
#define git_rwlock_rdunlock(a) pthread_rwlock_unlock(a)
|
||||
#define git_rwlock_rdunlock(a) pthread_rwlock_rdunlock(a)
|
||||
#define git_rwlock_wrlock(a) pthread_rwlock_wrlock(a)
|
||||
#define git_rwlock_wrunlock(a) pthread_rwlock_unlock(a)
|
||||
#define git_rwlock_wrunlock(a) pthread_rwlock_wrunlock(a)
|
||||
#define git_rwlock_free(a) pthread_rwlock_destroy(a)
|
||||
#define GIT_RWLOCK_STATIC_INIT PTHREAD_RWLOCK_INITIALIZER
|
||||
|
||||
#ifndef GIT_WIN32
|
||||
#define pthread_rwlock_rdunlock pthread_rwlock_unlock
|
||||
#define pthread_rwlock_wrunlock pthread_rwlock_unlock
|
||||
#endif
|
||||
|
||||
|
||||
GIT_INLINE(void) git_atomic_set(git_atomic *a, int val)
|
||||
{
|
||||
|
||||
@ -142,3 +142,41 @@ int pthread_num_processors_np(void)
|
||||
return n ? n : 1;
|
||||
}
|
||||
|
||||
int pthread_rwlock_init(
|
||||
pthread_rwlock_t *GIT_RESTRICT lock,
|
||||
const pthread_rwlockattr_t *GIT_RESTRICT attr)
|
||||
{
|
||||
(void)attr;
|
||||
InitializeSRWLock(lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rwlock_rdlock(pthread_rwlock_t *lock)
|
||||
{
|
||||
AcquireSRWLockShared(lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rwlock_rdunlock(pthread_rwlock_t *lock)
|
||||
{
|
||||
ReleaseSRWLockShared(lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rwlock_wrlock(pthread_rwlock_t *lock)
|
||||
{
|
||||
AcquireSRWLockExclusive(lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rwlock_wrunlock(pthread_rwlock_t *lock)
|
||||
{
|
||||
ReleaseSRWLockExclusive(lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pthread_rwlock_destroy(pthread_rwlock_t *lock)
|
||||
{
|
||||
(void)lock;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -19,11 +19,15 @@
|
||||
typedef int pthread_mutexattr_t;
|
||||
typedef int pthread_condattr_t;
|
||||
typedef int pthread_attr_t;
|
||||
typedef int pthread_rwlockattr_t;
|
||||
|
||||
typedef CRITICAL_SECTION pthread_mutex_t;
|
||||
typedef HANDLE pthread_t;
|
||||
typedef HANDLE pthread_cond_t;
|
||||
typedef SRWLOCK pthread_rwlock_t;
|
||||
|
||||
#define PTHREAD_MUTEX_INITIALIZER {(void*)-1};
|
||||
#define PTHREAD_MUTEX_INITIALIZER {(void*)-1}
|
||||
#define PTHREAD_RWLOCK_INITIALIZER SRWLOCK_INIT
|
||||
|
||||
int pthread_create(
|
||||
pthread_t *GIT_RESTRICT,
|
||||
@ -47,4 +51,12 @@ int pthread_cond_signal(pthread_cond_t *);
|
||||
|
||||
int pthread_num_processors_np(void);
|
||||
|
||||
int pthread_rwlock_init(
|
||||
pthread_rwlock_t *GIT_RESTRICT, const pthread_rwlockattr_t *GIT_RESTRICT);
|
||||
int pthread_rwlock_rdlock(pthread_rwlock_t *);
|
||||
int pthread_rwlock_rdunlock(pthread_rwlock_t *);
|
||||
int pthread_rwlock_wrlock(pthread_rwlock_t *);
|
||||
int pthread_rwlock_wrunlock(pthread_rwlock_t *);
|
||||
int pthread_rwlock_destroy(pthread_rwlock_t *);
|
||||
|
||||
#endif
|
||||
|
||||
@ -128,7 +128,9 @@ void test_core_sortedcache__in_memory(void)
|
||||
cl_assert_equal_i(30, item->value);
|
||||
cl_assert(git_sortedcache_lookup(sc, "abc") == NULL);
|
||||
|
||||
cl_git_pass(git_sortedcache_rlock(sc)); /* grab more than one */
|
||||
/* not on Windows:
|
||||
* cl_git_pass(git_sortedcache_rlock(sc)); -- grab more than one
|
||||
*/
|
||||
|
||||
cl_assert((item = git_sortedcache_entry(sc, 0)) != NULL);
|
||||
cl_assert_equal_s("aaa", item->path);
|
||||
@ -148,7 +150,7 @@ void test_core_sortedcache__in_memory(void)
|
||||
cl_assert(git_sortedcache_entry(sc, 5) == NULL);
|
||||
|
||||
git_sortedcache_runlock(sc);
|
||||
git_sortedcache_runlock(sc);
|
||||
/* git_sortedcache_runlock(sc); */
|
||||
|
||||
cl_assert_equal_i(0, free_count);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user