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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to