zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
alThunk.c
Go to the documentation of this file.
1 
21 #include "config.h"
22 
23 #include <stdlib.h>
24 
25 #include "alMain.h"
26 #include "alThunk.h"
27 
28 
32 
33 void ThunkInit(void)
34 {
35  RWLockInit(&ThunkLock);
36  ThunkArraySize = 1;
37  ThunkArray = calloc(1, ThunkArraySize * sizeof(*ThunkArray));
38 }
39 
40 void ThunkExit(void)
41 {
43  ThunkArray = NULL;
44  ThunkArraySize = 0;
45 }
46 
48 {
49  ALenum *NewList;
50  ALuint i;
51 
52  ReadLock(&ThunkLock);
53  for(i = 0;i < ThunkArraySize;i++)
54  {
55  if(ExchangeInt(&ThunkArray[i], AL_TRUE) == AL_FALSE)
56  {
57  ReadUnlock(&ThunkLock);
58  *index = i+1;
59  return AL_NO_ERROR;
60  }
61  }
62  ReadUnlock(&ThunkLock);
63 
64  WriteLock(&ThunkLock);
65  NewList = realloc(ThunkArray, ThunkArraySize*2 * sizeof(*ThunkArray));
66  if(!NewList)
67  {
68  WriteUnlock(&ThunkLock);
69  ERR("Realloc failed to increase to %u entries!\n", ThunkArraySize*2);
70  return AL_OUT_OF_MEMORY;
71  }
72  memset(&NewList[ThunkArraySize], 0, ThunkArraySize*sizeof(*ThunkArray));
73  ThunkArraySize *= 2;
74  ThunkArray = NewList;
75 
76  ThunkArray[i] = AL_TRUE;
77  WriteUnlock(&ThunkLock);
78 
79  *index = i+1;
80  return AL_NO_ERROR;
81 }
82 
84 {
85  ReadLock(&ThunkLock);
86  if(index > 0 && index <= ThunkArraySize)
87  ExchangeInt(&ThunkArray[index-1], AL_FALSE);
88  ReadUnlock(&ThunkLock);
89 }
void FreeThunkEntry(ALuint index)
Definition: alThunk.c:83
static RWLock ThunkLock
Definition: alThunk.c:31
#define AL_TRUE
Definition: al.h:86
#define NULL
Definition: ftobjs.h:61
Definition: alMain.h:292
void ReadLock(RWLock *lock)
Definition: helpers.c:515
SDL_EventEntry * free
Definition: SDL_events.c:80
#define memset
Definition: SDL_malloc.c:633
#define AL_FALSE
Definition: al.h:83
#define calloc
Definition: SDL_malloc.c:636
void ThunkInit(void)
Definition: alThunk.c:33
void WriteUnlock(RWLock *lock)
Definition: helpers.c:538
static ALuint ThunkArraySize
Definition: alThunk.c:30
void ReadUnlock(RWLock *lock)
Definition: helpers.c:525
#define realloc
Definition: SDL_malloc.c:637
int ALenum
Definition: al.h:65
ALenum NewThunkEntry(ALuint *index)
Definition: alThunk.c:47
GLuint index
Definition: glew.h:1800
void RWLockInit(RWLock *lock)
Definition: helpers.c:506
unsigned int ALuint
Definition: al.h:59
static ALenum * ThunkArray
Definition: alThunk.c:29
void ThunkExit(void)
Definition: alThunk.c:40
#define ERR(...)
Definition: alMain.h:816
#define AL_OUT_OF_MEMORY
Definition: al.h:379
int i
Definition: pngrutil.c:1377
#define AL_NO_ERROR
Definition: al.h:364
void WriteLock(RWLock *lock)
Definition: helpers.c:531