mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
#include "ThreadLocalStorage.h"
|
|
|
|
BfpTLS* BfTLSManager::sInternalThreadKey = 0;
|
|
|
|
BfTLSManager gBfTLSManager;
|
|
|
|
uint32 BfTLSManager::Alloc()
|
|
{
|
|
Beefy::AutoCrit autoCrit(mCritSect);
|
|
int idx = 0;
|
|
if (mFreeIndices.size() != 0)
|
|
{
|
|
idx = mFreeIndices.back();
|
|
mFreeIndices.pop_back();
|
|
}
|
|
else
|
|
{
|
|
idx = mAllocIdx++;
|
|
if (mAllocIdx >= mAllocSize)
|
|
{
|
|
int newSize = std::max(mAllocSize, 4);
|
|
BfpTLS** newArr = new BfpTLS*[newSize];
|
|
BfTLSDatumRoot** newDatumArr = new BfTLSDatumRoot*[newSize];
|
|
|
|
if (mAllocSize > 0)
|
|
{
|
|
memcpy(newArr, mAllocatedKeys, mAllocSize*sizeof(BfpTLS*));
|
|
memcpy(newDatumArr, mAssociatedTLSDatums, mAllocSize*sizeof(BfTLSDatumRoot*));
|
|
}
|
|
|
|
mAllocSize = newSize;
|
|
BF_FULL_MEMORY_FENCE();
|
|
mAllocatedKeys = newArr;
|
|
mAssociatedTLSDatums = newDatumArr;
|
|
}
|
|
}
|
|
|
|
mAllocatedKeys[idx] = BfpTLS_Create();
|
|
mAssociatedTLSDatums[idx] = NULL;
|
|
return idx;
|
|
}
|
|
|
|
void BfTLSManager::RegisterTlsDatum(uint32 key, BfTLSDatumRoot* tlsDatum)
|
|
{
|
|
mAssociatedTLSDatums[key] = tlsDatum;
|
|
}
|
|
|
|
void BfTLSManager::Free(uint32 idx)
|
|
{
|
|
BfTLSDatumRoot* tlsDatumRoot = (BfTLSDatumRoot*) mAssociatedTLSDatums[idx];
|
|
if (tlsDatumRoot != NULL)
|
|
tlsDatumRoot->Finalize();
|
|
|
|
Beefy::AutoCrit autoCrit(mCritSect);
|
|
mFreeIndices.push_back(idx);
|
|
BfpTLS_Release(mAllocatedKeys[idx]);
|
|
}
|