1
0
mirror of https://github.com/golang/go synced 2024-11-22 04:04: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:
Alex Brainman 2011-01-12 11:48:15 +11:00
parent 217693e93c
commit a41d85498e
11 changed files with 121 additions and 20 deletions

View File

@ -114,7 +114,6 @@ func TempDir() string {
func init() { func init() {
var argc int32 var argc int32
Envs = Environ()
cmd := syscall.GetCommandLine() cmd := syscall.GetCommandLine()
argv, e := syscall.CommandLineToArgv(cmd, &argc) argv, e := syscall.CommandLineToArgv(cmd, &argc)
if e != 0 { if e != 0 {

View File

@ -148,6 +148,12 @@ runtime·osinit(void)
runtime·bsdthread_register(); runtime·bsdthread_register();
} }
void
runtime·goenvs(void)
{
runtime·goenvs_unix();
}
void void
runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void)) runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
{ {

View File

@ -163,6 +163,12 @@ runtime·osinit(void)
{ {
} }
void
runtime·goenvs(void)
{
runtime·goenvs_unix();
}
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
void void
runtime·minit(void) runtime·minit(void)

View File

@ -263,6 +263,12 @@ runtime·osinit(void)
{ {
} }
void
runtime·goenvs(void)
{
runtime·goenvs_unix();
}
// Called to initialize a new m (including the bootstrap m). // Called to initialize a new m (including the bootstrap m).
void void
runtime·minit(void) runtime·minit(void)

View File

@ -17,6 +17,11 @@ runtime·osinit(void)
{ {
} }
void
runtime·goenvs(void)
{
}
void void
runtime·initsig(int32 queue) runtime·initsig(int32 queue)
{ {

View File

@ -111,6 +111,7 @@ runtime·schedinit(void)
runtime·mallocinit(); runtime·mallocinit();
runtime·goargs(); runtime·goargs();
runtime·goenvs();
// For debugging: // For debugging:
// Allocate internal symbol table representation now, // Allocate internal symbol table representation now,

View File

@ -152,34 +152,36 @@ int32 runtime·isplan9;
void void
runtime·goargs(void) runtime·goargs(void)
{ {
String *gargv; String *s;
String *genvv; int32 i;
int32 i, envc;
// for windows implementation see "os" package // for windows implementation see "os" package
if(Windows) if(Windows)
return; return;
if(runtime·isplan9) s = runtime·malloc(argc*sizeof s[0]);
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]);
for(i=0; i<argc; i++) for(i=0; i<argc; i++)
gargv[i] = runtime·gostringnocopy(argv[i]); s[i] = runtime·gostringnocopy(argv[i]);
os·Args.array = (byte*)gargv; os·Args.array = (byte*)s;
os·Args.len = argc; os·Args.len = argc;
os·Args.cap = argc; os·Args.cap = argc;
}
for(i=0; i<envc; i++) void
genvv[i] = runtime·gostringnocopy(argv[argc+1+i]); runtime·goenvs_unix(void)
os·Envs.array = (byte*)genvv; {
os·Envs.len = envc; String *s;
os·Envs.cap = envc; 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. // Atomic add and return new value.

View File

@ -370,6 +370,7 @@ extern bool runtime·iscgo;
*/ */
int32 runtime·strcmp(byte*, byte*); int32 runtime·strcmp(byte*, byte*);
int32 runtime·findnull(byte*); int32 runtime·findnull(byte*);
int32 runtime·findnullw(uint16*);
void runtime·dump(byte*, int32); void runtime·dump(byte*, int32);
int32 runtime·runetochar(byte*, int32); int32 runtime·runetochar(byte*, int32);
int32 runtime·charntorune(int32*, uint8*, int32); int32 runtime·charntorune(int32*, uint8*, int32);
@ -384,6 +385,8 @@ void runtime·gogocall(Gobuf*, void(*)(void));
uintptr runtime·gosave(Gobuf*); uintptr runtime·gosave(Gobuf*);
void runtime·lessstack(void); void runtime·lessstack(void);
void runtime·goargs(void); void runtime·goargs(void);
void runtime·goenvs(void);
void runtime·goenvs_unix(void);
void* runtime·getu(void); void* runtime·getu(void);
void runtime·throw(int8*); void runtime·throw(int8*);
void runtime·panicstring(int8*); void runtime·panicstring(int8*);
@ -399,6 +402,7 @@ String runtime·catstring(String, String);
String runtime·gostring(byte*); String runtime·gostring(byte*);
String runtime·gostringn(byte*, int32); String runtime·gostringn(byte*, int32);
String runtime·gostringnocopy(byte*); String runtime·gostringnocopy(byte*);
String runtime·gostringw(uint16*);
void runtime·initsig(int32); void runtime·initsig(int32);
int32 runtime·gotraceback(void); int32 runtime·gotraceback(void);
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp); void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);

View File

@ -20,6 +20,18 @@ runtime·findnull(byte *s)
return l; 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; int32 runtime·maxstring = 256;
String String
@ -68,6 +80,24 @@ runtime·gostringnocopy(byte *str)
return s; 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 String
runtime·catstring(String s1, String s2) runtime·catstring(String s1, String s2)
{ {

View File

@ -16,6 +16,12 @@ runtime·osinit(void)
{ {
} }
void
runtime·goenvs(void)
{
runtime·goenvs_unix();
}
void void
runtime·initsig(int32 queue) runtime·initsig(int32 queue)
{ {

View File

@ -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 void
runtime·exit(int32 code) runtime·exit(int32 code)
{ {