Commit 972bb689 by Russell Belfer

Add SRWLock implementation of rwlocks for Win32

parent 2b6e1908
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment