From a2bddb7b40960b3a8680afa0ab31e99d204dece1 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 7 May 2014 19:16:49 -0700 Subject: Move RWLock and UIntMap implementations to common This should make the code in common completely self-reliant. --- include/rwlock.h | 22 ++++++++++++++++++++++ include/uintmap.h | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 include/rwlock.h create mode 100644 include/uintmap.h (limited to 'include') diff --git a/include/rwlock.h b/include/rwlock.h new file mode 100644 index 00000000..764940fa --- /dev/null +++ b/include/rwlock.h @@ -0,0 +1,22 @@ +#ifndef AL_RWLOCK_H +#define AL_RWLOCK_H + +#include "bool.h" +#include "atomic.h" + +typedef struct { + volatile RefCount read_count; + volatile RefCount write_count; + volatile int read_lock; + volatile int read_entry_lock; + volatile int write_lock; +} RWLock; +#define RWLOCK_STATIC_INITIALIZE { 0, 0, false, false, false } + +void RWLockInit(RWLock *lock); +void ReadLock(RWLock *lock); +void ReadUnlock(RWLock *lock); +void WriteLock(RWLock *lock); +void WriteUnlock(RWLock *lock); + +#endif /* AL_RWLOCK_H */ diff --git a/include/uintmap.h b/include/uintmap.h new file mode 100644 index 00000000..611ed39b --- /dev/null +++ b/include/uintmap.h @@ -0,0 +1,35 @@ +#ifndef AL_UINTMAP_H +#define AL_UINTMAP_H + +#include "AL/al.h" +#include "rwlock.h" + +typedef struct UIntMap { + struct { + ALuint key; + ALvoid *value; + } *array; + ALsizei size; + ALsizei maxsize; + ALsizei limit; + RWLock lock; +} UIntMap; +#define UINTMAP_STATIC_INITIALIZE_N(_n) { NULL, 0, 0, (_n), RWLOCK_STATIC_INITIALIZE } +#define UINTMAP_STATIC_INITIALIZE UINTMAP_STATIC_INITIALIZE_N(~0) + +void InitUIntMap(UIntMap *map, ALsizei limit); +void ResetUIntMap(UIntMap *map); +ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value); +ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key); +ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key); + +inline void LockUIntMapRead(UIntMap *map) +{ ReadLock(&map->lock); } +inline void UnlockUIntMapRead(UIntMap *map) +{ ReadUnlock(&map->lock); } +inline void LockUIntMapWrite(UIntMap *map) +{ WriteLock(&map->lock); } +inline void UnlockUIntMapWrite(UIntMap *map) +{ WriteUnlock(&map->lock); } + +#endif /* AL_UINTMAP_H */ -- cgit v1.2.3