Fiber Local Storage
Vladimir Panteleev
vladimir at thecybershadow.net
Thu Jul 25 21:58:28 PDT 2013
On Friday, 26 July 2013 at 04:30:18 UTC, Manu wrote:
> Is there an FLS implementation floating around?
> If not, it's probably something that should be considered for
> std.thread.
Maybe something like this:
----------------------------------
private struct FLSEntry
{
void** ptr;
size_t start;
immutable void[] initData;
}
private __gshared FLSEntry[] flsEntries;
private __gshared size_t flsSize;
void registerFLS(void** ptr, immutable void[] initData)
{
enum ALIGN = size_t.sizeof;
auto size = (initData.length + ALIGN-1) % ALIGN;
flsEntries ~= FLSEntry(ptr, flsSize, initData);
flsSize += size;
}
// called by core.thread on fiber creation
void initFLS(Fiber fiber)
{
fiber.fls = new void[flsSize];
void* p = fiber.fls.ptr;
foreach (entry; flsEntries)
with (entry)
p[start..start+initData.length] = initData[];
}
// called by core.thread when switching to a fiber
void switchFLS(Fiber to)
{
void* p = to.fls.ptr;
foreach (entry; flsEntries)
*entry.ptr = p + entry.start;
}
struct FLS(T)
{
shared static this()
{
//registerFLS(&data, (&T.init)[0..1]);
static immutable T init;
registerFLS(cast(void**)&data, (&init)[0..1]);
}
static T* data;
alias data this;
}
// ***************************************
struct MyData
{
int i;
}
FLS!MyData fiberData;
----------------------------------
A linker segment would be better, but not sure how feasible that
would be.
More information about the Digitalmars-d
mailing list