Loading...
libkern/c++/OSSymbol.cpp xnu-1228 xnu-792.22.5
--- xnu/xnu-1228/libkern/c++/OSSymbol.cpp
+++ xnu/xnu-792.22.5/libkern/c++/OSSymbol.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -51,24 +51,6 @@
 #define ACCUMSIZE(s)
 #endif
 
-#define INITIAL_POOL_SIZE  (exp2ml(1 + log2(kInitBucketCount)))
-
-#define GROW_FACTOR   (1)
-#define SHRINK_FACTOR (3)
-
-#define GROW_POOL()     do \
-    if (count * GROW_FACTOR > nBuckets) { \
-        reconstructSymbols(true); \
-    } \
-while (0)
-
-#define SHRINK_POOL()     do \
-    if (count * SHRINK_FACTOR < nBuckets && \
-        nBuckets > INITIAL_POOL_SIZE) { \
-        reconstructSymbols(false); \
-    } \
-while (0)
-
 class OSSymbolPool
 {
 private:
@@ -102,8 +84,7 @@
     static unsigned long log2(unsigned int x);
     static unsigned long exp2ml(unsigned int x);
 
-    void reconstructSymbols(void);
-    void reconstructSymbols(bool grow);
+    void reconstructSymbols();
 
 public:
     static void *operator new(size_t size);
@@ -145,7 +126,7 @@
 bool OSSymbolPool::init()
 {
     count = 0;
-    nBuckets = INITIAL_POOL_SIZE;
+    nBuckets = exp2ml(1 + log2(kInitBucketCount));
     buckets = (Bucket *) kalloc(nBuckets * sizeof(Bucket));
     ACCUMSIZE(nBuckets * sizeof(Bucket));
     if (!buckets)
@@ -217,35 +198,14 @@
         return thisBucket->symbolP[stateP->j];
 }
 
-void OSSymbolPool::reconstructSymbols(void)
-{
-    this->reconstructSymbols(true);
-}
-
-void OSSymbolPool::reconstructSymbols(bool grow)
-{
-    unsigned int new_nBuckets = nBuckets;
+void OSSymbolPool::reconstructSymbols()
+{
+    OSSymbolPool old(this);
     OSSymbol *insert;
     OSSymbolPoolState state;
 
-    if (grow) {
-        new_nBuckets += new_nBuckets + 1;
-    } else {
-       /* Don't shrink the pool below the default initial size.
-        */
-        if (nBuckets <= INITIAL_POOL_SIZE) {
-            return;
-        }
-        new_nBuckets = (new_nBuckets - 1) / 2;
-    }
-
-   /* Create old pool to iterate after doing above check, cause it
-    * gets finalized at return.
-    */
-    OSSymbolPool old(this);
-
+    nBuckets += nBuckets + 1;
     count = 0;
-    nBuckets = new_nBuckets;
     buckets = (Bucket *) kalloc(nBuckets * sizeof(Bucket));
     ACCUMSIZE(nBuckets * sizeof(Bucket));
     /* @@@ gvdl: Zero test and panic if can't set up pool */
@@ -321,7 +281,8 @@
         thisBucket->symbolP = list;
         thisBucket->count++;
         count++;
-        GROW_POOL();
+        if (count > nBuckets)
+            reconstructSymbols();
 
         return sym;
     }
@@ -343,7 +304,8 @@
     kfree(thisBucket->symbolP, j * sizeof(OSSymbol *));
     ACCUMSIZE(-(j * sizeof(OSSymbol *)));
     thisBucket->symbolP = list;
-    GROW_POOL();
+    if (count > nBuckets)
+        reconstructSymbols();
 
     return sym;
 }
@@ -369,7 +331,6 @@
             thisBucket->symbolP = 0;
             count--;
             thisBucket->count--;
-            SHRINK_POOL();
             return;
         }
         return;
@@ -383,7 +344,6 @@
 	    ACCUMSIZE(-(2 * sizeof(OSSymbol *)));
             count--;
             thisBucket->count--;
-            SHRINK_POOL();
             return;
         }
 
@@ -394,7 +354,6 @@
 	    ACCUMSIZE(-(2 * sizeof(OSSymbol *)));
             count--;
             thisBucket->count--;
-            SHRINK_POOL();
             return;
         }
         return;