author | Camm Maguire <camm@debian.org> | 2015年02月25日 11:59:13 -0500 |
---|---|---|
committer | Camm Maguire <camm@debian.org> | 2015年02月25日 11:59:13 -0500 |
commit | 8572dd54e4e2027b830cbe2f99925ba7e9a87347 (patch) | |
tree | eb8faf42a815374d155f0497658fc9d2652bdbc9 | |
parent | dbce17edef318e3af2861ff9c932b309a58960fd (diff) | |
download | gcl-scale_to_free_phys.tar.gz |
-rw-r--r-- | gcl/o/alloc.c | 26 |
diff --git a/gcl/o/alloc.c b/gcl/o/alloc.c index 70de57235..8f8be4305 100644 --- a/gcl/o/alloc.c +++ b/gcl/o/alloc.c @@ -425,12 +425,30 @@ rebalance_maxpages(struct typemanager *my_tm,fixnum z) { if (j+d>phys_pages) { + ufixnum k=0; + for (i=t_start;i<t_other;i++) - if (tm_table[i].tm_npage && tm_table[i].tm_npage>((double)phys_pages/(j+d))*(tm_table+i==my_tm ? z : tm_table[i].tm_maxpage)) - return 0; + if (tm_table+i!=my_tm) + k+=(tm_table[i].tm_maxpage-tm_table[i].tm_npage)*(i==t_relocatable ? 2 : 1); + + if (k<(j+d-phys_pages)) + return 0; + for (i=t_start;i<t_other;i++) - if (tm_table[i].tm_npage) - massert(set_tm_maxpage(tm_table+i,((double)phys_pages/(j+d))*(tm_table+i==my_tm ? z : tm_table[i].tm_maxpage))); + if (tm_table[i].tm_npage) { + if (tm_table+i==my_tm) { + massert(set_tm_maxpage(tm_table+i,z)); + } else { + massert(set_tm_maxpage(tm_table+i,tm_table[i].tm_npage+(1.0-(double)(j+d-phys_pages)/k)*(tm_table[i].tm_maxpage-tm_table[i].tm_npage))); + } + } + + /* for (i=t_start;i<t_other;i++) */ + /* if (tm_table[i].tm_npage && tm_table[i].tm_npage>((double)phys_pages/(j+d))*(tm_table+i==my_tm ? z : tm_table[i].tm_maxpage)) */ + /* return 0; */ + /* for (i=t_start;i<t_other;i++) */ + /* if (tm_table[i].tm_npage) */ + /* massert(set_tm_maxpage(tm_table+i,((double)phys_pages/(j+d))*(tm_table+i==my_tm ? z : tm_table[i].tm_maxpage))); */ return 1; |