Static constructors in circularly imported modules - again

Max Samukha spambox at d-coding.com
Thu May 27 05:36:45 PDT 2010


On 05/27/2010 01:37 PM, Max Samukha wrote:

>
> module a;
> mixin template Foo()
> {
> static immutable Object foo;
> shared static this()
> {
> foo = cast(immutable)new Object;
> }
> }
>
> ----
> module b;
> import a;
> import c;
>
> mixin Foo;
>
> ----
> module c;
> import a;
> import b;
>
> mixin Foo;
>
> In this scenario one is forced to avoid static constructors by lazily
> initializing foo and using some kind of synchronization, which should be
> absolutely unnecessary and sometimes is not tolerable.
>

Ok, I've just thought of a way to avoid synchronization (using __gshared 
for simplicity):

module a;
mixin template Foo()
{
     static __gshared Object foo; // shared foo
     static Object tlFoo; // thread-local foo

     Object getFoo()
     {
         if (!tlFoo)
         {
             synchronized(lock)
             {
                 if (!foo)
                     foo = new Object;
             }
             tlFoo = foo;
         }
         return tlFoo;
     }
}

There is still unnecessary overhead of accessing and testing the 
thread-local variable.




More information about the Digitalmars-d mailing list