diff options
author | Andrey A. Chernov <ache@FreeBSD.org> | 2012-10-03 04:46:58 +0000 |
---|---|---|
committer | Andrey A. Chernov <ache@FreeBSD.org> | 2012-10-03 04:46:58 +0000 |
commit | 542e13498f48e0a3d443b63d5b0d4c0c54d5828c (patch) | |
tree | 95069d0b688fbfba33a5138446e584e2e06eb02a /lib | |
parent | e9f7ad1fa47222613496a3ccb1d3f07a0ce47b8a (diff) | |
download | src-542e13498f48e0a3d443b63d5b0d4c0c54d5828c.tar.gz src-542e13498f48e0a3d443b63d5b0d4c0c54d5828c.zip |
Optimize prev. commit for speed.
1) Don't iterate the loop from the environment array beginning each time,
iterate it under the last place we deactivate instead.
2) Call __rebuild_environ() not on each iteration but once, only at the end
of whole loop (of course, only in case if something is changed).
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=241154
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/stdlib/getenv.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c index 37602a915f40..47963d53dd62 100644 --- a/lib/libc/stdlib/getenv.c +++ b/lib/libc/stdlib/getenv.c @@ -662,6 +662,7 @@ unsetenv(const char *name) { int envNdx; size_t nameLen; + int newEnvActive; /* Check for malformed name. */ if (name == NULL || (nameLen = __strleneq(name)) == 0) { @@ -674,15 +675,18 @@ unsetenv(const char *name) return (-1); /* Deactivate specified variable. */ - envNdx = envVarsTotal - 1; /* Remove all occurrences. */ + envNdx = envVarsTotal - 1; + newEnvActive = envActive; while (__findenv(name, nameLen, &envNdx, true) != NULL) { envVars[envNdx].active = false; if (envVars[envNdx].putenv) __remove_putenv(envNdx); - __rebuild_environ(envActive - 1); - envNdx = envVarsTotal - 1; + envNdx--; + newEnvActive--; } + if (newEnvActive != envActive) + __rebuild_environ(newEnvActive); return (0); } |