Skip to content

Commit

Permalink
Merge pull request #2943 from MartinNowak/useInitOnce
Browse files Browse the repository at this point in the history
use initOnce for lazy shared initialization
  • Loading branch information
DmitryOlshansky committed Jun 26, 2015
2 parents ec0a0ad + 10cbf75 commit bcedffd
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 44 deletions.
11 changes: 6 additions & 5 deletions std/concurrency.d
Expand Up @@ -75,7 +75,6 @@ private
import core.sync.mutex;
import core.sync.condition;
import std.algorithm;
import std.datetime;
import std.exception;
import std.range;
import std.string;
Expand Down Expand Up @@ -1373,11 +1372,12 @@ private:

override bool wait( Duration period ) nothrow
{
import core.time;
scope(exit) notified = false;

for( auto limit = Clock.currSystemTick + period;
for( auto limit = TickDuration.currSystemTick + period;
!notified && !period.isNegative;
period = limit - Clock.currSystemTick )
period = limit - TickDuration.currSystemTick )
{
yield();
}
Expand Down Expand Up @@ -2047,7 +2047,8 @@ private

static if( timedWait )
{
auto limit = Clock.currSystemTick + period;
import core.time;
auto limit = TickDuration.currSystemTick + period;
}

while( true )
Expand Down Expand Up @@ -2095,7 +2096,7 @@ private
{
static if( timedWait )
{
period = limit - Clock.currSystemTick;
period = limit - TickDuration.currSystemTick;
}
continue;
}
Expand Down
26 changes: 5 additions & 21 deletions std/datetime.d
Expand Up @@ -27333,31 +27333,15 @@ private:
}


static immutable LocalTime _localTime = new immutable(LocalTime)();
// Use low-lock singleton pattern with _tzsetWasCalled (see http://dconf.org/talks/simcha.html)
static bool _lowLock;
static shared bool _tzsetWasCalled;


// This is done so that we can maintain purity in spite of doing an impure
// operation the first time that LocalTime() is called.
static immutable(LocalTime) singleton() @trusted
{
if(!_lowLock)
{
synchronized
{
if(!_tzsetWasCalled)
{
tzset();
_tzsetWasCalled = true;
}
}

_lowLock = true;
}

return _localTime;
import std.concurrency : initOnce;
static instance = new immutable(LocalTime)();
static shared bool guard;
initOnce!guard({tzset(); return true;}());
return instance;
}
}

Expand Down
25 changes: 7 additions & 18 deletions std/parallelism.d
Expand Up @@ -3273,24 +3273,13 @@ terminating the main thread.
*/
@property TaskPool taskPool() @trusted
{
static bool initialized;
__gshared static TaskPool pool;

if(!initialized)
{
synchronized(typeid(TaskPool))
{
if(!pool)
{
pool = new TaskPool(defaultPoolThreads);
pool.isDaemon = true;
}
}

initialized = true;
}

return pool;
import std.concurrency : initOnce;
__gshared TaskPool pool;
return initOnce!pool({
auto p = new TaskPool(defaultPoolThreads);
p.isDaemon = true;
return p;
}());
}

private shared uint _defaultPoolThreads;
Expand Down

0 comments on commit bcedffd

Please sign in to comment.