mirror of
https://github.com/golang/go
synced 2024-11-21 22:24:40 -07:00
runtime: revert 6974:1f3c3696babb
I missed that environment is used during runtime setup, well before go init() functions run. Implemented os-dependent runtime.goenvs functions to allow for different unix, plan9 and windows versions of environment discovery. R=rsc, paulzhol CC=golang-dev https://golang.org/cl/3787046
This commit is contained in:
parent
217693e93c
commit
a41d85498e
@ -114,7 +114,6 @@ func TempDir() string {
|
||||
|
||||
func init() {
|
||||
var argc int32
|
||||
Envs = Environ()
|
||||
cmd := syscall.GetCommandLine()
|
||||
argv, e := syscall.CommandLineToArgv(cmd, &argc)
|
||||
if e != 0 {
|
||||
|
@ -148,6 +148,12 @@ runtime·osinit(void)
|
||||
runtime·bsdthread_register();
|
||||
}
|
||||
|
||||
void
|
||||
runtime·goenvs(void)
|
||||
{
|
||||
runtime·goenvs_unix();
|
||||
}
|
||||
|
||||
void
|
||||
runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
|
||||
{
|
||||
|
@ -163,6 +163,12 @@ runtime·osinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
runtime·goenvs(void)
|
||||
{
|
||||
runtime·goenvs_unix();
|
||||
}
|
||||
|
||||
// Called to initialize a new m (including the bootstrap m).
|
||||
void
|
||||
runtime·minit(void)
|
||||
|
@ -263,6 +263,12 @@ runtime·osinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
runtime·goenvs(void)
|
||||
{
|
||||
runtime·goenvs_unix();
|
||||
}
|
||||
|
||||
// Called to initialize a new m (including the bootstrap m).
|
||||
void
|
||||
runtime·minit(void)
|
||||
|
@ -17,6 +17,11 @@ runtime·osinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
runtime·goenvs(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
runtime·initsig(int32 queue)
|
||||
{
|
||||
|
@ -111,6 +111,7 @@ runtime·schedinit(void)
|
||||
|
||||
runtime·mallocinit();
|
||||
runtime·goargs();
|
||||
runtime·goenvs();
|
||||
|
||||
// For debugging:
|
||||
// Allocate internal symbol table representation now,
|
||||
|
@ -152,34 +152,36 @@ int32 runtime·isplan9;
|
||||
void
|
||||
runtime·goargs(void)
|
||||
{
|
||||
String *gargv;
|
||||
String *genvv;
|
||||
int32 i, envc;
|
||||
String *s;
|
||||
int32 i;
|
||||
|
||||
// for windows implementation see "os" package
|
||||
if(Windows)
|
||||
return;
|
||||
|
||||
if(runtime·isplan9)
|
||||
envc=0;
|
||||
else
|
||||
for(envc=0; argv[argc+1+envc] != 0; envc++)
|
||||
;
|
||||
|
||||
gargv = runtime·malloc(argc*sizeof gargv[0]);
|
||||
genvv = runtime·malloc(envc*sizeof genvv[0]);
|
||||
|
||||
s = runtime·malloc(argc*sizeof s[0]);
|
||||
for(i=0; i<argc; i++)
|
||||
gargv[i] = runtime·gostringnocopy(argv[i]);
|
||||
os·Args.array = (byte*)gargv;
|
||||
s[i] = runtime·gostringnocopy(argv[i]);
|
||||
os·Args.array = (byte*)s;
|
||||
os·Args.len = argc;
|
||||
os·Args.cap = argc;
|
||||
}
|
||||
|
||||
for(i=0; i<envc; i++)
|
||||
genvv[i] = runtime·gostringnocopy(argv[argc+1+i]);
|
||||
os·Envs.array = (byte*)genvv;
|
||||
os·Envs.len = envc;
|
||||
os·Envs.cap = envc;
|
||||
void
|
||||
runtime·goenvs_unix(void)
|
||||
{
|
||||
String *s;
|
||||
int32 i, n;
|
||||
|
||||
for(n=0; argv[argc+1+n] != 0; n++)
|
||||
;
|
||||
|
||||
s = runtime·malloc(n*sizeof s[0]);
|
||||
for(i=0; i<n; i++)
|
||||
s[i] = runtime·gostringnocopy(argv[argc+1+i]);
|
||||
os·Envs.array = (byte*)s;
|
||||
os·Envs.len = n;
|
||||
os·Envs.cap = n;
|
||||
}
|
||||
|
||||
// Atomic add and return new value.
|
||||
|
@ -370,6 +370,7 @@ extern bool runtime·iscgo;
|
||||
*/
|
||||
int32 runtime·strcmp(byte*, byte*);
|
||||
int32 runtime·findnull(byte*);
|
||||
int32 runtime·findnullw(uint16*);
|
||||
void runtime·dump(byte*, int32);
|
||||
int32 runtime·runetochar(byte*, int32);
|
||||
int32 runtime·charntorune(int32*, uint8*, int32);
|
||||
@ -384,6 +385,8 @@ void runtime·gogocall(Gobuf*, void(*)(void));
|
||||
uintptr runtime·gosave(Gobuf*);
|
||||
void runtime·lessstack(void);
|
||||
void runtime·goargs(void);
|
||||
void runtime·goenvs(void);
|
||||
void runtime·goenvs_unix(void);
|
||||
void* runtime·getu(void);
|
||||
void runtime·throw(int8*);
|
||||
void runtime·panicstring(int8*);
|
||||
@ -399,6 +402,7 @@ String runtime·catstring(String, String);
|
||||
String runtime·gostring(byte*);
|
||||
String runtime·gostringn(byte*, int32);
|
||||
String runtime·gostringnocopy(byte*);
|
||||
String runtime·gostringw(uint16*);
|
||||
void runtime·initsig(int32);
|
||||
int32 runtime·gotraceback(void);
|
||||
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);
|
||||
|
@ -20,6 +20,18 @@ runtime·findnull(byte *s)
|
||||
return l;
|
||||
}
|
||||
|
||||
int32
|
||||
runtime·findnullw(uint16 *s)
|
||||
{
|
||||
int32 l;
|
||||
|
||||
if(s == nil)
|
||||
return 0;
|
||||
for(l=0; s[l]!=0; l++)
|
||||
;
|
||||
return l;
|
||||
}
|
||||
|
||||
int32 runtime·maxstring = 256;
|
||||
|
||||
String
|
||||
@ -68,6 +80,24 @@ runtime·gostringnocopy(byte *str)
|
||||
return s;
|
||||
}
|
||||
|
||||
String
|
||||
runtime·gostringw(uint16 *str)
|
||||
{
|
||||
int32 n, i;
|
||||
byte buf[8];
|
||||
String s;
|
||||
|
||||
n = 0;
|
||||
for(i=0; str[i]; i++)
|
||||
n += runtime·runetochar(buf, str[i]);
|
||||
s = runtime·gostringsize(n+4);
|
||||
n = 0;
|
||||
for(i=0; str[i]; i++)
|
||||
n += runtime·runetochar(s.str+n, str[i]);
|
||||
s.len = n;
|
||||
return s;
|
||||
}
|
||||
|
||||
String
|
||||
runtime·catstring(String s1, String s2)
|
||||
{
|
||||
|
@ -16,6 +16,12 @@ runtime·osinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
runtime·goenvs(void)
|
||||
{
|
||||
runtime·goenvs_unix();
|
||||
}
|
||||
|
||||
void
|
||||
runtime·initsig(int32 queue)
|
||||
{
|
||||
|
@ -39,6 +39,42 @@ runtime·osinit(void)
|
||||
{
|
||||
}
|
||||
|
||||
#pragma dynimport runtime·GetEnvironmentStringsW GetEnvironmentStringsW "kernel32.dll"
|
||||
#pragma dynimport runtime·FreeEnvironmentStringsW FreeEnvironmentStringsW "kernel32.dll"
|
||||
|
||||
extern void *runtime·GetEnvironmentStringsW;
|
||||
extern void *runtime·FreeEnvironmentStringsW;
|
||||
|
||||
void
|
||||
runtime·goenvs(void)
|
||||
{
|
||||
extern Slice os·Envs;
|
||||
|
||||
uint16 *env;
|
||||
String *s;
|
||||
int32 i, n;
|
||||
uint16 *p;
|
||||
|
||||
env = runtime·stdcall(runtime·GetEnvironmentStringsW, 0);
|
||||
|
||||
n = 0;
|
||||
for(p=env; *p; n++)
|
||||
p += runtime·findnullw(p)+1;
|
||||
|
||||
s = runtime·malloc(n*sizeof s[0]);
|
||||
|
||||
p = env;
|
||||
for(i=0; i<n; i++) {
|
||||
s[i] = runtime·gostringw(p);
|
||||
p += runtime·findnullw(p)+1;
|
||||
}
|
||||
os·Envs.array = (byte*)s;
|
||||
os·Envs.len = n;
|
||||
os·Envs.cap = n;
|
||||
|
||||
runtime·stdcall(runtime·FreeEnvironmentStringsW, 1, env);
|
||||
}
|
||||
|
||||
void
|
||||
runtime·exit(int32 code)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user