2 * OpenAL cross platform audio library
3 * Copyright (C) 1999-2007 by authors.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 * Or go to http://www.gnu.org/copyleft/lgpl.html
29 static ATOMIC(ALenum
) *ThunkArray
;
30 static ALuint ThunkArraySize
;
31 static RWLock ThunkLock
;
35 RWLockInit(&ThunkLock
);
37 ThunkArray
= al_calloc(16, ThunkArraySize
* sizeof(*ThunkArray
));
47 ALenum
NewThunkEntry(ALuint
*index
)
53 for(i
= 0;i
< ThunkArraySize
;i
++)
55 if(ATOMIC_EXCHANGE(ALenum
, &ThunkArray
[i
], AL_TRUE
) == AL_FALSE
)
57 ReadUnlock(&ThunkLock
);
62 ReadUnlock(&ThunkLock
);
64 WriteLock(&ThunkLock
);
65 /* Double-check that there's still no free entries, in case another
66 * invocation just came through and increased the size of the array.
68 for(;i
< ThunkArraySize
;i
++)
70 if(ATOMIC_EXCHANGE(ALenum
, &ThunkArray
[i
], AL_TRUE
) == AL_FALSE
)
72 WriteUnlock(&ThunkLock
);
78 NewList
= al_calloc(16, ThunkArraySize
*2 * sizeof(*ThunkArray
));
81 WriteUnlock(&ThunkLock
);
82 ERR("Realloc failed to increase to %u entries!\n", ThunkArraySize
*2);
83 return AL_OUT_OF_MEMORY
;
85 memcpy(NewList
, ThunkArray
, ThunkArraySize
*sizeof(*ThunkArray
));
90 ATOMIC_STORE(&ThunkArray
[i
], AL_TRUE
);
91 WriteUnlock(&ThunkLock
);
97 void FreeThunkEntry(ALuint index
)
100 if(index
> 0 && index
<= ThunkArraySize
)
101 ATOMIC_STORE(&ThunkArray
[index
-1], AL_FALSE
);
102 ReadUnlock(&ThunkLock
);