)
var (
- // envOnce guards initialization by copyenv, which populates env.
- envOnce sync.Once
-
// envLock guards env and envs.
envLock sync.RWMutex
func runtime_envs() []string // in package runtime
-func copyenv() {
+var copyenv = sync.OnceFunc(func() {
env = make(map[string]int)
for i, s := range envs {
for j := 0; j < len(s); j++ {
}
}
}
-}
+})
func Unsetenv(key string) error {
- envOnce.Do(copyenv)
+ copyenv()
envLock.Lock()
defer envLock.Unlock()
}
func Getenv(key string) (value string, found bool) {
- envOnce.Do(copyenv)
+ copyenv()
if len(key) == 0 {
return "", false
}
}
func Setenv(key, value string) error {
- envOnce.Do(copyenv)
+ copyenv()
if len(key) == 0 {
return EINVAL
}
}
func Clearenv() {
- envOnce.Do(copyenv)
+ copyenv()
envLock.Lock()
defer envLock.Unlock()
}
func Environ() []string {
- envOnce.Do(copyenv)
+ copyenv()
envLock.RLock()
defer envLock.RUnlock()
a := make([]string, 0, len(envs))