SHARE
TWEET

Remove (un)committed pages distinction

a guest Jul 13th, 2010 159 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. commit 9fac8d774138f03d80061c243400b67b48879fd5
  2. Author: Leandro Lucarella <llucax@gmail.com>
  3. Date:   Sun Jan 17 18:29:52 2010 -0300
  4.  
  5.     Remove (un)committed pages distinction
  6.    
  7.     This distinction is only made by Windows, and adds an extra complexity
  8.     that probably doesn't worth it (specially for other OSs, where this adds
  9.     a little overhead too, in both space and time).
  10.    
  11.     Other OSs (like Linux) even do all the committing automatically, under the
  12.     hood, see:
  13.     http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;\
  14.     f=Documentation/vm/overcommit-accounting;hb=HEAD
  15.  
  16. diff --git a/gc/alloc.d b/gc/alloc.d
  17. index 575095b..eeebcf4 100644
  18. --- a/gc/alloc.d
  19. +++ b/gc/alloc.d
  20. @@ -92,24 +92,7 @@ version (D_Ddoc)
  21.      void* os_mem_map(size_t nbytes);
  22.  
  23.      /**
  24. -     * Commit memory.
  25. -     * Returns:
  26. -     *      true  success
  27. -     *      false failure
  28. -     */
  29. -    bool os_mem_commit(void* base, size_t offset, size_t nbytes);
  30. -
  31. -    /**
  32. -     * Decommit memory.
  33. -     * Returns:
  34. -     *      true  success
  35. -     *      false failure
  36. -     */
  37. -    bool os_mem_decommit(void* base, size_t offset, size_t nbytes);
  38. -
  39. -    /**
  40.       * Unmap memory allocated with os_mem_map().
  41. -     * Memory must have already been decommitted.
  42.       * Returns:
  43.       *      true  success
  44.       *      false failure
  45. @@ -121,18 +104,8 @@ else static if (is(typeof(VirtualAlloc)))
  46.  {
  47.      void* os_mem_map(size_t nbytes)
  48.      {
  49. -        return VirtualAlloc(null, nbytes, MEM_RESERVE, PAGE_READWRITE);
  50. -    }
  51. -
  52. -    bool os_mem_commit(void* base, size_t offset, size_t nbytes)
  53. -    {
  54. -        void* p = VirtualAlloc(base + offset, nbytes, MEM_COMMIT, PAGE_READWRITE);
  55. -        return p !is null;
  56. -    }
  57. -
  58. -    bool os_mem_decommit(void* base, size_t offset, size_t nbytes)
  59. -    {
  60. -        return VirtualFree(base + offset, nbytes, MEM_DECOMMIT) != 0;
  61. +        return VirtualAlloc(null, nbytes, MEM_RESERVE | MEM_COMMIT,
  62. +                PAGE_READWRITE);
  63.      }
  64.  
  65.      bool os_mem_unmap(void* base, size_t nbytes)
  66. @@ -149,16 +122,6 @@ else static if (is(typeof(mmap)) && is(typeof(MAP_ANON)))
  67.          return (p == MAP_FAILED) ? null : p;
  68.      }
  69.  
  70. -    bool os_mem_commit(void* base, size_t offset, size_t nbytes)
  71. -    {
  72. -        return true;
  73. -    }
  74. -
  75. -    bool os_mem_decommit(void* base, size_t offset, size_t nbytes)
  76. -    {
  77. -        return true;
  78. -    }
  79. -
  80.      bool os_mem_unmap(void* base, size_t nbytes)
  81.      {
  82.          return munmap(base, nbytes) == 0;
  83. @@ -184,16 +147,6 @@ else static if (is(typeof(malloc)))
  84.          return q;
  85.      }
  86.  
  87. -    bool os_mem_commit(void* base, size_t offset, size_t nbytes)
  88. -    {
  89. -        return true;
  90. -    }
  91. -
  92. -    bool os_mem_decommit(void* base, size_t offset, size_t nbytes)
  93. -    {
  94. -        return true;
  95. -    }
  96. -
  97.      bool os_mem_unmap(void* base, size_t nbytes)
  98.      {
  99.          free(*cast(void**)(cast(byte*) base + nbytes));
  100. diff --git a/gc/gc.d b/gc/gc.d
  101. index 3dff4ea..9607d24 100644
  102. --- a/gc/gc.d
  103. +++ b/gc/gc.d
  104. @@ -645,13 +645,9 @@ class GC
  105.                                      .memset(&pool.pagetable[pagenum + psz], B_PAGEPLUS, newsz - psz);
  106.                                      return p;
  107.                                  }
  108. -                                if (i == pool.ncommitted)
  109. +                                if (i == pool.npages)
  110.                                  {
  111. -                                    auto u = pool.extendPages(pagenum + newsz - pool.ncommitted);
  112. -                                    if (u == OPFAIL)
  113. -                                        break;
  114. -                                    i = pagenum + newsz;
  115. -                                    continue;
  116. +                                    break;
  117.                                  }
  118.                                  if (pool.pagetable[i] != B_FREE)
  119.                                      break;
  120. @@ -747,7 +743,7 @@ class GC
  121.          for (sz = 0; sz < maxsz; sz++)
  122.          {
  123.              auto i = pagenum + psz + sz;
  124. -            if (i == pool.ncommitted)
  125. +            if (i == pool.npages)
  126.                  break;
  127.              if (pool.pagetable[i] != B_FREE)
  128.              {   if (sz < minsz)
  129. @@ -755,17 +751,7 @@ class GC
  130.                  break;
  131.              }
  132.          }
  133. -        if (sz >= minsz)
  134. -        {
  135. -        }
  136. -        else if (pagenum + psz + sz == pool.ncommitted)
  137. -        {
  138. -            auto u = pool.extendPages(minsz - sz);
  139. -            if (u == OPFAIL)
  140. -                return 0;
  141. -            sz = minsz;
  142. -        }
  143. -        else
  144. +        if (sz < minsz)
  145.              return 0;
  146.          debug (MEMSTOMP) .memset(p + psize, 0xF0, (psz + sz) * PAGESIZE - psize);
  147.          .memset(pool.pagetable + pagenum + psz, B_PAGEPLUS, sz);
  148. @@ -859,7 +845,7 @@ class GC
  149.              // Free pages
  150.              npages = 1;
  151.              n = pagenum;
  152. -            while (++n < pool.ncommitted && pool.pagetable[n] == B_PAGEPLUS)
  153. +            while (++n < pool.npages && pool.pagetable[n] == B_PAGEPLUS)
  154.                  npages++;
  155.              debug (MEMSTOMP) .memset(p, 0xF2, npages * PAGESIZE);
  156.              pool.freePages(pagenum, npages);
  157. @@ -1290,8 +1276,8 @@ class GC
  158.          for (n = 0; n < gcx.npools; n++)
  159.          {   Pool *pool = gcx.pooltable[n];
  160.  
  161. -            psize += pool.ncommitted * PAGESIZE;
  162. -            for (size_t j = 0; j < pool.ncommitted; j++)
  163. +            psize += pool.npages * PAGESIZE;
  164. +            for (size_t j = 0; j < pool.npages; j++)
  165.              {
  166.                  Bins bin = cast(Bins)pool.pagetable[j];
  167.                  if (bin == B_FREE)
  168. @@ -1326,7 +1312,6 @@ class GC
  169.  
  170.  enum
  171.  {   PAGESIZE =    4096,
  172. -    COMMITSIZE = (4096*16),
  173.      POOLSIZE =   (4096*256),
  174.  }
  175.  
  176. @@ -1344,7 +1329,6 @@ enum
  177.      B_PAGE,             // start of large alloc
  178.      B_PAGEPLUS,         // continuation of large alloc
  179.      B_FREE,             // free page
  180. -    B_UNCOMMITTED,      // memory not committed for this page
  181.      B_MAX
  182.  }
  183.  
  184. @@ -1646,7 +1630,7 @@ struct Gcx
  185.              }
  186.              else
  187.              {
  188. -                // we are in a B_FREE or B_UNCOMMITTED page
  189. +                // we are in a B_FREE page
  190.                  return null;
  191.              }
  192.          }
  193. @@ -1673,12 +1657,12 @@ struct Gcx
  194.              bin = cast(Bins)pool.pagetable[pagenum];
  195.              size = binsize[bin];
  196.              if (bin == B_PAGE)
  197. -            {   size_t npages = pool.ncommitted;
  198. +            {
  199.                  ubyte* pt;
  200.                  size_t i;
  201.  
  202.                  pt = &pool.pagetable[0];
  203. -                for (i = pagenum + 1; i < npages; i++)
  204. +                for (i = pagenum + 1; i < pool.npages; i++)
  205.                  {
  206.                      if (pt[i] != B_PAGEPLUS)
  207.                          break;
  208. @@ -1731,12 +1715,12 @@ struct Gcx
  209.  
  210.              info.size = binsize[bin];
  211.              if (bin == B_PAGE)
  212. -            {   size_t npages = pool.ncommitted;
  213. +            {
  214.                  ubyte* pt;
  215.                  size_t i;
  216.  
  217.                  pt = &pool.pagetable[0];
  218. -                for (i = pn + 1; i < npages; i++)
  219. +                for (i = pn + 1; i < pool.npages; i++)
  220.                  {
  221.                      if (pt[i] != B_PAGEPLUS)
  222.                          break;
  223. @@ -1811,9 +1795,9 @@ struct Gcx
  224.          size_t npages = (size + PAGESIZE - 1) / PAGESIZE;
  225.          Pool*  pool = newPool(npages);
  226.  
  227. -        if (!pool || pool.extendPages(npages) == OPFAIL)
  228. +        if (!pool)
  229.              return 0;
  230. -        return pool.ncommitted * PAGESIZE;
  231. +        return pool.npages * PAGESIZE;
  232.      }
  233.  
  234.  
  235. @@ -1825,18 +1809,16 @@ struct Gcx
  236.          size_t n;
  237.          size_t pn;
  238.          Pool*  pool;
  239. -        size_t ncommitted;
  240.  
  241.          for (n = 0; n < npools; n++)
  242.          {
  243.              pool = pooltable[n];
  244. -            ncommitted = pool.ncommitted;
  245. -            for (pn = 0; pn < ncommitted; pn++)
  246. +            for (pn = 0; pn < pool.npages; pn++)
  247.              {
  248.                  if (cast(Bins)pool.pagetable[pn] != B_FREE)
  249.                      break;
  250.              }
  251. -            if (pn < ncommitted)
  252. +            if (pn < pool.npages)
  253.              {
  254.                  n++;
  255.                  continue;
  256. @@ -1952,9 +1934,6 @@ struct Gcx
  257.  
  258.          //debug(PRINTF) printf("************Gcx::newPool(npages = %d)****************\n", npages);
  259.  
  260. -        // Round up to COMMITSIZE pages
  261. -        npages = (npages + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1);
  262. -
  263.          // Minimum of POOLSIZE
  264.          if (npages < POOLSIZE/PAGESIZE)
  265.              npages = POOLSIZE/PAGESIZE;
  266. @@ -2101,7 +2080,7 @@ struct Gcx
  267.                      }
  268.                      else
  269.                      {
  270. -                        // Don't mark bits in B_FREE or B_UNCOMMITTED pages
  271. +                        // Don't mark bits in B_FREE pages
  272.                          continue;
  273.                      }
  274.  
  275. @@ -2345,7 +2324,7 @@ struct Gcx
  276.                                      pn--;
  277.                              }
  278.                              u = 1;
  279. -                            while (pn + u < pool.ncommitted && pool.pagetable[pn + u] == B_PAGEPLUS)
  280. +                            while (pn + u < pool.npages && pool.pagetable[pn + u] == B_PAGEPLUS)
  281.                                  u++;
  282.                              mark(o, o + u * PAGESIZE);
  283.                          }
  284. @@ -2362,13 +2341,11 @@ struct Gcx
  285.          size_t freed = 0;
  286.          for (n = 0; n < npools; n++)
  287.          {   size_t pn;
  288. -            size_t ncommitted;
  289.              uint*  bbase;
  290.  
  291.              pool = pooltable[n];
  292.              bbase = pool.mark.base();
  293. -            ncommitted = pool.ncommitted;
  294. -            for (pn = 0; pn < ncommitted; pn++, bbase += PAGESIZE / (32 * 16))
  295. +            for (pn = 0; pn < pool.npages; pn++, bbase += PAGESIZE / (32 * 16))
  296.              {
  297.                  Bins bin = cast(Bins)pool.pagetable[pn];
  298.  
  299. @@ -2445,7 +2422,7 @@ struct Gcx
  300.                          pool.pagetable[pn] = B_FREE;
  301.                          freedpages++;
  302.                          debug (MEMSTOMP) .memset(p, 0xF3, PAGESIZE);
  303. -                        while (pn + 1 < ncommitted && pool.pagetable[pn + 1] == B_PAGEPLUS)
  304. +                        while (pn + 1 < pool.npages && pool.pagetable[pn + 1] == B_PAGEPLUS)
  305.                          {
  306.                              pn++;
  307.                              pool.pagetable[pn] = B_FREE;
  308. @@ -2469,11 +2446,9 @@ struct Gcx
  309.          size_t recoveredpages = 0;
  310.          for (n = 0; n < npools; n++)
  311.          {   size_t pn;
  312. -            size_t ncommitted;
  313.  
  314.              pool = pooltable[n];
  315. -            ncommitted = pool.ncommitted;
  316. -            for (pn = 0; pn < ncommitted; pn++)
  317. +            for (pn = 0; pn < pool.npages; pn++)
  318.              {
  319.                  Bins   bin = cast(Bins)pool.pagetable[pn];
  320.                  size_t biti;
  321. @@ -2740,7 +2715,6 @@ struct Pool
  322.      GCBits noscan;      // entries that should not be scanned
  323.  
  324.      size_t npages;
  325. -    size_t ncommitted;    // ncommitted <= npages
  326.      ubyte* pagetable;
  327.  
  328.  
  329. @@ -2775,10 +2749,9 @@ struct Pool
  330.          pagetable = cast(ubyte*) .malloc(npages);
  331.          if (!pagetable)
  332.              onOutOfMemoryError();
  333. -        .memset(pagetable, B_UNCOMMITTED, npages);
  334. +       .memset(pagetable, B_FREE, npages);
  335.  
  336.          this.npages = npages;
  337. -        ncommitted = 0;
  338.      }
  339.  
  340.  
  341. @@ -2788,13 +2761,6 @@ struct Pool
  342.          {
  343.              int result;
  344.  
  345. -            if (ncommitted)
  346. -            {
  347. -                result = os_mem_decommit(baseAddr, 0, ncommitted * PAGESIZE);
  348. -                assert(result);
  349. -                ncommitted = 0;
  350. -            }
  351. -
  352.              if (npages)
  353.              {
  354.                  result = os_mem_unmap(baseAddr, npages * PAGESIZE);
  355. @@ -2832,7 +2798,6 @@ struct Pool
  356.              //if (baseAddr + npages * PAGESIZE != topAddr)
  357.                  //printf("baseAddr = %p, npages = %d, topAddr = %p\n", baseAddr, npages, topAddr);
  358.              assert(baseAddr + npages * PAGESIZE == topAddr);
  359. -            assert(ncommitted <= npages);
  360.          }
  361.  
  362.          for (size_t i = 0; i < npages; i++)
  363. @@ -2854,7 +2819,7 @@ struct Pool
  364.  
  365.          //debug(PRINTF) printf("Pool::allocPages(n = %d)\n", n);
  366.          n2 = n;
  367. -        for (i = 0; i < ncommitted; i++)
  368. +        for (i = 0; i < npages; i++)
  369.          {
  370.              if (pagetable[i] == B_FREE)
  371.              {
  372. @@ -2866,39 +2831,6 @@ struct Pool
  373.              else
  374.                  n2 = n;
  375.          }
  376. -        return extendPages(n);
  377. -    }
  378. -
  379. -    /**
  380. -     * Extend Pool by n pages.
  381. -     * Returns OPFAIL on failure.
  382. -     */
  383. -    size_t extendPages(size_t n)
  384. -    {
  385. -        //debug(PRINTF) printf("Pool::extendPages(n = %d)\n", n);
  386. -        if (ncommitted + n <= npages)
  387. -        {
  388. -            size_t tocommit;
  389. -
  390. -            tocommit = (n + (COMMITSIZE/PAGESIZE) - 1) & ~(COMMITSIZE/PAGESIZE - 1);
  391. -            if (ncommitted + tocommit > npages)
  392. -                tocommit = npages - ncommitted;
  393. -            //debug(PRINTF) printf("\tlooking to commit %d more pages\n", tocommit);
  394. -            //fflush(stdout);
  395. -            if (os_mem_commit(baseAddr, ncommitted * PAGESIZE, tocommit * PAGESIZE))
  396. -            {
  397. -                .memset(pagetable + ncommitted, B_FREE, tocommit);
  398. -                auto i = ncommitted;
  399. -                ncommitted += tocommit;
  400. -
  401. -                while (i && pagetable[i - 1] == B_FREE)
  402. -                    i--;
  403. -
  404. -                return i;
  405. -            }
  406. -            //debug(PRINTF) printf("\tfailed to commit %d pages\n", tocommit);
  407. -        }
  408. -
  409.          return OPFAIL;
  410.      }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top