aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>2012-10-03 04:46:58 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>2012-10-03 04:46:58 +0000
commit542e13498f48e0a3d443b63d5b0d4c0c54d5828c (patch)
tree95069d0b688fbfba33a5138446e584e2e06eb02a /lib
parente9f7ad1fa47222613496a3ccb1d3f07a0ce47b8a (diff)
downloadsrc-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.c10
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);
}