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