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
31 static ATOMIC_FLAG
*ThunkArray
;
32 static ALsizei ThunkArraySize
;
33 static RWLock ThunkLock
;
37 RWLockInit(&ThunkLock
);
38 ThunkArraySize
= 1024;
39 ThunkArray
= al_calloc(16, ThunkArraySize
* sizeof(*ThunkArray
));
49 ALenum
NewThunkEntry(ALuint
*index
)
55 for(i
= 0;i
< ThunkArraySize
;i
++)
57 if(!ATOMIC_FLAG_TEST_AND_SET(&ThunkArray
[i
], almemory_order_acq_rel
))
59 ReadUnlock(&ThunkLock
);
64 ReadUnlock(&ThunkLock
);
66 WriteLock(&ThunkLock
);
67 /* Double-check that there's still no free entries, in case another
68 * invocation just came through and increased the size of the array.
70 for(;i
< ThunkArraySize
;i
++)
72 if(!ATOMIC_FLAG_TEST_AND_SET(&ThunkArray
[i
], almemory_order_acq_rel
))
74 WriteUnlock(&ThunkLock
);
80 NewList
= al_calloc(16, ThunkArraySize
*2 * sizeof(*ThunkArray
));
83 WriteUnlock(&ThunkLock
);
84 ERR("Realloc failed to increase to %u entries!\n", ThunkArraySize
*2);
85 return AL_OUT_OF_MEMORY
;
87 memcpy(NewList
, ThunkArray
, ThunkArraySize
*sizeof(*ThunkArray
));
92 ATOMIC_FLAG_TEST_AND_SET(&ThunkArray
[i
], almemory_order_seq_cst
);
95 for(;i
< ThunkArraySize
;i
++)
96 ATOMIC_FLAG_CLEAR(&ThunkArray
[i
], almemory_order_relaxed
);
97 WriteUnlock(&ThunkLock
);
102 void FreeThunkEntry(ALuint index
)
104 ReadLock(&ThunkLock
);
105 if(index
> 0 && (ALsizei
)index
<= ThunkArraySize
)
106 ATOMIC_FLAG_CLEAR(&ThunkArray
[index
-1], almemory_order_release
);
107 ReadUnlock(&ThunkLock
);