diff options
author | Alex Brainman <alex.brainman@gmail.com> | 2011-01-12 11:48:15 +1100 |
---|---|---|
committer | Alex Brainman <alex.brainman@gmail.com> | 2011-01-12 11:48:15 +1100 |
commit | 2a7751a4c3ebb7ef4e45bdcdb38e2bc151ea9f2f (patch) | |
tree | 898957a00cd0ab36fd509fb875f3773fd35d123b | |
parent | 2fe83d6d5abccf000efc7295b2f4bc7097cbb13c (diff) | |
download | go-2a7751a4c3ebb7ef4e45bdcdb38e2bc151ea9f2f.tar.gz |
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
http://codereview.appspot.com/3787046
-rw-r--r-- | src/pkg/os/env_windows.go | 1 | ||||
-rw-r--r-- | src/pkg/runtime/darwin/thread.c | 6 | ||||
-rw-r--r-- | src/pkg/runtime/freebsd/thread.c | 6 | ||||
-rw-r--r-- | src/pkg/runtime/linux/thread.c | 6 | ||||
-rw-r--r-- | src/pkg/runtime/plan9/thread.c | 5 | ||||
-rw-r--r-- | src/pkg/runtime/proc.c | 1 | ||||
-rw-r--r-- | src/pkg/runtime/runtime.c | 40 | ||||
-rw-r--r-- | src/pkg/runtime/runtime.h | 4 | ||||
-rw-r--r-- | src/pkg/runtime/string.goc | 30 | ||||
-rw-r--r-- | src/pkg/runtime/tiny/thread.c | 6 | ||||
-rw-r--r-- | src/pkg/runtime/windows/thread.c | 36 |
11 files changed, 121 insertions, 20 deletions
diff --git a/src/pkg/os/env_windows.go b/src/pkg/os/env_windows.go index ad50610ee..d2b159dfb 100644 --- a/src/pkg/os/env_windows.go +++ b/src/pkg/os/env_windows.go @@ -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 { diff --git a/src/pkg/runtime/darwin/thread.c b/src/pkg/runtime/darwin/thread.c index 185f0ce96..d69c62412 100644 --- a/src/pkg/runtime/darwin/thread.c +++ b/src/pkg/runtime/darwin/thread.c @@ -149,6 +149,12 @@ runtime·osinit(void) } void +runtime·goenvs(void) +{ + runtime·goenvs_unix(); +} + +void runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void)) { m->tls[0] = m->id; // so 386 asm can find it diff --git a/src/pkg/runtime/freebsd/thread.c b/src/pkg/runtime/freebsd/thread.c index fc80dfb77..9bd883833 100644 --- a/src/pkg/runtime/freebsd/thread.c +++ b/src/pkg/runtime/freebsd/thread.c @@ -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) diff --git a/src/pkg/runtime/linux/thread.c b/src/pkg/runtime/linux/thread.c index 9c9fc755b..979260ba1 100644 --- a/src/pkg/runtime/linux/thread.c +++ b/src/pkg/runtime/linux/thread.c @@ -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) diff --git a/src/pkg/runtime/plan9/thread.c b/src/pkg/runtime/plan9/thread.c index f1bd1ffbe..fa96552a9 100644 --- a/src/pkg/runtime/plan9/thread.c +++ b/src/pkg/runtime/plan9/thread.c @@ -18,6 +18,11 @@ runtime·osinit(void) } void +runtime·goenvs(void) +{ +} + +void runtime·initsig(int32 queue) { } diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index d469e7c5b..e9a19d950 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -111,6 +111,7 @@ runtime·schedinit(void) runtime·mallocinit(); runtime·goargs(); + runtime·goenvs(); // For debugging: // Allocate internal symbol table representation now, diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c index dbdc0f2ac..9d3efe966 100644 --- a/src/pkg/runtime/runtime.c +++ b/src/pkg/runtime/runtime.c @@ -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. diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index e53855e3c..bde62833e 100644 --- a/src/pkg/runtime/runtime.h +++ b/src/pkg/runtime/runtime.h @@ -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); diff --git a/src/pkg/runtime/string.goc b/src/pkg/runtime/string.goc index 6752f31cc..916559eb2 100644 --- a/src/pkg/runtime/string.goc +++ b/src/pkg/runtime/string.goc @@ -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 @@ -69,6 +81,24 @@ runtime·gostringnocopy(byte *str) } 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) { String s3; diff --git a/src/pkg/runtime/tiny/thread.c b/src/pkg/runtime/tiny/thread.c index b976a1254..0572ecb77 100644 --- a/src/pkg/runtime/tiny/thread.c +++ b/src/pkg/runtime/tiny/thread.c @@ -17,6 +17,12 @@ runtime·osinit(void) } void +runtime·goenvs(void) +{ + runtime·goenvs_unix(); +} + +void runtime·initsig(int32 queue) { } diff --git a/src/pkg/runtime/windows/thread.c b/src/pkg/runtime/windows/thread.c index 00cd0e8bd..9b5181337 100644 --- a/src/pkg/runtime/windows/thread.c +++ b/src/pkg/runtime/windows/thread.c @@ -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) { |