Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Oct 2012 04:46:58 +0000 (UTC)
From:      "Andrey A. Chernov" <ache@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241154 - head/lib/libc/stdlib
Message-ID:  <201210030446.q934kwKO064502@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ache
Date: Wed Oct  3 04:46:58 2012
New Revision: 241154
URL: http://svn.freebsd.org/changeset/base/241154

Log:
  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

Modified:
  head/lib/libc/stdlib/getenv.c

Modified: head/lib/libc/stdlib/getenv.c
==============================================================================
--- head/lib/libc/stdlib/getenv.c	Wed Oct  3 04:22:39 2012	(r241153)
+++ head/lib/libc/stdlib/getenv.c	Wed Oct  3 04:46:58 2012	(r241154)
@@ -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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210030446.q934kwKO064502>