On Tue, 01 Nov 2011 02:42:16 +0100, Martin Nowak <d...@dawgfoto.de> wrote:

On Mon, 31 Oct 2011 19:13:57 +0100, Michel Fortin <michel.for...@michelf.com> wrote:

On 2011-10-31 17:07:31 +0000, Sean Kelly <s...@invisibleduck.org> said:

writeThis really shouldn't be const, it should be shared. The problem was t hat making writeThis a shared pass by value param implied a synchronized loa d for writeThis, which is undesirable for cas. So I left the declaration of c
as as specified in TDPL and thought I'd figure this out later.

Perhaps it should be Unqual!(shared(V2)). That way if V2 is a pointer it'll be tail-shared.

That won't work for class references though. For that you'd need my "const(Object)ref" patch rusting in DMD's pull requests.

It's a pitty that cas doesn't work with classes.

Does anybody have a good idiom for lazy initialization of shared classes then?
I used to use this one, which doesn't compile any longer.
----------
class Library
{
  void init() {}
}

private shared Library _library;

shared(Library) library()
{
    if (_library is null)
    {
      auto instance = new shared(Library)();
      synchronized(instance)
      {
          if (cas(&_library, cast(Library)null, instance)
              instance.init();
      }
    }
    return _library;
}

Reply via email to