[Issue 150] std.gc.minimize doesn't minimize physical memory usage
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Aug 15 17:56:17 PDT 2010
http://d.puremagic.com/issues/show_bug.cgi?id=150
Leandro Lucarella <llucax at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |patch
CC| |llucax at gmail.com
Version|0.157 |D1
--- Comment #2 from Leandro Lucarella <llucax at gmail.com> 2010-08-15 17:56:13 PDT ---
This is fixed in D2 and here is a patch based on druntime for Phobos 1:
--- gcx.orig.d 2010-08-15 21:42:21.837000089 -0300
+++ gcx.new.d 2010-08-15 21:52:24.319000075 -0300
@@ -1038,7 +1038,10 @@ class GC
void minimize() // minimize physical memory usage
{
- // Not implemented, ignore
+ synchronized (gcLock)
+ {
+ gcx.minimize();
+ }
}
void setFinalizer(void *p, GC_FINALIZER pFn)
@@ -2252,6 +2255,39 @@ struct Gcx
}
+ /**
+ * Minimizes physical memory usage by returning free pools to the OS.
+ */
+ void minimize()
+ {
+ size_t n;
+ size_t pn;
+ Pool* pool;
+ size_t ncommitted;
+
+ for (n = 0; n < npools; n++)
+ {
+ pool = pooltable[n];
+ ncommitted = pool.ncommitted;
+ for (pn = 0; pn < ncommitted; pn++)
+ {
+ if (cast(Bins)pool.pagetable[pn] != B_FREE)
+ break;
+ }
+ if (pn < ncommitted)
+ continue;
+ pool.Dtor();
+ cstdlib.free(pool);
+ memmove(pooltable + n,
+ pooltable + n + 1,
+ (--npools - n) * (Pool*).sizeof);
+ n--;
+ }
+ minAddr = pooltable[0].baseAddr;
+ maxAddr = pooltable[npools - 1].topAddr;
+ }
+
+
/**
* Run finalizer on p when it is free'd.
*/
It might be probably a good idea to call minimize() after fullcollect() too.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list