Eliminate shared this from std/process.d

This commit is contained in:
Andrei Alexandrescu 2017-06-11 13:38:57 -04:00 committed by Sebastian Wilzbach
parent 30ff7ac56f
commit 2f16ae7cb7
5 changed files with 15 additions and 33 deletions

View file

@ -224,7 +224,7 @@ EXTRA_MODULES_INTERNAL := $(addprefix std/, \
cstring digest/sha_SSSE3 \
$(addprefix math/, biguintcore biguintnoasm biguintx86 \
errorfunction gammafunction ) \
processinit scopebuffer test/dummyrange \
scopebuffer test/dummyrange \
$(addprefix unicode_, comp decomp grapheme norm tables) \
) \
)

View file

@ -1,22 +0,0 @@
// Written in the D programming language.
/++
The only purpose of this module is to do the static construction for
std.process in order to eliminate cyclic construction errors.
Copyright: Copyright 2011 -
License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
Authors: Jonathan M Davis and Kato Shoichi
Source: $(PHOBOSSRC std/internal/_processinit.d)
+/
module std.internal.processinit;
version(OSX)
{
extern(C) void std_process_shared_static_this();
shared static this()
{
std_process_shared_static_this();
}
}

View file

@ -99,7 +99,6 @@ version (Windows)
}
import std.internal.cstring;
import std.internal.processinit;
import std.range.primitives;
import std.stdio;
@ -133,20 +132,25 @@ version (Posix)
{
version (OSX)
{
extern(C) char*** _NSGetEnviron() nothrow;
private __gshared const(char**)* environPtr;
extern(C) void std_process_shared_static_this() { environPtr = _NSGetEnviron(); }
const(char**) environ() @property @trusted nothrow { return *environPtr; }
private extern(C) char*** _NSGetEnviron() nothrow;
private const(char**) getEnvironPtr() @property @trusted
{
return *_NSGetEnviron;
}
}
else
{
// Made available by the C runtime:
extern(C) extern __gshared const char** environ;
private extern(C) extern __gshared const char** environ;
private const(char**) getEnvironPtr() @property @trusted
{
return environ;
}
}
@system unittest
{
new Thread({assert(environ !is null);}).start();
new Thread({assert(getEnvironPtr !is null);}).start();
}
}
@ -703,6 +707,7 @@ private const(char*)* createEnv(const string[string] childEnv,
{
// Determine the number of strings in the parent's environment.
int parentEnvLength = 0;
auto environ = getEnvironPtr;
if (mergeWithParentEnv)
{
if (childEnv.length == 0) return environ;
@ -737,6 +742,7 @@ version (Posix) @system unittest
auto e2 = createEnv(null, true);
assert(e2 != null);
int i = 0;
auto environ = getEnvironPtr;
for (; environ[i] != null; ++i)
{
assert(e2[i] != null);
@ -3333,6 +3339,7 @@ static:
string[string] aa;
version (Posix)
{
auto environ = getEnvironPtr;
for (int i=0; environ[i] != null; ++i)
{
import std.string : indexOf;
@ -3902,4 +3909,3 @@ else version (Posix)
}
else
static assert(0, "os not supported");

View file

@ -270,7 +270,6 @@ SRC_STD_C_FREEBSD= \
SRC_STD_INTERNAL= \
std\internal\cstring.d \
std\internal\processinit.d \
std\internal\unicode_tables.d \
std\internal\unicode_comp.d \
std\internal\unicode_decomp.d \

View file

@ -295,7 +295,6 @@ SRC_STD_C_FREEBSD= \
SRC_STD_INTERNAL= \
std\internal\cstring.d \
std\internal\processinit.d \
std\internal\unicode_tables.d \
std\internal\unicode_comp.d \
std\internal\unicode_decomp.d \