void ThreadPoolImpl::pokeIdleThread() { /* Find a bit in the sleeping thread bitmap and poke it awake, do * not give up until a thread is awakened or all of them are awake */ for (int i = 0; i < m_numSleepMapWords; i++) { uint64_t oldval = m_sleepMap[i]; while (oldval) { unsigned long id; CTZ64(id, oldval); uint64_t newval = oldval & ~(1LL << id); if (ATOMIC_CAS(&m_sleepMap[i], oldval, newval) == oldval) { m_threads[(i << 6) | id].poke(); return; } oldval = m_sleepMap[i]; } } }
void ReleaseALEffects(ALCdevice *device) { EffectSubList *sublist = VECTOR_BEGIN(device->EffectList); EffectSubList *subend = VECTOR_END(device->EffectList); size_t leftover = 0; for(;sublist != subend;++sublist) { ALuint64 usemask = ~sublist->FreeMask; while(usemask) { ALsizei idx = CTZ64(usemask); ALeffect *effect = sublist->Effects + idx; memset(effect, 0, sizeof(*effect)); ++leftover; usemask &= ~(U64(1) << idx); } sublist->FreeMask = ~usemask; } if(leftover > 0) WARN("(%p) Deleted "SZFMT" Effect%s\n", device, leftover, (leftover==1)?"":"s"); }
void ReleaseALFilters(ALCdevice *device) { FilterSubList *sublist = VECTOR_BEGIN(device->FilterList); FilterSubList *subend = VECTOR_END(device->FilterList); size_t leftover = 0; for(;sublist != subend;++sublist) { ALuint64 usemask = ~sublist->FreeMask; while(usemask) { ALsizei idx = CTZ64(usemask); ALfilter *filter = sublist->Filters + idx; memset(filter, 0, sizeof(*filter)); ++leftover; usemask &= ~(U64(1) << idx); } sublist->FreeMask = ~usemask; } if(leftover > 0) WARN("(%p) Deleted "SZFMT" Filter%s\n", device, leftover, (leftover==1)?"":"s"); }
static ALeffect *AllocEffect(ALCcontext *context) { ALCdevice *device = context->Device; EffectSubList *sublist, *subend; ALeffect *effect = NULL; ALsizei lidx = 0; ALsizei slidx; almtx_lock(&device->EffectLock); sublist = VECTOR_BEGIN(device->EffectList); subend = VECTOR_END(device->EffectList); for(;sublist != subend;++sublist) { if(sublist->FreeMask) { slidx = CTZ64(sublist->FreeMask); effect = sublist->Effects + slidx; break; } ++lidx; } if(UNLIKELY(!effect)) { const EffectSubList empty_sublist = { 0, NULL }; /* Don't allocate so many list entries that the 32-bit ID could * overflow... */ if(UNLIKELY(VECTOR_SIZE(device->EffectList) >= 1<<25)) { almtx_unlock(&device->EffectLock); alSetError(context, AL_OUT_OF_MEMORY, "Too many effects allocated"); return NULL; } lidx = (ALsizei)VECTOR_SIZE(device->EffectList); VECTOR_PUSH_BACK(device->EffectList, empty_sublist); sublist = &VECTOR_BACK(device->EffectList); sublist->FreeMask = ~U64(0); sublist->Effects = al_calloc(16, sizeof(ALeffect)*64); if(UNLIKELY(!sublist->Effects)) { VECTOR_POP_BACK(device->EffectList); almtx_unlock(&device->EffectLock); alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate effect batch"); return NULL; } slidx = 0; effect = sublist->Effects + slidx; } memset(effect, 0, sizeof(*effect)); InitEffectParams(effect, AL_EFFECT_NULL); /* Add 1 to avoid effect ID 0. */ effect->id = ((lidx<<6) | slidx) + 1; sublist->FreeMask &= ~(U64(1)<<slidx); almtx_unlock(&device->EffectLock); return effect; }
static ALfilter *AllocFilter(ALCcontext *context) { ALCdevice *device = context->Device; FilterSubList *sublist, *subend; ALfilter *filter = NULL; ALsizei lidx = 0; ALsizei slidx; almtx_lock(&device->FilterLock); sublist = VECTOR_BEGIN(device->FilterList); subend = VECTOR_END(device->FilterList); for(;sublist != subend;++sublist) { if(sublist->FreeMask) { slidx = CTZ64(sublist->FreeMask); filter = sublist->Filters + slidx; break; } ++lidx; } if(UNLIKELY(!filter)) { const FilterSubList empty_sublist = { 0, NULL }; /* Don't allocate so many list entries that the 32-bit ID could * overflow... */ if(UNLIKELY(VECTOR_SIZE(device->FilterList) >= 1<<25)) { almtx_unlock(&device->FilterLock); alSetError(context, AL_OUT_OF_MEMORY, "Too many filters allocated"); return NULL; } lidx = (ALsizei)VECTOR_SIZE(device->FilterList); VECTOR_PUSH_BACK(device->FilterList, empty_sublist); sublist = &VECTOR_BACK(device->FilterList); sublist->FreeMask = ~U64(0); sublist->Filters = al_calloc(16, sizeof(ALfilter)*64); if(UNLIKELY(!sublist->Filters)) { VECTOR_POP_BACK(device->FilterList); almtx_unlock(&device->FilterLock); alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate filter batch"); return NULL; } slidx = 0; filter = sublist->Filters + slidx; } memset(filter, 0, sizeof(*filter)); InitFilterParams(filter, AL_FILTER_NULL); /* Add 1 to avoid filter ID 0. */ filter->id = ((lidx<<6) | slidx) + 1; sublist->FreeMask &= ~(U64(1)<<slidx); almtx_unlock(&device->FilterLock); return filter; }