diff options
author | Chris Robinson <[email protected]> | 2014-05-07 19:16:49 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2014-05-07 19:16:49 -0700 |
commit | a2bddb7b40960b3a8680afa0ab31e99d204dece1 (patch) | |
tree | 999977561aff4cec16ee966c494666371a60fde7 /include | |
parent | 3e274c3a5784daa313fb5f7663f1b1fc55f5cefc (diff) |
Move RWLock and UIntMap implementations to common
This should make the code in common completely self-reliant.
Diffstat (limited to 'include')
-rw-r--r-- | include/rwlock.h | 22 | ||||
-rw-r--r-- | include/uintmap.h | 35 |
2 files changed, 57 insertions, 0 deletions
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 */ |